这个技巧挺实用的。之前一直都是安卓虚拟机,拖来拖去实在太麻烦。
针对Win下的微信小程序
安装firda
pip install frida
pip install frida-tools
然后hook的js文件
console.log('WeChatAppHost.dll baseAddr: ' + baseAddr);
if (baseAddr) {
var EncryptBufToFile = Module.findExportByName('WeChatAppHost.dll', 'EncryptBufToFile');
// EncryptBufToFile函数偏移地址, 从DLL中查看
// var EncryptBufToFile = baseAddr.add(0x1800F);
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 模块未加载, 请先打开界面中的小程序面板');
}
清空清空:C:\Users\用户名\Documents\WeChat Files\Applet
打开frida,hook微信
frida WeChat.exe -l .\hook.js
打开电脑微信,打开对应小程序,C:\Users\用户名\Documents\WeChat Files\Applet下就会获取源码
对其解密,
# -*- coding: utf-8 -*-
import os
import argparse
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import SHA1
from Crypto.Cipher import AES
# 微信小程序包 自定义标识
WXAPKG_FLAG = 'V1MMWX'
WXAPKG_FLAG_LEN = len(WXAPKG_FLAG)
def main():
parser = argparse.ArgumentParser(description='PC微信小程序wxapkg包解密工具')
parser.add_argument('--wxid', metavar='微信小程序ID', required=True)
parser.add_argument('--iv', metavar='iv', required=False, default='the iv: 16 bytes')
parser.add_argument('--salt', metavar='salt', required=False, default='saltiest')
parser.add_argument('-f', '--file', metavar='加密的小程序包文件路径', required=True)
parser.add_argument('-o', '--output', metavar='解密后的小程序包文件路径', required=True)
args = parser.parse_args()
key = PBKDF2(args.wxid.encode('utf-8'), args.salt.encode('utf-8'), 32, count=1000, hmac_hash_module=SHA1)
# 读取加密的内容
if not os.path.exists(args.file):
raise Exception('文件不存在')
with open(args.file, mode='rb') as f:
dataByte = f.read()
if dataByte[0:WXAPKG_FLAG_LEN].decode() != WXAPKG_FLAG:
raise Exception('该文件无需解密, 或者不是微信小程序wxapkg加密包')
# 初始化密钥
cipher = AES.new(key, AES.MODE_CBC, args.iv.encode('utf-8'))
# 解密头部1024个字节
originData = cipher.decrypt(dataByte[WXAPKG_FLAG_LEN: 1024 + WXAPKG_FLAG_LEN])
# 初始化xor密钥, 解密剩余字节
xorKey = 0x66
if len(args.wxid) >= 2:
xorKey = ord(args.wxid[len(args.wxid) - 2])
afData = dataByte[1024 + WXAPKG_FLAG_LEN:]
out = bytearray()
for i in range(len(afData)):
out.append(afData[i] ^ xorKey)
originData = originData[0:1023] + out
# 保存解密后的数据
with open(args.output, mode='wb') as f:
f.write(originData)
print('解密成功', args.output)
if __name__ == "__main__":
main()
#----------------------------------------------------------------
解密用法
'''
(py3) C:\Users\DELL\Desktop\t00ls\pc_wxapkg_decrypt_python-master\pc_wxapkg_decrypt_python-master>python .\main.py --wxid wxid--file "C:\Users\DELL\Documents\WeChat Files\Applet\wxid\731\_subPackages_location_.wxapkg" --output dec3.wxapkg
解密成功 dec3.wxapkg
'''
注意wxid对应你自己的wxid
如果报错,说明小程序可能没加密
最后用wxappUnpacker即可还原成Javascript源代码
主包:
node .\wuWxapkg.js xxxx.wxapkg
分包:
node .\wuWxapkg.js -s="主包解压路径" xxxx_subpackage.wxapkg
参考
https://blog.csdn.net/m0_46243789/article/details/111591100
https://github.com/kksanyu/frida_with_wechat_applet