首页
社区
课程
招聘
[原创]React Native Hermes逆向
发表于: 2024-9-24 17:22 17695

[原创]React Native Hermes逆向

2024-9-24 17:22
17695

最近没什么事,找了个看视频App,发现又是广告又是视频植入的,烦不胜烦,想着花点时间去个广告捣鼓捣鼓。本文只为了技术分享讨论,切勿使用技术进行非法用途。
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执行反编译提示

看上去是我的index.android.bundle样本的hbc版本是90,我下载的最新版本hbcdump为96,找到hbcdump 90的工具后执行

在当前目录将会看到
图片描述
反编译的结果,但是但是,还没这么快结束。由于我的目的是需要去广告,解锁会员功能,所以修改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查看。
图片描述
不认识这种代码,后来搜索到相关文章有描述操作符之类的说明,现在已经忘记了。
仔细看代码,和汇编有些相似,但是看上去比汇编简单很多,都是左边一个指令右边操作数,例如

接下来只要找到Vip字样相关的地方,修改为true,将反编译后的文件夹重新编译为index.android.bundle,替换assets下面的index.android.bundle,使用apktool重新打包就完成了。

Error: fail to deserializing bytecode: Wrong bytecode version. Expected 96 but got 90
Error: fail to deserializing bytecode: Wrong bytecode version. Expected 96 but got 90
hbcdump.exe index.android.bundle -mode=hbc -out=myout.js
disassemble
hbcdump.exe index.android.bundle -mode=hbc -out=myout.js
disassemble
LoadConstTrue           Reg8:22 将一个8位的寄存器22设置为true
Mov                     Reg8:22, Reg8:25  25寄存器的值赋值給寄存器22
LoadConstString         Reg8:39, UInt16:16781  加载一个字符到39寄存器,字符id16781,查看string.json可以找到这个字符的值。
 {
        "id": 16781,
        "isUTF16": false,
        "value": "contain"
    }
LoadConstTrue           Reg8:4 将寄存器4设为true
LoadConstFalse          Reg8:4 将寄存器4设为false
LoadConstTrue           Reg8:22 将一个8位的寄存器22设置为true
Mov                     Reg8:22, Reg8:25  25寄存器的值赋值給寄存器22

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2024-9-27 13:36 被一颗小草编辑 ,原因:
上传的附件:
收藏
免费 5
支持
分享
最新回复 (5)
雪    币: 27
活跃值: (1638)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
js现在都native化了啊,真的烦
2024-9-26 00:09
0
雪    币: 1379
活跃值: (2796)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2024-9-26 13:18
0
雪    币: 517
活跃值: (135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
bluegatar js现在都native化了啊,真的烦
还好,就是不知道这个格式的时候看着有点蒙,看过了之后就简单了
2024-9-27 13:35
0
雪    币: 1016
活跃值: (176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持一下 ,这个程序应该还算小,之前逆到了一个生成的strings都几十兆的应用,给我人看麻了
2024-9-27 16:51
0
雪    币: 22
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
佬 90的工具有链接吗
2天前
0
游客
登录 | 注册 方可回帖
返回
//