Android安全——基于Smali和Dex注入Hook指定方法任意位置
本文介绍了在APK逆向分析中实现任意位置方法hook的技术方案。通过编写一个Android demo获取Context并创建sdcard目录的功能,生成独立dex文件注入目标APK。使用apktool解压APK,smali工具修改目标方法,在MainActivity的onCreate中插入调用语句,重新打包签名后安装运行。该方法可灵活hook任意位置并实现复杂功能注入,文中以自动创建sdcard目
背景
在做APK逆向分析的过程中,我们需要hook目标方法体的任意位置,并注入一些相对复杂业务功能。
使用场景:
-
应用启动的时候进行代码注入
-
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代码
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)