系统环境:
win764位
Python3.7
frida 14.2.2
pc微信3.0.0.47
鲁迅说:伟大的代码来自抄袭,不,是借鉴!
既然是要借鉴,那能拿到源码当然是最好的,今天就来分享下pc端如何获取微信小程序包,借鉴下别人是如何开发小程序的。
目前较多的方法是手机端获取,但需要root,当然也可以电脑安装模拟器搞,既然pc端支持小程序打开,并且拿到包后还需要在电脑上解包,为何不直接在电脑上获取更为方便(这段貌似很啰嗦)。
但不巧的是PC端微信把wxapkg给加密了,当然可以直接写解密算法,既然鲁迅又说过:所有加密都伴随着解密。
那何不直接获取到未加密的小程序包,所以便产生使用frida注入微信获取未加密小程序包的方法:
经过分析发现小程序包的加密算法在WeChatAppHost.dll 中的 EncryptBufToFile函数,那我们就来hook他,拿到未加密的源代码包。
这里发现前人早已造好了轮子:https://github.com/kksanyu/frida_with_wechat_applet,但可惜的是偏移写死了,不支持目前的版本,也不知道帖子里用的是哪个版本的微信。
我们使用x32dbg对微信进行分析
虽然可以得到EncryptBufToFile的地址,但升级又会失效,翻阅了frida的api发现个findExportByName函数,因此我们需要对代码改造一番:
var EncryptBufToFile = baseAddr.add(0x1800F);
更改为:var EncryptBufToFile = Module.findExportByName('WeChatAppHost.dll','EncryptBufToFile');
完整hook代码如下:
/*
* @name 微信小程序PC版 wxapkg提取
* @author 代码果 基于kksanyu版修改
*/
var baseAddr = Module.findBaseAddress('WeChatAppHost.dll');
console.log('WeChatAppHost.dll baseAddr: ' + baseAddr);
if (baseAddr) {
var EncryptBufToFile = Module.findExportByName('WeChatAppHost.dll','EncryptBufToFile');
console.log('EncryptBufToFile 函数地址: ' + EncryptBufToFile);
// HOOK函数, 监听参数
Interceptor.attach(EncryptBufToFile, {
onEnter: function (args) {
// 微信小程序AppId
this.appId = ptr(args[0]).readPointer().readAnsiString();
// 微信小程序本地缓存文件路径
this.apkgFilePath = ptr(args[1]).readPointer().readAnsiString();
// 小程序代码原始内容(未加密)
this.originalData = Memory.readByteArray(args[2], args[3].toInt32());
},
onLeave: function (retval) {
console.log('文件解密成功', this.apkgFilePath);
// 将文件替换为未加密的wxapkg包
var f = new File(this.apkgFilePath, 'wb');
f.write(this.originalData);
f.flush();
f.close();
// 释放内存
delete this.appId;
delete this.apkgFilePath;
delete this.originalData;
}
});
} else {
console.log('WeChatAppHost.dll 模块未加载, 请先打开界面中的小程序面板');
}
我们来测试一番,安装frida这里啰嗦一下:
pip install frida
pip install frida-tools
安装后我们hook下微信,先运行微信,点一下小程序面板,注意注入前清空下C:\Users\Administrator\Documents\WeChat Files\Applet目录。
发现完美获取未加密的包,地址也和我们用x32dbg查看的一样。接下来就是解包的事情了,方法很多,本帖就不再讨论了。