环境
微信版本: 3.9.12.56 (x32最后一个版本, 吾爱上有强登工具)
WMPF版本: 8518 (x32)
Frida Hook
Hook点特征: 参照x0tools文章
注意, Hook需使用32位Frida
开网页Devtools
Hook时机: 启动时 (建议直接Frida启动)
原理: 微信在启动时会带参数拉起WeChatAppEx.exe , 替换参数注入xweb-enable-inspect即可 (高版本不确定有没有, 应该是似了)
var cpsPtr = Process.getModuleByName('kernel32.dll').getExportByName('CreateProcessW');
var cps = new NativeFunction(cpsPtr,'bool', ['pointer', 'pointer', 'pointer', 'pointer', 'bool', 'uint32', 'pointer', 'pointer', 'pointer', 'pointer']);
console.log('1?')
Interceptor.attach(cpsPtr, {
onEnter: function (args) {
this.cmdline = args[1];
let aaa = this.cmdline.readUtf16String();
aaa = aaa.replaceAll("--log-level=2", "--log-level=0 --xweb-enable-inspect=1");
this.cmdline.writeUtf16String(aaa);
},
onLeave: function (retval) {
console.log("ARG:", this.cmdline.readUtf16String());
}
});开小程序vConsole
Hook时机: 随便 (尽量开小程序前Hook, 如果在开之后Hook需要重载小程序)
原理; 启动小程序会走有LaunchApplet 特征的函数, 栈上有关于vConsole的JSON, 修改JSON即可
注意: 需要使用Frida附加到WeChatAppEx主进程, 且vConsole中云函数(wx.cloud)似乎不可用! 功能相比原生Devtools受限!
var LaunchAppletPtr = ptr(0x2f23321);
let HtmlPtr = ptr(0x2ded67f)
console.log('1?')
Interceptor.attach(HtmlPtr, {
onEnter(args) {
console.log('Detect web')
this.context.eflags |= (1 << 6); // 强制 ZF=1
}
})
Interceptor.attach(LaunchAppletPtr, {
onEnter(args) {
console.log('Launched a mini program!')
let ComJsInfo = this.context.esp.add(84)
var ps = ComJsInfo.readPointer()
var s = ps.readUtf8String()
var s1 = s.replaceAll('"enable_vconsole":false', '"enable_vconsole": true').replaceAll('"frameset":false', '"frameset": true')
ps.writeUtf8String(s1)
}
})呃
也没人告诉我微信Devtools打开这么简单啊... 我以前还以为要多难... 果然动态调试一把嗦是好的...?