本文只为了技术分享讨论,切勿使用技术进行非法用途。
apk拿过来先拖动到jadx查看:
loadAd大概率就是加载广告的地方,点到这个类中往下滑,发现有show方法,通过修改改对应dex的smail将show改为空,改好后将smail文件夹重新编译为dex,在放到jadx中验证是否错误。
上面这个是splash,然后依次将插屏,banner都像这样修改掉。
这都是基础的修改smail,不在本文中详细描述。
React native的代码打包都都放在assets下的index.android.bundle中,正常情况会将代码压缩,混淆,但是我这个apk中的index.android.bundle打开并未显示js代码,拖到notepad++中发现:
乱码显示,摸索了一下java代码发现:
这里比较可疑,应该是乱码的源头,然后搜索关键字Hermes,发现这是一个对于React native的JavaScript引擎,将js代码都编译为bytecode,Hermes引擎会优化React native应用的启动速度和文件大小。
本来想使用frida大法,将assets读取文件内容,执行Js引擎时将内容直接打印出来,无奈,找了半天源码没发现好的切入点,发现一个开源的反编译工具,hbctool,官方也有hbcdump提供反编译工具,使用hbcdump执行反编译提示:
Error: fail to deserializing bytecode: Wrong bytecode version. Expected 96 but got 90
看上去是我的index.android.bundle样本的hbc版本是90,我下载的最新版本hbcdump为96,找到hbcdump 90的工具后执行。
hbcdump.exe index.android.bundle -mode=hbc -out=myout.js
disassemble
在当前目录将会看到:
反编译的结果,但是但是,还没这么快结束。由于我的目的是需要去广告,解锁会员功能,所以修改js代码后还需要回编译,但是官方的这个工具找了半天也没发现有什么文档说明怎么编译回去。无奈切换为另外一个作者的hbctool工具
https://github.com/bongtrop/hbctool。
这个工具在pull request中有90和94的反编译源码提供,感谢每一个开源的作者。在文章末尾我也会将我使用到的代码上传提供下载使用。
将源码下载,在pycharm中打开,添加hbc90目录:
在__init__.py中添加90版本的处理,
执行disasm将会反编译文件,执行asm将会把反编译修改的的文件夹编译回index.android.bundle。
反编译后的文件夹内容:
instruction.hasm便是源码,string.json是字符表,metadata.json看上去是文件的描述符和完整性验证使用的文件,没有仔细研究这个文件。
按照我的目的我应该去修改instruction.hasm,打开instruction.hasm查看。
不认识这种代码,后来搜索到相关文章有描述操作符之类的说明,现在已经忘记了。仔细看代码,和汇编有些相似,但是看上去比汇编简单很多,都是左边一个指令右边操作数,例如:
LoadConstTrue Reg8:22 将一个8位的寄存器22设置为true
Mov Reg8:22, Reg8:25 将25寄存器的值赋值給寄存器22
LoadConstString Reg8:39, UInt16:16781 加载一个字符到39寄存器,字符id为16781,查看string.json可以找到这个字符的值。
{
"id": 16781,
"isUTF16": false,
"value": "contain"
}
LoadConstTrue Reg8:4 将寄存器4设为true
LoadConstFalse Reg8:4 将寄存器4设为false
接下来只要找到Vip字样相关的地方,修改为true,将反编译后的文件夹重新编译为index.android.bundle,替换assets下面的index.android.bundle,使用apktool重新打包就完成了。
看雪ID:一棵小草
https://bbs.kanxue.com/user-home-973070.htm
# 往期推荐
2、恶意木马历险记
球分享
球点赞
球在看
点击阅读原文查看更多
原文始发于微信公众号(看雪学苑):React Native Hermes 逆向