详解变形金刚
字数 1326 2025-08-22 22:47:30
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解包后全局搜索字符串。
- 方法一:JEB静态分析
-
定位native函数
eq- 通过
JNI_OnLoad动态注册函数:JNINativeMethod gMethods[] = { {"eq", "(Ljava/lang/String;)Z", (void*)sub_CC0E1784} }; - 关键点:
- 使用
RegisterNatives注册,需手动分析JNI_OnLoad。 - 导入
jni.h头文件到IDA,修复函数原型(如JNIEnv*)。
- 使用
- 通过
-
算法识别
- RC4变种:
- 固定密钥生成(去除
-后倒序)。 - 初始化S-Box(数据来自
dword_CC0E33E8)。 - 密钥调度算法(KSA)和伪随机生成算法(PRGA)。
- 对子密钥序列进行额外交换操作。
- 固定密钥生成(去除
- Base64变种:
- 自定义码表:
abcdefghijklmnopqrstuvwxyz0123456789\\'"。 - 填充字符为
;。
- 自定义码表:
- RC4变种:
-
动态调试
- 步骤:
- 运行
android_server并端口转发:adb forward tcp:23946 tcp:23946 - 以调试模式启动APK:
am start -D -n com.zhuotong.crackme/.MainActivity - IDA附加进程,jdb恢复执行:
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
- 运行
- 关键断点:
JNI_OnLoad:观察RegisterNatives参数。sub_CC0E1784(eq函数实现):Dump子密钥序列。
- 步骤:
-
解密脚本
- 步骤:
- Base64解码(去除填充
;,按6bit分组)。 - 与RC4子密钥序列异或。
- Base64解码(去除填充
- 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)])
- 步骤:
三、关键知识点
-
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层联动的分析方法,适合进阶练习。