背景

在做APK逆向分析的过程中,我们需要hook目标方法体的任意位置,并注入一些相对复杂业务功能。

使用场景:

  1. 应用启动的时候进行代码注入

  2. hook目标方法体的任意位置,并能够注入复杂的代码

实战示例

目标:我们需要在APK启动的时候,让应用自动创建自己的sdcard目录,并且拿到对应sdcard的完整路径。

因此只需要在MainActivity的OnCreate,插入一个BytestRegularDidUtils.getContextFromAttachBase方法,这个方法会获取Context,并用context对象创建sdcard目录,并将sdcard的具体路径打印出来。最终效果如下

接下来讲一下,具体的实现步骤。

生成注入dex

我们写一个android demo正常开发getContextFromAttachBase函数如下

编译apk之后,就能得到对应的dex文件

将注入dex放到目标apk中

使用apktool工具对apk进行解压,使用如下命令:

apktool d xx.apk -r -s // -r -s 表示不对资源和代码进行反混淆

生成解压后的目录如下:

ls tt_cover/ AndroidManifest.xml assets classes.dex original resources.arsc apktool.yml build res unknown

将上述要注入到dex命名为classes2.dex,放到解压后的根目录中

使用smali工具修改目标apk的classes.dex

java -jar ~/all/sofrware/smali_jar/baksmali-3.0.9-fat.jar d tt_cover/classes.dex -o main_class

在main_class目录下会生成相应的smali代码文件:

找到MainActivity.smali文件,在想要hook的位置,增加smali语句,调用注入dex里边的方法实现hook:

invoke-static {v0}, Lcom/bytedance/bdinstall/storage/BytestRegularDidUtils;->getContextFromAttachBase(Landroid/content/Context;)V

将修改后的smali文件重新编译,并且拷贝回原来的位置:

java -jar ~/all/sofrware/smali_jar/smali-3.0.9-fat.jar assemble main_class/ -o class.dex

cp classes.dex tt_cover/

重新打包apk并签名安装

apktool b tt_cover -o tt_cover_re.apk apksigner sign -ks /Users/bytedance/all/other/cer/da.jks tt_cover_re.apk

adb install tt_cover_re.apk

Hook效果确认

app启动之后,即可可看到日志成功输出

总结

使用上述方案,即可实现目标apk的任意方法任意位置的hook,并且比较方便写复杂的hook代码

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐