详解变形金刚
字数 1326 2025-08-22 22:47:30

Android逆向分析教学:变形金刚APK逆向详解


一、工具准备

  1. 必备工具

    • IDA Pro 7.0(动态/静态分析)
    • JEB Decompiler 3.0(Java层逆向)
    • apktool(APK解包)
    • mprop或BDOpener.apk(修改debuggable属性)
    • JDK 11+(JEB运行环境)
  2. 调试环境

    • Root的Google Nexus 6P(Android 8.0)
    • Xposed框架(可选,用于动态调试)

二、逆向流程

  1. 定位关键逻辑

    • 方法一:JEB静态分析
      • 搜索字符串error定位错误提示代码。
      • 发现MainActivity继承自AppCompiatActivity(拼写错误,实际应为AppCompatActivity),真正的逻辑在父类中。
      • 关键逻辑:输入24位字符串 → 调用native函数eq验证 → AES解密 → 输出结果。
    • 方法二:apktool解包后全局搜索字符串。
  2. 定位native函数eq

    • 通过JNI_OnLoad动态注册函数:
      JNINativeMethod gMethods[] = {
          {"eq", "(Ljava/lang/String;)Z", (void*)sub_CC0E1784}
      };
      
    • 关键点
      • 使用RegisterNatives注册,需手动分析JNI_OnLoad
      • 导入jni.h头文件到IDA,修复函数原型(如JNIEnv*)。
  3. 算法识别

    • RC4变种
      1. 固定密钥生成(去除-后倒序)。
      2. 初始化S-Box(数据来自dword_CC0E33E8)。
      3. 密钥调度算法(KSA)和伪随机生成算法(PRGA)。
      4. 对子密钥序列进行额外交换操作。
    • Base64变种
      • 自定义码表:abcdefghijklmnopqrstuvwxyz0123456789\\'"
      • 填充字符为;
  4. 动态调试

    • 步骤
      1. 运行android_server并端口转发:
        adb forward tcp:23946 tcp:23946
        
      2. 以调试模式启动APK:
        am start -D -n com.zhuotong.crackme/.MainActivity
        
      3. IDA附加进程,jdb恢复执行:
        jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
        
    • 关键断点
      • JNI_OnLoad:观察RegisterNatives参数。
      • sub_CC0E1784eq函数实现):Dump子密钥序列。
  5. 解密脚本

    • 步骤
      1. Base64解码(去除填充;,按6bit分组)。
      2. 与RC4子密钥序列异或。
    • Python示例
      table = "abcdefghijklmnopqrstuvwxyz0123456789\\'\""
      s_box = [...]  # Dump出的S-Box数据
      
      def decode_b64(enc):
          enc = enc.replace(";", "")
          bits = ''.join([bin(table.index(c))[2:].zfill(6) for c in enc])
          return ''.join([chr(int(bits[i*8:(i+1)*8], 2)) for i in range(len(bits)//8)])
      
      rc4_key = generate_rc4_key()  # 实现RC4密钥生成逻辑
      decrypted = bytes([a ^ b for a, b in zip(base64_decoded, rc4_key)])
      

三、关键知识点

  1. JNI函数注册

    • 动态注册(RegisterNatives)比静态注册(Java_*)更隐蔽。
    • gMethods结构体包含函数名、签名和指针。
  2. RC4算法特征

    • 256字节S-Box初始化。
    • 密钥调度(交换操作)。
    • PRGA生成子密钥序列。
  3. Base64变种识别

    • 非标准码表。
    • 填充字符可能变化。
  4. 动态调试技巧

    • .init_array段可能包含解密代码。
    • 使用jdb恢复进程执行。

四、完整解题步骤

  1. 输入24位任意字符触发eq函数。
  2. 动态调试Dump RC4子密钥序列。
  3. 逆向Base64解码逻辑。
  4. 编写脚本异或解密。

五、总结

  • 核心难点:动态注册native函数、RC4变种识别、动态调试时机。
  • 扩展思考:如何对抗反调试?如何自动化分析JNI_OnLoad

通过本题可掌握Android逆向中native层与Java层联动的分析方法,适合进阶练习。

Android逆向分析教学:变形金刚APK逆向详解 一、工具准备 必备工具 : IDA Pro 7.0(动态/静态分析) JEB Decompiler 3.0(Java层逆向) apktool(APK解包) mprop或BDOpener.apk(修改 debuggable 属性) JDK 11+(JEB运行环境) 调试环境 : Root的Google Nexus 6P(Android 8.0) Xposed框架(可选,用于动态调试) 二、逆向流程 定位关键逻辑 方法一 :JEB静态分析 搜索字符串 error 定位错误提示代码。 发现 MainActivity 继承自 AppCompiatActivity (拼写错误,实际应为 AppCompatActivity ),真正的逻辑在父类中。 关键逻辑:输入24位字符串 → 调用native函数 eq 验证 → AES解密 → 输出结果。 方法二 :apktool解包后全局搜索字符串。 定位native函数 eq 通过 JNI_OnLoad 动态注册函数: 关键点 : 使用 RegisterNatives 注册,需手动分析 JNI_OnLoad 。 导入 jni.h 头文件到IDA,修复函数原型(如 JNIEnv* )。 算法识别 RC4变种 : 固定密钥生成(去除 - 后倒序)。 初始化S-Box(数据来自 dword_CC0E33E8 )。 密钥调度算法(KSA)和伪随机生成算法(PRGA)。 对子密钥序列进行额外交换操作。 Base64变种 : 自定义码表: abcdefghijklmnopqrstuvwxyz0123456789\\'" 。 填充字符为 ; 。 动态调试 步骤 : 运行 android_server 并端口转发: 以调试模式启动APK: IDA附加进程,jdb恢复执行: 关键断点 : JNI_OnLoad :观察 RegisterNatives 参数。 sub_CC0E1784 ( eq 函数实现):Dump子密钥序列。 解密脚本 步骤 : Base64解码(去除填充 ; ,按6bit分组)。 与RC4子密钥序列异或。 Python示例 : 三、关键知识点 JNI函数注册 : 动态注册( RegisterNatives )比静态注册( Java_* )更隐蔽。 gMethods 结构体包含函数名、签名和指针。 RC4算法特征 : 256字节S-Box初始化。 密钥调度(交换操作)。 PRGA生成子密钥序列。 Base64变种识别 : 非标准码表。 填充字符可能变化。 动态调试技巧 : .init_array 段可能包含解密代码。 使用 jdb 恢复进程执行。 四、完整解题步骤 输入24位任意字符触发 eq 函数。 动态调试Dump RC4子密钥序列。 逆向Base64解码逻辑。 编写脚本异或解密。 五、总结 核心难点 :动态注册native函数、RC4变种识别、动态调试时机。 扩展思考 :如何对抗反调试?如何自动化分析 JNI_OnLoad ? 通过本题可掌握Android逆向中native层与Java层联动的分析方法,适合进阶练习。