最近没什么事,找了个看视频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
寄存器,字符
id
为
16781
,查看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
被一颗小草编辑
,原因: