小程序逆向加解密实录
反编译
想要逆向wx小程序首先要找到小程序的路径
Android:/data/data/com.tencent.mm/MicroMsg/xxxxxxxxxxxxxxxxxxxxxxxxx(wxid)/appbrand/pkg/xxx.wxapkg(小程序版本号.wxapkg)
iOS:/User/Containers/Data/Application/xxxx-xxx-xxxxx-xxxx-xxxxxxx(wx安装后的uuid)/Library/WechatPrivate/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(wxID)/WeApp/LocalCache/release或debug/wxxxxxxxxxxxxxxxx(小程序id)/xxx.wxapkg(小程序版本号.wxapkg)
此目录下存放的.wxapkg文件就是小程序打包后的文件。如果想找到自己需要的小程序,可将此目录下的文件都删除,重新打开小程序,新生成的wxapkg文件就是要找的小程序。
小程序逆向工具:https://github.com/xuedingmiaojun/wxappUnpacker
解包主包
windows系统使用: ./bingo.bat testpkg/master-xxx.wxapkg Linux系统使用: ./bingo.sh testpkg/master-xxx.wxapkg解包子包
windows系统使用: ./bingo.bat testpkg/sub-1-xxx.wxapkg-s=../master-xxx Linux系统使用: ./bingo.sh testpkg/sub-1-xxx.wxapkg-s=../master-xxx静态分析
通过抓包分析,登录包及以前的数据包均未加密只采用了base64编码
而登录后的包则使用了加密
我们打开反编译后的项目,通过接口名称搜索
该接口其实就是传了一个"{}"大括号,关键则是t方法。我们继续追踪该方法
最终发现data段会通过 header中有没有flag为1的标志以及有没有access_token去判断是否要加密
加密则使用aes128 CBC的加密模式,密钥和IV则是从一个randomString中取的,现在我们来看一下这个randomString
原来这个randomString是在登录时生成的一个32位的字符串,本地在Storage中存储,在登录时会由RSA加密,通过factor字段发送至服务器,我们再看一下登录包中的内容,果然有factor字段。
动态调试
由于密钥并不固定,那我们应该如何测试呢?虽然js代码我们无法Hook,但是却可以动态调试呀。首先安装wx开发者工具,将反编译后的包,导入wx开发者工具当中
AppID我们使用测试号即可
将项目导入后首先会报_typeof3 is not a function的错误,此时我们需要将详情-本地设置-将JS编译成ES5取消勾选
之后项目又会报错,不在合法域名列表中
此时我们需要将详情-本地设置-将不校验合法域名勾选
再次编译项目,发现仍有问题,提示
VM2_INTERNAL_STATE_DO_NOT_USE_OR_PROGRAM_WILL_FAIL is not defined
后发现出现的几处,均为处理异常时调用,代码直接注释掉即可
再次编译已无报错信息产生,现在我们直接选择真机调试
发现应用已经可以调试了,提示:第一次调试时,尽量不要挂代理,否则可能连不上调试器。可以先正常启动一次调试,然后结束调试再挂代理,再选择真机调试。
我们在登录时下断点
登录时会触发断点
这样我们就知道randomString的值了,再由之前静态分析加解密可知,randomString会被分成两部分前16位为key,后16位为iv。我们查看一下现在加密的数据
再使用此次生成的randomString来解密,发现可正常解密,可以愉快的测试了。