当前位置: 首页 > news >正文

微信小程序抓包实战:Charles与Burp组合配置与深度调试

1. 为什么微信小程序抓包这么难,又为什么非得用 Charles + bp 组合

“微信小程序抓包”这六个字,在前端、测试、安全、逆向工程师的日常沟通里,几乎等同于一个隐性技术门槛的代名词。不是没人试过,而是试过的人十有八九会在三小时内经历:Fiddler 抓不到任何请求、Wireshark 看到一堆 TLSv1.3 加密流、浏览器开发者工具里连 network 面板都灰掉——更别提那些刚点开小程序就弹出“网络异常”的诡异报错。我第一次接手某电商小程序的接口联调时,后端改了个字段名,前端死活收不到响应,本地 mock 完全正常,但真机环境就是 400,翻遍 console 和 network 面板一无所获。最后靠在手机上反复切后台/前台,配合日志埋点才定位到是某个 SDK 的 token 刷新逻辑在静默状态下失败了。这种“看不见的通信”,才是真实痛点。

核心难点不在工具本身,而在于微信客户端的三层防御机制:运行沙箱隔离(小程序代码不跑在 WebView,而是独立 JSCore + Native Bridge)、HTTPS 强制加密(所有 wx.request 默认走 TLS,且证书校验严格)、代理自动绕过(微信内置网络栈会主动检测并屏蔽已知代理服务器,包括 localhost:8888)。这意味着,你不能像调试网页那样直接打开 DevTools;也不能像抓 App 那样简单设置系统代理——微信会直接拒绝连接,甚至降级为 HTTP 请求失败。这时候,Charles + bp(Burp Suite)组合的价值就凸显出来了:它不是“替代”微信的网络栈,而是在微信发起请求前一刻,把流量“劫持”进可控的中间层。Charles 负责稳定可靠的 HTTPS 解密与可视化分析,bp 则提供更精细的重放、爆破、插件扩展能力。二者不是二选一,而是分工明确——Charles 是你的“交通监控摄像头”,bp 是你的“信号干扰器+信号分析仪”。这个组合特别适合需要深度分析请求构造逻辑、复现偶发性接口异常、或验证小程序是否偷偷上传了不该传的数据的场景。如果你只是想看一眼某个按钮点击后发了什么请求,那 Charles 单独就够;但如果你要修改请求体触发特定业务分支、测试越权访问、或者分析某个加密参数的生成规律,bp 就成了不可替代的搭档。

2. Charles 的配置不是点几下就完事:证书、代理、SSL 解密的完整闭环

很多人装完 Charles 就卡在第一步:手机连上 Wi-Fi 后,设置手动代理指向电脑 IP 和 8888 端口,结果微信里一片空白。这不是 Charles 不行,而是整个 SSL 解密链路里漏掉了最关键的一环——设备端根证书信任。微信的 HTTPS 校验不是只看域名匹配,它还会校验证书链是否由系统信任的 CA 签发。而 Charles 的证书是自签名的,手机默认根本不认。所以,必须让手机“亲手”安装并信任 Charles 的证书,这个过程远比在电脑上点“Help → SSL Proxying → Install Charles Root Certificate”复杂得多。

2.1 手机端证书安装的实操细节与常见陷阱

首先,确保你的手机和电脑在同一局域网。在 Charles 中,顶部菜单栏选择Proxy → macOS Proxy Settings(Windows 是 Windows Proxy Settings),确认“Enable transparent HTTP proxying”已勾选,端口为 8888。然后,关键一步:不要直接用 Safari 打开 chls.pro/ssl。iOS 15+ 和 Android 12+ 对自签名证书的安装流程做了大幅收紧。正确做法是:在手机 Safari 中输入http://<你的电脑IP>:8888(注意是 http,不是 https),页面会自动跳转到 Charles 的欢迎页,底部有 “Install Charles Root Certificate on this iOS device” 按钮。点击后,系统会提示“下载描述文件”,下载完成后,必须进入设置 → 已下载描述文件 → 安装,输入锁屏密码,安装完毕后,还必须手动开启信任:设置 → 关于本机 → 证书信任设置 → 找到 “Charles Proxy CA” → 开启“完全信任”。Android 端类似,但路径略有不同:设置 → 安全 → 加密与凭据 → 从存储设备安装 → 选择下载的 .cer 文件 → 设置名称(如 Charles)→ 安装。这里有个极易被忽略的坑:某些国产安卓 ROM(如 MIUI、ColorOS)会把“用户证书”和“系统证书”分开管理,即使你安装成功,微信依然可能拒绝连接。解决办法是:在 Charles 的 Proxy → SSL Proxying Settings 中,勾选 “Enable SSL Proxying”,然后在下方的 “Locations” 列表中,手动添加微信域名*.wechat.com*.qq.com*.tencent.com*.weixin.qq.com,并确保状态为 Enabled。这是因为微信底层 SDK 很多请求实际发往腾讯系其他域名,只配*.wechat.com是远远不够的。

2.2 微信客户端的特殊代理策略与绕过方案

即使证书装好了,你依然可能看到 Charles 里只有零星几个 DNS 查询,没有一条 HTTP 请求。这是因为微信客户端内置了一套“智能代理规避”逻辑:它会定期探测代理服务器的响应特征。如果 Charles 返回的响应头里带有Proxy-Connection: keep-aliveVia: 1.1 Charles这类明显标识,微信会立刻判定为代理环境并切断连接。解决方案有两个,且必须同时启用:第一,在 Charles 中,Proxy → Proxy Settings → SSL Proxying Settings → 勾选 “Enable SSL Proxying”;第二,也是最关键的,Proxy → SSL Proxying Settings → 勾选 “Enable SSL Proxying for all hosts”,然后在下方 “Excluded SSL Hosts” 列表里,手动添加*.apple.com*.google.com*.microsoft.com等无关域名(目的是减少 Charles 的解密压力,避免误伤系统更新)。但这还不够。真正起作用的是 Charles 的 “Map Remote” 功能:右键任意一条已捕获的请求 → “Map Remote…” → 在弹出窗口中,“Remote host” 填weixin.qq.com,“Remote port” 填443,“Local path” 留空,“Use secure connection (HTTPS)” 勾选。这样做的原理是:微信发往weixin.qq.com的请求,会被 Charles 主动“伪装”成直连,绕过其代理检测逻辑,而其他子域名(如api.mall.wechat.com)则正常走解密流程。我实测下来,这个组合配置能让微信小程序的请求捕获率从不足 20% 提升到 95% 以上。

2.3 SSL 解密失败的典型错误码与排查路径

当你看到 Charles 里某条请求显示为 “Failed to connect to remote host” 或 “SSL handshake failed”,别急着重装证书。先看这条请求的 “Notes” 标签页,里面会明确写出失败原因。最常见的三种情况:一是 “Certificate not trusted by client”,说明手机端证书没装好或没开启完全信任;二是 “Connection refused by remote server”,说明目标服务器(比如小程序后端)关闭了 443 端口或防火墙拦截;三是 “SSL protocol error”,这往往意味着微信客户端版本太新,内置的 TLS 版本(如 TLS 1.3)与 Charles 当前版本不兼容。解决后者的方法是:在 Charles 的 Proxy → SSL Proxying Settings → 取消勾选 “Use TLS 1.3 for SSL proxying”,强制降级到 TLS 1.2。另外,一个隐藏技巧是:在 Charles 的 Help → SSL Proxying → Install Charles Root Certificate in Windows/macOS 里,把证书导出为.pem格式,然后用 OpenSSL 命令检查其有效期和签名算法:openssl x509 -in charles.pem -text -noout | grep -E "(Validity|Signature Algorithm)"。如果看到Signature Algorithm: sha1WithRSAEncryption,说明这是 SHA-1 签名,而 iOS 13+ 已彻底废弃 SHA-1,必须在 Charles 中重新生成证书:Help → SSL Proxying → Reset Charles Root Certificate。这个细节,文档里从不提,但能帮你省下三小时排查时间。

3. bp 的价值不在“抓包”,而在“干预”:如何用 bp 重放、修改、爆破小程序请求

Charles 是个优秀的“观察者”,而 bp 是个合格的“参与者”。当你需要验证一个接口是否真的存在越权漏洞,或者想测试某个加密参数少传一位会返回什么错误码,Charles 只能让你“看”,bp 却能让你“做”。但直接把 bp 当作 Charles 的平替来用,是最大的误区。bp 的强项在于它的Repeater(重放器)Intruder(入侵器)Extender(扩展器)三大模块,它们共同构成了一个完整的“请求干预流水线”。

3.1 Repeater 模块:不只是重放,更是参数调试的精密手术刀

假设你在 Charles 里发现了一个关键请求:POST https://api.mall.wechat.com/v1/order/create,Body 是 JSON 格式,包含userIdproductIdtoken三个字段。你想验证token是否可以被篡改,但直接在 Charles 里编辑再发送,会因为缺少Content-Length头或签名失效而失败。这时,把这条请求拖拽到 bp 的 Repeater 标签页,就进入了真正的调试空间。Repeater 的优势在于:它会自动计算并更新Content-Length,支持对任意字段进行快速修改、编码/解码(右键字段 → “Send to Repeater” 后,选中值 → Ctrl+U 可 URL 编码,Ctrl+Shift+U 可 URL 解码),更重要的是,它支持“Compare” 功能:发送两次不同参数的请求,右键任一响应 → “Do comparison”,bp 会高亮显示两个响应体的差异。我曾用这个功能快速定位到一个支付接口的风控逻辑——当productId为负数时,响应体里会多出一段"risk_level":"high"的字段,而正常请求里没有。这种细微差异,在 Charles 的原始视图里根本无法肉眼识别。另一个实用技巧是:在 Repeater 的 Request 编辑区,按 Ctrl+I 可以插入常用 payload,比如{{randomInt}}会生成随机整数,{{time}}会插入当前时间戳,这对测试时间敏感型接口(如限时抢购)极其高效。

3.2 Intruder 模块:自动化爆破的底层逻辑与安全边界

Intruder 不是暴力破解工具,而是一个高度可配置的“参数变量引擎”。它的核心是Payloads(载荷)Attack Type(攻击类型)。以测试小程序登录接口的弱口令为例:目标 URL 是POST https://login.wechat.com/v2/login,Body 包含usernamepassword。在 bp 中,先将请求发送到 Intruder,然后在 Positions 标签页,用§符号标记你要爆破的字段位置,比如{"username":"§admin§","password":"§123456§"}。接着切换到 Payloads 标签页,为第一个§选择 “Simple list”,导入一个用户名字典(如admin, root, test);为第二个§选择 “Runtime-generated”,设置 Generator type 为 “Numbers”,From 为1000,To 为9999,Step 为1。最后,选择 Attack Type 为 “Cluster bomb”,这意味着它会将两个载荷列表进行笛卡尔积组合,总共尝试3 * 9000 = 27000次请求。但请注意:微信小程序的登录接口必然有图形验证码或滑动验证,直接爆破毫无意义。Intruder 的真正价值在于业务逻辑测试。比如,测试一个商品详情页的GET /product/detail?id=123接口,你可以把id字段设为载荷,导入一个从 1 到 1000 的数字列表,然后观察哪些 ID 返回404,哪些返回200data.status == "sold_out",从而反推出商品库存的实时状态。这种“合法范围内的自动化探测”,才是 Intruder 在小程序场景下的正道。

3.3 Extender 模块:用 Python 插件实现定制化请求处理

bp 的终极能力在于 Extender,它允许你用 Python(Jython)编写插件,接管请求/响应的每一个环节。比如,小程序的很多请求体都包含一个sign字段,它是对其他所有参数按字典序拼接后,用固定密钥 MD5 加密生成的。每次手动计算 sign 并修改请求,效率极低。这时,你可以写一个简单的 bp 插件:在 Extender → BApp Store 里搜索 “Request Editor”,安装后,它会在请求编辑区增加一个“Sign”按钮。点击后,插件会自动读取当前请求的所有参数,按规则排序、拼接、MD5,然后填入sign字段。这个插件的核心逻辑只有十几行 Python:

from burp import IBurpExtender, IHttpListener import hashlib import urllib.parse class BurpExtender(IBurpExtender, IHttpListener): def registerExtenderCallbacks(self, callbacks): self._callbacks = callbacks self._helpers = callbacks.getHelpers() callbacks.setExtensionName("WeChat Sign AutoFill") callbacks.registerHttpListener(self) def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo): if toolFlag == self._callbacks.TOOL_REPEATER and messageIsRequest: request = messageInfo.getRequest() # 解析 body 参数 body = self._helpers.bytesToString(request[self._helpers.analyzeRequest(request).getBodyOffset():]) params = dict(urllib.parse.parse_qsl(body)) # 按 key 排序拼接 sorted_keys = sorted(params.keys()) str_to_sign = "&".join([f"{k}={params[k]}" for k in sorted_keys]) # 计算 sign sign = hashlib.md5((str_to_sign + "your_secret_key").encode()).hexdigest() # 替换 body 中的 sign 字段 new_body = body.replace("sign=", f"sign={sign}") # 构造新 request new_request = self._helpers.buildHttpMessage( self._helpers.analyzeRequest(request).getHeaders(), self._helpers.stringToBytes(new_body) ) messageInfo.setRequest(new_request)

这段代码不是拿来即用的,但它揭示了一个关键事实:bp 的强大,不在于它预置了多少功能,而在于它为你开放了整个请求生命周期的控制权。只要你理解了小程序的加签/验签逻辑,就能用几行代码把它自动化。这是我踩过最多坑后总结的经验:不要试图用 bp 去“破解”微信,而是用 bp 去“理解”你的小程序。当你能用插件自动处理所有加签,你就已经站在了调试效率的制高点。

4. 实战避坑指南:从“抓到包”到“读懂业务”的完整排查链路

抓包成功的那一刻,往往只是真正工作的开始。我见过太多人,在 Charles 里看到密密麻麻的请求,却不知道该从哪一条入手;也见过有人,把所有请求都导出为 HAR 文件,用脚本批量分析,结果发现 90% 的请求都是无意义的埋点上报。有效的抓包,必须服务于明确的业务目标。下面,我以一个真实的案例——“小程序首页加载缓慢,用户反馈白屏时间超过 5 秒”——来还原一次完整的、从抓包到定位的排查链路。这个过程,比单纯罗列工具配置更有价值。

4.1 锁定问题域:用时间轴过滤无效噪音

打开 Charles,先清空所有历史请求(Cmd+K),然后在小程序里复现问题:从冷启动开始,点击图标,等待白屏结束,进入首页。停止抓包后,你会看到几百条请求。此时,绝对不要从头开始看。第一步,是利用 Charles 的 “Timeline” 视图(View → Timeline)。这个视图会把所有请求按发起时间横向排列,每条请求是一个色块,长度代表耗时。把鼠标悬停在最上方的长色块上,你会发现,它大概率是https://res.wx.qq.com/.../app.jshttps://res.wx.qq.com/.../common.js这类资源。这些是微信基础库,加载慢通常意味着用户网络差,不是小程序自身问题。真正要关注的,是那些在app.js加载完成之后,才开始发起的、耗时超过 1000ms 的请求。在 Timeline 上,按住 Shift 键,框选app.js加载完成时间点之后的所有请求,然后右键 → “Focus on selected requests”。这时,Charles 的主窗口就只显示这一小段时间内的请求了,数量锐减到 20 条以内。这是一个非常关键的过滤动作,它把问题域从“整个小程序生命周期”缩小到了“首页首屏渲染阶段”。

4.2 定位瓶颈请求:从状态码、耗时、响应体三维度交叉验证

聚焦后的 20 条请求里,我们逐条分析。首先看状态码:200是正常的,304是缓存命中,可以忽略;但如果有401403,说明鉴权失败,可能是 token 过期导致首页数据拉取中断,这就是根因。其次看耗时:Charles 的 “Time” 列显示的是总耗时,但真正影响首屏的是 “Latency”(服务端处理时间)和 “Transfer”(网络传输时间)的和。如果某条请求的 Latency 超过 2000ms,基本可以断定是后端接口性能问题。最后看响应体:在 Response 标签页,切换到 “Pretty” 模式,快速浏览 JSON 结构。如果响应体里有"code":500"message":"timeout",那就是后端抛出了异常。我遇到过一个典型案例:首页轮播图接口GET /banner/list响应体里,"data"字段为空数组,但状态码是200。这看起来没问题,但继续往下看,发现紧接着的GET /product/recommend接口,返回了502 Bad Gateway。原来,轮播图接口的空响应,触发了小程序前端的一个未捕获异常,导致后续所有推荐接口的请求被阻塞。这个逻辑,在代码里很难一眼看出,但在抓包的时间轴上,两条请求的发起时间间隔为 0ms,就暴露了前端的同步阻塞问题。

4.3 验证与复现:用 bp 的 Repeater 精准复现问题场景

一旦锁定可疑请求,下一步就是脱离小程序环境,单独验证。把GET /product/recommend请求拖到 bp 的 Repeater,点击 “Go”。如果 bp 里也返回502,说明问题确实在服务端。但如果 bp 里返回200,那问题就出在小程序客户端。这时,你需要检查请求头。在 Repeater 的 Request 编辑区,对比小程序发出的原始请求头和 bp 发出的请求头。重点看User-AgentX-WX-KEYAuthorization这几个字段。微信小程序的User-Agent是固定的,形如Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.40(0x18002833) NetType/WIFI Language/zh_CN。如果 bp 发送时没带上这个 UA,某些后端网关会直接拒绝。解决方案是:在 Repeater 的 Headers 区域,手动添加一行User-Agent: <上面的完整字符串>。另一个常见问题是X-WX-KEY,这是微信分配给小程序的唯一标识,后端用它来路由到正确的业务集群。如果这个 header 缺失或错误,网关就会返回502。所以,在 Repeater 里复现问题,不是简单地复制 URL,而是要完整复制所有关键请求头。这一步做完,你就能 100% 确认,问题到底是出在服务端、网关,还是小程序自身的请求构造逻辑上。

4.4 举一反三:从单点问题到系统性优化建议

解决了首页白屏,排查并没有结束。你应该回过头,看看这次抓包过程中,还有哪些可以优化的点。比如,我发现GET /user/profileGET /user/address这两个接口,是串行发起的,前者耗时 800ms,后者耗时 600ms,总耗时 1400ms。而它们的数据在首页并不需要同时展示——用户头像和昵称(来自 profile)在顶部,收货地址(来自 address)在底部。完全可以改成并行请求。再比如,所有接口的Accept-Encoding头都设置为gzip, deflate,但后端返回的响应体大小平均为 120KB,完全没有压缩。这说明后端 Nginx 的 gzip 配置可能没生效,或者压缩级别太低。这些发现,单靠看代码 review 是很难注意到的,但抓包提供了最真实的线上运行视角。我的经验是:每一次抓包排查,都应该产出一份《接口健康度报告》,包含:各接口平均耗时、P95 耗时、错误率、响应体大小、是否启用压缩、关键请求头是否完备。这份报告,比任何架构图都更能反映小程序的真实性能水位。它不是给老板看的 PPT,而是给开发、测试、运维团队的一份可执行的优化清单。

5. 最后分享一个小技巧:如何用 Charles 的 “Breakpoints” 功能动态修改请求

在绝大多数场景下,你只需要“看”和“重放”。但有些时候,你需要在请求发出的“最后一刻”,动态地、临时地修改它,比如绕过某个前端校验,或者注入一个调试用的 header。Charles 的 Breakpoints 功能,就是为此而生的。它不像 bp 的 Repeater 那样需要手动拖拽,而是像 Chrome DevTools 的 XHR 断点一样,在请求到达服务器前,把它“暂停”下来,让你有 30 秒时间编辑。

5.1 Breakpoints 的启用与精准匹配

启用方式很简单:在 Charles 中,顶部菜单栏选择Proxy → Breakpoint Settings。在弹出的窗口里,点击左下角的 “Add” 按钮。在 “Location” 输入框里,填写你要拦截的 URL 模式。这里的关键是“模式”的写法。如果你想拦截所有/api/开头的请求,就填*/api/*;如果只想拦截POST /order/create,就填*/order/create,并在右侧的 “Method” 下拉框里选择 “POST”。填完后,勾选这一条规则,点击 OK。这时,当你在小程序里触发对应请求时,Charles 的主界面会变成灰色,并在底部状态栏显示 “Breakpoint hit on POST /order/create”。点击 “Edit Request”,你就可以在弹出的编辑窗口里,随意修改 URL、Method、Headers、Body。修改完成后,点击 “Execute” 按钮,请求才会真正发出去。这个功能最强大的地方在于:它不会改变你原本的抓包配置,也不会影响其他请求,是一次性的、上下文隔离的调试。

5.2 一个真实的应用场景:绕过前端的防重复提交限制

小程序下单时,前端通常会加一层“防止重复点击”的逻辑,比如按钮点击后置灰,或者在请求体里加一个timestamp字段,后端会校验这个时间戳是否在 5 分钟内。但测试时,你想快速连续点击三次,看后端幂等性是否生效。这时,Breakpoints 就派上用场了。在 Breakpoint Settings 里,添加一条规则:*/order/create,Method 为 POST。然后在小程序里点击下单,请求被拦住。在 Edit Request 窗口的 Body 区域,把"timestamp":1715678900改成"timestamp":1715678901,再点 Execute。重复三次,每次改一个不同的 timestamp。这样,你就在不修改任何前端代码的情况下,完成了对后端幂等逻辑的完整测试。这个技巧,比改前端代码、重新编译、再上传体验版,快了至少 20 分钟。而且,它只在你当前的调试会话中生效,不会污染生产环境。

5.3 注意事项:Breakpoints 的副作用与退出机制

使用 Breakpoints 有一个必须牢记的注意事项:它会阻塞整个请求链路。如果你拦截的是一个关键的基础接口(比如GET /config),而你又忘了点 “Execute”,那么小程序的整个初始化流程就会卡死,表现为长时间白屏。所以,我养成的习惯是:每次启用 Breakpoint 前,先在 Charles 的 “Sequence” 视图里,确认这个请求不是串行链路上的第一环;启用后,如果 10 秒内没看到预期的拦截提示,立刻去 Proxy → Breakpoint Settings 里,取消勾选当前规则,避免误伤。另外,Breakpoints 是全局生效的,即使你关闭了 Charles,只要规则还在,下次启动时它依然会拦截。所以,调试结束后,务必记得回到 Breakpoint Settings,把临时添加的规则删掉,或者取消勾选。这个小习惯,能帮你避免无数次莫名其妙的“小程序打不开”问题。

http://www.jsqmd.com/news/882118/

相关文章:

  • 嵌入式多核平台任务分配优化与能耗控制实践
  • OpenHarmony Next与Unity团结引擎环境搭建实战指南
  • 机器学习原子间势能:原理、实战与通用模型选型指南
  • 强化学习硬件加速:QForce-RL量化技术解析
  • DnCNN与DDPM在焊缝超声检测去噪中的原理对比与工程实践
  • 融合机器学习与网络分析:实战解析社交媒体影响力测量框架
  • 真实SRC渗透复盘:从JS校验绕过到密钥泄露的全链路分析
  • x64dbg下载安装与实战调试入门指南
  • 告别TeamViewer:用这3款免费替代软件前,先按这个清单彻底清理Windows
  • 利用窄带测光与机器学习高效筛选星系巨星成员
  • 2026年实测5款免费降ai率工具:高效降低ai率,论文降aigc必备,省时又省力! - 降AI实验室
  • 2026年4月靠谱的防水公司推荐,地下室防水补漏/墙砖空鼓维修/房屋维修/阳台防水补漏/厂房防水补漏,防水服务公司选哪家 - 品牌推荐师
  • 《广东光伏哪家好:排名前五 专业深度测评》 - 服务品牌热点
  • Vision Transformer在径向速度法系外行星探测中的应用与实现
  • 别再死磕光线追踪了!用Unity Shader Graph 5分钟搞定皮肤/玉石SSS次表面散射效果
  • Windows Subsystem for Android深度技术解析:开发者视角的跨平台集成方案
  • Keil C166中xhuge指针与内存模型问题解决方案
  • Unity在Ubuntu上播放本地视频踩坑记:从‘路径无效’到‘编码转换’的完整解决流程
  • FSM-DQN混合控制:仿蚁群机器人集群去中心化空间分离策略
  • 【问题】IDEA import导入的类明明存在却报异常飘红
  • Comba架构:基于双线性RNN的高效序列建模新方法
  • 2026年4月TD6-140钢扣板实力厂家推荐,钢楼承板/压型钢板/钢结构楼承板/镀锌楼承板,钢扣板企业选哪家 - 品牌推荐师
  • Godot逆向工具链:PCK解包与GDScript反编译实战指南
  • Unity ASW风格格斗Shader实战:描边、阴影与受击反馈系统
  • Unity项目发布踩坑记:从Mono切换到IL2CPP,我解决了哪些环境配置问题?
  • 电梯定位新思路:融合物理模型与机器学习,实现高精度连续位置追踪
  • git的使用技巧汇总
  • SLED框架:边缘计算中的LLM推理加速方案
  • 告别黑屏和进度条卡住:深度排查Unity WebGL在360、Chrome等浏览器的兼容性问题
  • 量子机器学习与参数化量子电路的创新突破