APK逆向分析入门-以某app脱壳为例
字数 1478 2025-08-22 12:23:00
APK逆向分析与脱壳实战教程
一、加固与脱壳基础
1.1 APK加固技术演进
- 代码混淆:最基本的保护方式,通过混淆类名、方法名增加阅读难度
- 动态加载DEX:将核心代码加密存储在assets或其它位置,运行时动态解密加载
- 动态加载DEX+函数抽象化:在动态加载基础上增加函数级别的保护
- VMP虚拟化保护:最高级别的保护,将代码转换为自定义指令集的虚拟机代码
1.2 加固基本原理
加固APK会将原始APK加密后嵌入到壳程序中,运行时由壳程序负责解密并加载原始DEX。脱壳的关键在于找到合适时机从内存中dump出原始DEX文件。
二、腾讯御安全加固脱壳实战
2.1 准备工作
-
工具准备:
- Jadx:用于静态分析
- MT管理器:用于验证加固类型和后续修改
- BlackDex:自动化脱壳工具
- NP管理器:用于去除签名校验
-
环境准备:
- 已root的手机或模拟器
- 目标APK安装包
2.2 脱壳步骤
-
使用BlackDex脱壳
- 安装并运行BlackDex
- 选择目标应用进行脱壳
- 脱壳成功后通常会得到多个DEX文件
-
DEX文件处理
- 删除无用DEX:比较脱壳前后DEX大小,删除大小相同的
- 修复DEX文件:使用工具修复,删除生成的.bak备份文件
-
修改入口点
- 在原有DEX的加固代理文件中查找真实入口名
- 修改AndroidManifest.xml中的入口为真实入口名
-
重命名与整合DEX
- 对脱壳后的DEX进行合理命名
- 将DEX添加到APK项目中(注意不要自动签名)
-
清理加固残留
- 删除根目录下的加固特征文件
- 清理lib目录下带"shell"的so文件
- 删除assets目录中类似"0O1"、"00OO"的特征文件
-
去除签名校验
- 使用NP管理器的"去除签名校验"功能
- 重新安装测试是否正常运行
三、应用功能修改实战
3.1 去除广告页
-
定位广告Activity
- 通过分析确定为
com.dalongtech.cloud.app.appstarter.AppStarterActivity
- 通过分析确定为
-
修改启动流程
- 将广告Activity的intent过滤器复制到主Activity(
HomePageActivityNew) - 直接跳过广告界面进入主界面
- 将广告Activity的intent过滤器复制到主Activity(
3.2 绕过强制更新
-
定位更新逻辑
- 更新弹窗逻辑位于
com.dalongtech.cloud.wiget.dialog.UpdateAppDialog - 关键函数
c(boolean z)控制按钮状态
- 更新弹窗逻辑位于
-
Frida动态分析
function hookUpdateDialog(){ let UpdateAppDialog = Java.use("com.dalongtech.cloud.wiget.dialog.UpdateAppDialog"); UpdateAppDialog["c"].overload('boolean').implementation = function (z) { console.log('c is called, z: ' + z); let ret = this.c(z); console.log('c ret value is ' + ret); return ret; }; }- 分析发现
z参数控制"取消"按钮是否可用
- 分析发现
-
静态修改方案
- 方案一:Hook时修改
z为true - 方案二:修改smali代码
- 查找
c函数调用处:this.f12120c.c(!"1".equals(data.getIs_force())); - 修改smali中的取反操作:
xor-int/lit8 v0, v0, 0x1 ; 将此指令删除或改为0x0
- 查找
- 方案一:Hook时修改
四、关键工具与资源
-
工具列表:
- BlackDex:自动化脱壳工具
- Jadx:Java反编译工具
- MT管理器:多功能APK分析工具
- NP管理器:签名校验去除工具
- Frida:动态分析框架
-
参考资源:
- 加固脱壳原理详解:微信文章链接
五、注意事项
- 法律风险:仅用于学习研究,勿用于非法用途
- 操作备份:修改前务必备份原始文件
- 签名问题:修改后不要自动签名,需手动处理签名校验
- 兼容性:不同加固版本可能有差异,需灵活调整方法
- 测试验证:每次修改后都应安装测试功能是否正常
通过本教程,您应该能够掌握基本的APK脱壳方法和常见功能修改技巧。随着加固技术的不断演进,这些方法可能需要相应调整,但核心思路是相通的。