文章总结: 文档详细介绍了微信小程序逆向调试方法,针对4.0以下版本通过CE修改内存绕过登录限制并注入JSRPC代码Hook加密函数;针对4.0以上版本则利用WMPFDebugger工具开启DevTools。文章提供了具体的内存地址、操作步骤及代码示例,指出不同版本下Socket通信的兼容性差异,为小程序安全测试提供了可落地的技术方案。 综合评分: 83 文章分类: 逆向分析,安全工具,渗透测试,WEB安全
WX小程序逆向
原创
不知名菜鸟%% 不知名菜鸟%%
尽力局JU长
2026年3月8日 23:39 广西
声明:本次测试,纯以学习为主,另外:由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者负责!
笔者在某次测试微信小程序时发现,小于4.0版本以下的WX已经不能使用,经过一番查资料折腾,终于搞掂小于4.0版本以下可以登录,但封号风险自担哈!
同时也找到一个4.0版本以上的开启devtools的方法
WX4.0版本以下登录及开启devtools
wx: 3.9.10.19: 0x63090a13 4.1.5.16: 0xf254171e
使用CE修改微信登录时内存的版本号
如图打开WX,勾选十六进制,输入数值:63090a13,如下图
点击扫描,结果会呈现五或者六个显示绿色的值,全部选中,然后修改其数字,如下图
修改完后,扫描第一次会出现如下图所示,然后再扫描一次就可以登录了
登录完成后开启devtools,首先注入代码;打断点调试,先全局声明,加密函数用到的全局变量以及wx变量,如下图
然后,放开断点,启动jsrpc服务端,在console注入wx-jsrpc代码,启动客户端,如下图所示
代码可以参考:https://github.com/jxhczhl/JsRpc
代码如下
function createRpcCS(wsURL) { let rpc_client_id = wx.getStorageSync('rpc_client_id'); let socket = null; const handlers = {};
if (rpc_client_id && wsURL.indexOf("clientId=") === -1) { wsURL += "&clientId=" + rpc_client_id; }
function connect() { console.log("开始连接:", wsURL); socket = wx.connectSocket({ url: wsURL, success() { console.log("连接成功"); }, fail(err) { console.error("连接失败:", err); reconnect(); } });
wx.onSocketOpen(() => console.log("Socket 打开")); wx.onSocketError(err => console.error("Socket 错误:", err)); wx.onSocketClose(() => { console.log("Socket 关闭"); reconnect(); });
wx.onSocketMessage(res => handleRequest(res.data)); }
function reconnect() { console.log("10秒后重连..."); setTimeout(connect, 10000); }
function send(msg) { if (socket && socket.readyState === 1) { wx.sendSocketMessage({ data: msg, fail(err) { console.error("发送失败:", err); } }); } }
function sendResult(action, message_id, data) { if (typeof data === 'object') { try { data = JSON.stringify(data); } catch (e) {} } const response = JSON.stringify({ action, message_id, response_data: data }); send(response); }
function handleRequest(raw) { try { const msg = JSON.parse(raw);
if (msg.registerId) { rpc_client_id = msg.registerId; wx.setStorageSync('rpc_client_id', rpc_client_id); return; }
const { action, message_id, param } = msg; if (!action || !message_id) return;
const handler = handlers[action];
let parsedParam = param; if (typeof param === 'string') { try { parsedParam = JSON.parse(param); } catch (e) { console.warn("参数非标准JSON格式,保持原样执行"); } }
if (!handler) { sendResult(action, message_id, "Handler not found"); return; }
handler(res => { sendResult(action, message_id, res); }, parsedParam);
} catch (err) { console.error("解析消息失败:", err); } }
function regAction(name, func) { handlers[name] = func; }
regAction("_execjs", (resolve, param) => { try { const result = eval(param); resolve(result || "没有返回值"); } catch (e) { resolve("执行错误:" + e.message); } });
connect();
return { regAction, send };}
那么就hook到加密函数,使用python写脚本测试了,可以加密任何参数,返回加密后的数据,如下图所示:
WX4.0版本以上开启devtools
node环境:22版本以上
第 1 步 克隆并安装依赖
git clone https://github.com/evi0s/WMPFDebugger
cd WMPFDebugger
yarn
第 2 步 运行 src/index.ts。该命令会启动调试服务器和 CDP 代理服务器,同时相关 hook 代码也会被自动注入到小程序运行时中
npx ts-node src/index.ts
第 3 步 打开任意你想调试的小程序
第4 步
打开浏览器,访问 devtools://devtools/bundled/inspector.html?ws=127.0.0.1:62000 即可。你也可以将 CDP 端口(在例子中为 62000)修改到任意其他端口。相关代码定义在 src/index.ts 中
如图:
笔者在该版本开启的devtools注入相同代码是出现错误的,提示socket连接之后马上断开,查找原因说是该方法下,socket通信冲突,还有就是流量包只走html触发的,其它没有!
参考连接:
https://github.com/evi0s/WMPFDebugger
https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python
https://github.com/jxhczhl/JsRpc/blob/main/resouces/WeChat_Dev.js
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:尽力局JU长 不知名菜鸟%% 不知名菜鸟%%《WX小程序逆向》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论