360加固DEX解密与ELF修复技术解析
1. 360加固保护机制概述360加固是国内主流Android应用加固方案之一采用多层保护策略防止应用被逆向分析。其核心保护机制包括DEX文件保护原始DEX被加密存储在assets目录运行时动态解密加载SO文件加固关键Native代码通过自实现linker进行加载隐藏真实符号表反调试检测多线程监控/proc/self/status等关键文件检测调试器附着代码混淆Java层和Native层代码均经过混淆处理实际测试发现经过360加固的APK安装包中assets目录包含加密的libjiagu系列SO文件原classes.dex被替换为壳DEXMETA-INF保留原有签名信息但新增360特定文件2. Java层入口分析2.1 壳Application机制通过反编译加固后的APK可以看到AndroidManifest.xml中Application被替换为com.stub.StubApp。这个壳Application主要完成以下工作attachBaseContext阶段protected void attachBaseContext(Context context) { super.attachBaseContext(context); // 加载libjiagu.so System.loadLibrary(jiagu); // 初始化加固环境 DtcLoader.init(); }onCreate阶段public void onCreate() { super.onCreate(); // 动态加载原始Application Class? clazz Class.forName(com.real.app.MainApplication); Application realApp (Application)clazz.newInstance(); realApp.onCreate(); }2.2 字符串解密技巧分析过程中发现壳代码中的字符串都经过简单异或加密key0x10。使用以下Python脚本可批量解密def decrypt_str(enc_str): return .join([chr(ord(c) ^ 0x10) for c in enc_str]) # 示例解密xyzw - ABCD print(decrypt_str(xyzw))在JEB中可以通过编写脚本自动化解密// JEB脚本示例 for(int i0; iencStr.length(); i) { char c (char)(encStr.charAt(i) ^ 0x10); decStr.append(c); }3. Native层加载流程3.1 SO文件动态加载assets目录下存在多个架构的libjiagu.solibjiagu_arm.solibjiagu_a64.solibjiagu_x86.so加载过程采用分段加载策略先加载外壳SO体积较小运行时解密出主SO文件通过自实现linker加载主SO3.2 内存Dump技巧由于SO文件被加密静态分析困难。可通过Frida在内存中dump解密后的SOfunction dump_so(so_name) { let lib Process.getModuleByName(so_name); let file new File(/data/local/tmp/ so_name, wb); Memory.protect(lib.base, lib.size, rwx); let buf lib.base.readByteArray(lib.size); file.write(buf); file.flush(); file.close(); }关键点需要在SO刚加载时立即dump注意处理内存权限问题需rwx权限不同架构需要分别dump4. ELF文件修复技术4.1 导入表重建解密后的SO文件导入表被破坏需要手动修复。主要步骤定位.dynamic段解析DT_NEEDED依赖项重建JMPREL和PLT表使用开源工具SoFixer可自动化修复./SoFixer -s dumped.so -o fixed.so -m 0x1234000参数说明-s输入文件-o输出文件-m内存加载基址4.2 段数据修复通过分析发现SO文件中包含多个加密段Program Header Table加密.rela.plt加密.rela.dyn加密.dynamic加密修复方法# 从解密数据中提取各段 with open(decrypted.bin,rb) as f: data f.read() # 修复Program Header phdr data[0x1000:0x1150] with open(libjiagu.so,rb) as f: f.seek(0x7000) # PHDR偏移 f.write(phdr)5. 反调试绕过技巧5.1 常见检测手段360加固实现了多层次反调试/proc/self/status检测TracerPid轮询检查进程名包含frida、gdb等关键函数插桩检测断点线程监控ptrace调用5.2 Frida对抗方案有效绕过方案包括// 1. 伪装maps文件 function fake_maps() { const open Module.getExportByName(null, open); Interceptor.replace(open, new NativeCallback((pathname) { if(pathname.indexOf(maps) ! -1) { return open(/data/fake.maps, 0); } return open(pathname, 0); }, int, [pointer])); } // 2. 屏蔽线程检测 function anti_thread_check() { const pthread_create Module.getExportByName(null, pthread_create); Interceptor.attach(pthread_create, { onEnter(args) { let func args[2]; if(Process.getModuleByAddress(func).name libjiagu.so) { args[2] ptr(0); // 替换危险函数 } } }); }6. DEX解密流程6.1 多层加密结构原始DEX采用三层加密整体RC4加密密钥动态生成关键段zlib压缩头部信息单独加密解密流程加密数据 → RC4解密 → zlib解压 → 段重组 → 内存加载6.2 内存解密时机通过Hook以下函数定位解密点Interceptor.attach(Module.findExportByName(null, inflate), { onEnter(args) { let buf args[0].add(0x18).readPointer(); let size args[0].add(0x20).readUInt(); if(size 0x100000) { // 判断可能是DEX console.log(DEX解密位置:, buf, size); dump_dex(buf, size); } } });6.3 完整解密脚本Python实现自动化解密import zlib from Crypto.Cipher import ARC4 def decrypt_360_dex(enc_data): # 第一阶段RC4解密 rc4_key b\x68\x76\x99\x72\x96\x60\x9f\x63 cipher ARC4.new(rc4_key) dec_data cipher.decrypt(enc_data[0x1000:]) # 第二阶段zlib解压 decompressed zlib.decompress(dec_data[4:]) # 第三阶段修复头 header decompressed[:0x70] header header.replace(b\x00\x00\x00, bdex) return header decompressed[0x70:]7. 实用分析技巧7.1 动态跟踪技巧推荐使用Frida Stalker进行指令级跟踪Stalker.follow({ events: { call: true, // 跟踪调用指令 ret: false // 不跟踪返回 }, onReceive: function(raw) { let events Stalker.parse(raw); events.forEach(e { let mod Process.getModuleByAddress(e[0]); console.log(mod.name, e[0]-mod.base); }); } });7.2 自动化分析脚本集成化分析工具链class JiaguAnalyzer: def __init__(self, apk_path): self.apk ZipFile(apk_path) self.temp_dir ./unpack def unpack(self): # 解压APK self.apk.extractall(self.temp_dir) # 解密assets文件 for f in os.listdir(f{self.temp_dir}/assets): if f.startswith(libjiagu): self._decrypt_so(f) def _decrypt_so(self, so_name): # SO解密逻辑 pass def analyze(self): # 自动化分析流程 self.unpack() self.dump_memory() self.fix_elf()8. 对抗升级与展望随着加固技术持续演进未来可能出现基于虚拟化的保护方案动态代码混淆技术硬件级安全方案如TEE反Hook技术增强建议开发者定期更新分析工具链掌握底层原理如ELF格式、ARM指令建立自动化分析体系关注最新加固技术动态在实际分析过程中建议先使用动态分析定位关键点再结合静态分析理解实现细节。对于复杂加密算法可以尝试符号执行等高级技术。记住加固与解固是持续对抗的过程保持技术敏感度至关重要。