360加固壳的ELF双生术:藏在so文件里的第二重世界

张开发
2026/5/21 13:17:25 15 分钟阅读
360加固壳的ELF双生术:藏在so文件里的第二重世界
360加固壳的ELF双生术藏在so文件里的第二重世界在移动应用安全领域加固技术始终是攻防双方博弈的焦点。360加固作为国内领先的安全解决方案其ELF双生技术通过创新的二进制嵌套机制为应用保护提供了全新思路。本文将深入解析这一技术的实现原理揭示壳ELF如何通过内存填充动态加载主ELF的完整机制。1. ELF嵌套技术架构解析ELFExecutable and Linkable Format作为Linux系统下的标准二进制格式其灵活的段加载机制为加固技术提供了天然的实现基础。360加固的ELF双生技术核心在于双层ELF结构壳ELF作为载体内部嵌套加密的主ELF动态加载机制运行时通过内存操作完成主ELF的解密与加载自实现链接器绕过系统linker实现自定义的加载逻辑典型的内存布局如下所示内存区域用途说明0x0000-0x1000壳ELF头部0x1000-0xE7000壳ELF代码段0xE7000-0xEND加密的主ELF及动态加载区域2. 关键实现技术剖析2.1 ELF魔数隐藏技术常规ELF文件以\x7FELF魔数开头360加固通过以下方式实现隐藏# 魔数隐藏示例代码 def hide_elf_magic(elf_data): encrypted_magic bytes([b ^ 0xD3 for b in elf_data[:4]]) return encrypted_magic elf_data[4:]实际效果对比如下偏移量常规ELF加固ELF0x07FAC0x145960x24C9F0x346952.2 Program Header加密机制Program Header作为ELF加载的关键元数据360采用分段加密策略原始Header拆分为多个数据块每块使用不同密钥进行RC4加密加密后数据存储在.so文件的预留区域加密流程伪代码void encrypt_phdr(Elf64_Phdr* phdr, int count) { uint8_t key1[] {0x68,0x76,0x99,0x72}; uint8_t key2[] {0x96,0x60,0x9f,0x63}; for(int i0; icount; i){ if(i%2 0){ rc4_encrypt(phdr[i], sizeof(Elf64_Phdr), key1); }else{ rc4_encrypt(phdr[i], sizeof(Elf64_Phdr), key2); } } }2.3 soinfo结构魔改技术360加固对系统soinfo结构进行了定制化修改主要变更包括struct custom_soinfo { char magic[8]; // 自定义标识360JG uint32_t phdr_offset; // 加密phdr的偏移 uint32_t phdr_size; // phdr加密块大小 uint64_t load_bias; // 加载偏移量 // ... 其他标准soinfo字段 };关键修改点增加校验魔数字段分离phdr存储位置添加动态解密标记位3. 动态加载流程详解3.1 壳ELF初始化阶段加载时序图系统加载壳ELF执行.init_array中的初始化函数准备解密环境映射主ELF内存区域关键函数调用栈JNI_OnLoad() └── init_decrypt_env() ├── setup_memory_map() └── load_encrypted_segments()3.2 主ELF解密过程解密采用多阶段混合策略RC4流解密处理核心代码段def rc4_decrypt(data, key): S list(range(256)) # Key-scheduling algorithm j 0 for i in range(256): j (j S[i] key[i % len(key)]) % 256 S[i], S[j] S[j], S[i] # Pseudo-random generation algorithm i j 0 out [] for char in data: i (i 1) % 256 j (j S[i]) % 256 S[i], S[j] S[j], S[i] out.append(char ^ S[(S[i] S[j]) % 256]) return bytes(out)zlib解压缩处理资源数据段自定义算法处理关键校验段3.3 自实现linker技术360加固实现了精简版linker主要功能模块模块名称功能描述prelink段重定位处理symbol_resolve符号解析reloc_handle重定位表处理init_call初始化函数调用典型的重定位处理代码片段void handle_reloc(custom_soinfo* si, Elf64_Rela* rela) { Elf64_Addr* addr (Elf64_Addr*)(si-load_bias rela-r_offset); switch(ELF64_R_TYPE(rela-r_info)) { case R_AARCH64_RELATIVE: *addr si-load_bias rela-r_addend; break; case R_AARCH64_JUMP_SLOT: *addr resolve_symbol(si, ELF64_R_SYM(rela-r_info)); break; } }4. 加固对抗技术分析4.1 反调试策略矩阵360加固采用多层次反调试技术检测类型具体实现方法绕过建议调试器检测/proc/self/status检查静态patch检测点环境检测检查frida等注入工具特征修改模块特征时间差检测关键函数执行时间校验挂钩时间相关函数完整性校验代码段CRC校验动态修复校验值4.2 内存保护机制关键内存保护措施分段权限控制代码段RX可读可执行数据段RW可读可写关键段无权限触发异常处理内存混淆技术void* alloc_protected_memory(size_t size) { void* addr mmap(NULL, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); mprotect(addr, size, PROT_READ|PROT_EXEC); return addr; }影子内存映射关键数据存储在多处内存使用时动态选择5. 技术验证与实践5.1 动态分析方案推荐分析工具链Frida脚本模板Interceptor.attach(Module.findExportByName(null, android_dlopen_ext), { onEnter: function(args) { var path ptr(args[0]).readCString(); if(path path.includes(libjiagu)) { console.log(Loading 360加固so:, path); dumpSoMemory(path); } } }); function dumpSoMemory(soName) { var module Process.getModuleByName(soName); var file new File(/data/local/tmp/ soName .dump, wb); file.write(module.base.readByteArray(module.size)); file.flush(); file.close(); }010 Editor分析模板// ELF头解析模板 typedef struct { char e_ident[16]; Elf64_Half e_type; Elf64_Half e_machine; // ... 其他标准字段 } Elf64_Ehdr; // 360加固特征检测 bool is_360_protected(Elf64_Ehdr* ehdr) { return ehdr-e_ident[4] 0xAC ehdr-e_ident[5] 0x96; }5.2 静态提取技术主ELF提取流程定位加密数据段特征值搜索RC4密钥提取固定密钥动态计算分段解密处理ELF结构重建Python提取示例def extract_main_elf(shell_so): with open(shell_so, rb) as f: data f.read() # 定位加密主ELF magic b\xAC\x96\x9F\x95 # 加密后的ELF魔数 offset data.find(magic) # 解密处理 decrypted rc4_decrypt(data[offset:offset0x10000], RC4_KEY) # 修复ELF头 decrypted b\x7FELF decrypted[4:] return decrypted6. 技术演进趋势当前ELF加固技术呈现以下发展方向多态化加载每次运行使用不同的加载路径VMP融合关键段使用虚拟化保护硬件协同利用TrustZone等安全区域动态混淆运行时指令随机化未来可能的技术突破点包括基于eBPF的运行时保护异构计算单元协同验证区块链化的完整性校验这种ELF双生技术展现了二进制保护的新思路其设计理念值得安全研究人员深入理解。在实际应用中需要根据具体场景平衡安全强度与性能损耗才能实现最优的保护效果。

更多文章