现在售价依旧是99¥,计划更新100案例,平均一个案例1块钱,要什么自行车!
还原一下我逆向此app的方法
1.抓包分析:
我这边用socksDroid抓不到数据包,但是小黄鸟可以,那就用Reqable结合电脑端进行抓包,不纠结。
我们可以看到请求头中有个authentication这个经过测试多次携带同一个值不影响,所以我们把重点放在响应体的解密中。
这里给大家先给出一个细节,响应体的解密中有个"."这个重点圈起来后面要考:
2.使用blutter工具
这个不多说了写了好几期了,这次我就省略了。忘记的翻前几期笔记
最后导出ida的符号
3.分析ida中so文件
首先因为我们的目标是将密文进行解密,所以我们先去尝试搜索一下,decrypt:
出来这些 不算多,观察一下 我们发现了一个AES_decrypt和一个RSA_decrypt
我们先hook encrypt这个类下的函数,也就是先去尝试hook 这几个 因为他比较像flutter开发引入的类。
hook encrypt_encrypt_Encrypter::decrypt64_822d84 直接就hook到了明文了! 我们就不用向下hook了
hook代码:
// encrypt_encrypt_Encrypter::decrypt64_822d84
var addr = Module.findBaseAddress('libapp.so');
console.log(addr);
var funcAddr = addr.add(0x822d84);
console.log(funcAddr);
Interceptor.attach(funcAddr, {
onEnter: function (args) {
console.log("hook 11 到了------------------")
console.log('arg0,',hexdump(args[0],{length:2000}))
},
onLeave: function (retval) {
console.log("-------hook 11 到了结束-------------")
console.log('返回值:', hexdump(retval))
}
})
仔细观察一下hook的入参 是 . 后面的密文
在仔细观察一下hook日志 :
还输出了一串 16位的字符,入参是 "."前面的数据。那么我们现在就该思考到底是如何变成 这个16字符的,这个16位字符又有什么用。
我们多测试几次会发现hook到的 16位字符 是随机的,不确定的。
这里提示一下AES key 是 16位的,所以我们猜测是解密的key是由 "."前面的数据 一系列处理变成的,结合前面看到的RSA字眼,我们是不是可以大胆的猜测 是由rsa解密成aes的key 和 iv呢。
好到此为止都是我们的猜测,我们去用ida的X交叉编译 查看谁调用了他--此函数 encrypt_encrypt_Encrypter::decrypt64_822d84
我们 追一下:
发现上一层函数是:guoguo_api_utils_g_api_::apiDecrypt_8ab12c(__int64 a1)
仔细观察 里面确实有rsa的东西,而且还有AES_KEY 和 AES_IV的字眼,所以我们猜测是一个AES CBC模式
其实hook AES的函数能 hook到:这里我就不对赘述了
7601e635a9 45 53 2f 43 42 43 2f 50 4b 43 53 37 00 00 00 04 AES/CBC/PKCS7
看到这个reverse 反转 这个注意一下重点!!!
然后我们去先hook一下 AES的 IV 和 KEY 一般案例有的是定值,这里我们再确认一下是否是动态的,因为上面说的都是我们的猜测,只有去用frida hook 到才能证明自己的推论。
至此我们验证了key和Iv 都是动态的哦!
并且hook到的key和iv都是可以解出明文的:
KEY: QJHG7NWAQ6J7NZKV
IV : VKZN7J6QAWN7GHJQ
结合上面提到了 reverse
GET到了吗????老铁们!
接着我们去分析 aes的key是如何来的 , 上面我们看到了rsa的字眼结合密文 “.”前面的字符我们可以猜测是 经过RSA解密然后得到的动态key 然后key反转就是动态的iv
现在去hook RSA KEY: 得到rsa 私钥 私钥用来解密
用这个去解密 返回值的 ". "前面字符:成功可以的!
交流群与联系方式: