360加固之libjiagu.so脱壳及dex dump

       360加固后的apk,在arm设备上首先会将assets目录下的libjiagu.so拷贝到files目录下,然后通过libjiagu.so动态加载原始dex


       libjiagu.so

<think>好的,我现在需要帮助用户解决在Android14中使用Dobby Hook获取脱壳后的DexFile并进行Dump的方法。首先,我得理解用户的需求。用户可能在进行安卓应用逆向分析,需要脱壳处理后的Dex文件,而传统方法可能失效,所以想通过Hook技术来实现。Android14的系统可能对Dex加载机制有所改动,需要最新的适配方法。 接下来,我需要回忆Dobby Hook的基本原理。Dobby是一个用于替换函数实现的Hook框架,支持ARM和ARM64架构。用户需要在目标函数被调用时拦截,并获取DexFile结构体的信息。通常,DexFile在内存中的加载涉及类加载器,所以可能需要Hook相关的方法,比如OpenMemory或DexFile构造函数。 然后,考虑Android14的变化。自Android8以后,Dex加载转向了DexFile的API变化,比如使用DexClassLoader或InMemoryDexClassLoader。但具体到Android14,可能需要查阅最新的源码或文档,确认DexFile的加载流程是否有变化。比如,DexFile的初始化函数可能有所调整,或者内存中的结构体布局不同。 接下来,如何定位关键函数。通常,可以通过分析libart.so中的导出符号,例如DexFile::OpenMemory或类似函数。但在不同Android版本中,符号名可能被混淆或改变,需要动态调试或者查看源码来确定正确的Hook点。用户提到的“dump前后两个segment”可能涉及ELF文件的分析,使用IDA静态分析来找到切入点。 然后,编写Hook代码。使用Dobby进行Hook时,需要声明原函数和替换函数。替换函数中,需要获取Dex的起始地址和大小,然后进行Dump操作。需要注意权限问题,确保进程有权限访问目标内存区域,并且处理可能的内存保护属性,比如使用mprotect调整内存页为可读。 还需要考虑多Dex的情况,一个应用可能有多个Dex文件,需要遍历所有加载的DexFile实例。此外,Hook点的选择要准确,避免遗漏或重复Dump。另外,Android14可能加强了反调试或Hook检测,可能需要绕过这些保护措施。 最后,生成相关问题。用户可能对Hook的具体实现细节、如何定位函数符号、处理内存保护或优化Dump流程感兴趣。需要确保回答覆盖了这些潜在的问题点,并提供进一步的参考资料或步骤。</think>### Android14通过Dobby Hook获取脱壳DexFile的方法 #### 一、关键Hook点定位 在Android ART虚拟机中,DexFile的加载会经过$DexFile::OpenMemory$函数[^1]。该函数接受内存中的Dex数据作为输入参数: $$DexFile* DexFile::OpenMemory(const uint8_t* base, size_t size, ...)$$ 通过Dobby Hook该函数,可拦截到动态加载的Dex文件内存地址和大小: ```cpp typedef DexFile* (*DexFile_OpenMemory_t)(const uint8_t*, size_t, ...); DexFile_OpenMemory_t orig_OpenMemory; DexFile* hook_OpenMemory(const uint8_t* base, size_t size, ...) { // Dump内存中的Dex数据 dump_dex(base, size); return orig_OpenMemory(base, size, ...); } ``` #### 二、Dobby Hook实现步骤 1. **符号查找**: ```cpp void* openmemory_addr = DobbySymbolResolver("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_"); ``` 2. **安装Hook**: ```cpp DobbyHook(openmemory_addr, (void*)hook_OpenMemory, (void**)&orig_OpenMemory); ``` 3. **Dex Dump实现**: ```cpp void dump_dex(const uint8_t* addr, size_t size) { char path[256]; snprintf(path, sizeof(path), "/data/local/tmp/dex_%zu.dex", dump_count++); FILE* f = fopen(path, "wb"); fwrite(addr, 1, size, f); fclose(f); } ``` #### 三、Android14适配要点 1. **内存保护处理**: 需调用$mprotect$修改内存页属性为可读: ```cpp mprotect(ALIGN_DOWN(addr, PAGE_SIZE), ALIGN_UP(size, PAGE_SIZE), PROT_READ); ``` 2. **多Dex处理**: Android14支持$InMemoryDexClassLoader$,需同时Hook$DexFile::DexFile$构造函数: ```cpp typedef void (*DexFile_ctor_t)(DexFile*, const uint8_t*, size_t, ...); ``` 3. **绕过验证**: 部分加固方案会校验Dex文件哈希值,需在Hook后保持原始逻辑完整执行。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值