APK逆向分析入门-以某app脱壳为例
字数 1478 2025-08-22 12:23:00

APK逆向分析与脱壳实战教程

一、加固与脱壳基础

1.1 APK加固技术演进

  1. 代码混淆:最基本的保护方式,通过混淆类名、方法名增加阅读难度
  2. 动态加载DEX:将核心代码加密存储在assets或其它位置,运行时动态解密加载
  3. 动态加载DEX+函数抽象化:在动态加载基础上增加函数级别的保护
  4. VMP虚拟化保护:最高级别的保护,将代码转换为自定义指令集的虚拟机代码

1.2 加固基本原理

加固APK会将原始APK加密后嵌入到壳程序中,运行时由壳程序负责解密并加载原始DEX。脱壳的关键在于找到合适时机从内存中dump出原始DEX文件。

二、腾讯御安全加固脱壳实战

2.1 准备工作

  • 工具准备

    • Jadx:用于静态分析
    • MT管理器:用于验证加固类型和后续修改
    • BlackDex:自动化脱壳工具
    • NP管理器:用于去除签名校验
  • 环境准备

    • 已root的手机或模拟器
    • 目标APK安装包

2.2 脱壳步骤

  1. 使用BlackDex脱壳

    • 安装并运行BlackDex
    • 选择目标应用进行脱壳
    • 脱壳成功后通常会得到多个DEX文件
  2. DEX文件处理

    • 删除无用DEX:比较脱壳前后DEX大小,删除大小相同的
    • 修复DEX文件:使用工具修复,删除生成的.bak备份文件
  3. 修改入口点

    • 在原有DEX的加固代理文件中查找真实入口名
    • 修改AndroidManifest.xml中的入口为真实入口名
  4. 重命名与整合DEX

    • 对脱壳后的DEX进行合理命名
    • 将DEX添加到APK项目中(注意不要自动签名)
  5. 清理加固残留

    • 删除根目录下的加固特征文件
    • 清理lib目录下带"shell"的so文件
    • 删除assets目录中类似"0O1"、"00OO"的特征文件
  6. 去除签名校验

    • 使用NP管理器的"去除签名校验"功能
    • 重新安装测试是否正常运行

三、应用功能修改实战

3.1 去除广告页

  1. 定位广告Activity

    • 通过分析确定为com.dalongtech.cloud.app.appstarter.AppStarterActivity
  2. 修改启动流程

    • 将广告Activity的intent过滤器复制到主Activity(HomePageActivityNew)
    • 直接跳过广告界面进入主界面

3.2 绕过强制更新

  1. 定位更新逻辑

    • 更新弹窗逻辑位于com.dalongtech.cloud.wiget.dialog.UpdateAppDialog
    • 关键函数c(boolean z)控制按钮状态
  2. 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参数控制"取消"按钮是否可用
  3. 静态修改方案

    • 方案一:Hook时修改z为true
    • 方案二:修改smali代码
      • 查找c函数调用处:this.f12120c.c(!"1".equals(data.getIs_force()));
      • 修改smali中的取反操作:
        xor-int/lit8 v0, v0, 0x1  ; 将此指令删除或改为0x0
        

四、关键工具与资源

  1. 工具列表

    • BlackDex:自动化脱壳工具
    • Jadx:Java反编译工具
    • MT管理器:多功能APK分析工具
    • NP管理器:签名校验去除工具
    • Frida:动态分析框架
  2. 参考资源

五、注意事项

  1. 法律风险:仅用于学习研究,勿用于非法用途
  2. 操作备份:修改前务必备份原始文件
  3. 签名问题:修改后不要自动签名,需手动处理签名校验
  4. 兼容性:不同加固版本可能有差异,需灵活调整方法
  5. 测试验证:每次修改后都应安装测试功能是否正常

通过本教程,您应该能够掌握基本的APK脱壳方法和常见功能修改技巧。随着加固技术的不断演进,这些方法可能需要相应调整,但核心思路是相通的。

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 ) 直接跳过广告界面进入主界面 3.2 绕过强制更新 定位更新逻辑 更新弹窗逻辑位于 com.dalongtech.cloud.wiget.dialog.UpdateAppDialog 关键函数 c(boolean z) 控制按钮状态 Frida动态分析 分析发现 z 参数控制"取消"按钮是否可用 静态修改方案 方案一:Hook时修改 z 为true 方案二:修改smali代码 查找 c 函数调用处: this.f12120c.c(!"1".equals(data.getIs_force())); 修改smali中的取反操作: 四、关键工具与资源 工具列表 : BlackDex :自动化脱壳工具 Jadx:Java反编译工具 MT管理器:多功能APK分析工具 NP管理器:签名校验去除工具 Frida:动态分析框架 参考资源 : 加固脱壳原理详解: 微信文章链接 五、注意事项 法律风险 :仅用于学习研究,勿用于非法用途 操作备份 :修改前务必备份原始文件 签名问题 :修改后不要自动签名,需手动处理签名校验 兼容性 :不同加固版本可能有差异,需灵活调整方法 测试验证 :每次修改后都应安装测试功能是否正常 通过本教程,您应该能够掌握基本的APK脱壳方法和常见功能修改技巧。随着加固技术的不断演进,这些方法可能需要相应调整,但核心思路是相通的。