dump解密后的so并修改原so

本文详细介绍使用IDA动态调试及010Editor解析SO文件的方法,包括在JNI_ONLOAD下断点、查找并复制解密数据区至原SO文件、处理跳转指令等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先执行IDA动态调试步骤
在JNI_ONLOAD下断点,越往后越好,按ctrl+s查看节点信息,后面的R表示读,W表示写,X表示执行
我们需要的so变成了三个部分,第一个RX表示里面是代码区,对我们没用,最主要的是找到原so文件中被混淆的数据区,其实只需要 RW

image-20200606161832018

复制上图中的start和end的值到文件中,后面用,执行脚本把so dump出来,如下图,start和end替换成上图中的值,然后点击run即可dump出来,代码如下

image-20200606161256615

image-20200606163338756

static main(void)
{
auto fp, start, end, size;
start = 0x792F1000;
end = 0x79302000;
fp = fopen("D:\\r.so", "wb");
for ( ; start < end; start++ )
fputc(Byte(start), fp);
}

# dex的dump如下,本质相同
static main(void)
{
auto fp, dexAddress, end, size;
dexAddress = 0xA7019000;
size = 0xA701B000;
end = dexAddress + size;
fp = fopen("D:\\classes.dex", "wb");
for ( ; dexAddress < end; dexAddress++ )
fputc(Byte(dexAddress), fp);
}
需要一个bt脚本,ELFTemplate.bt,把下图中2个文件全放进010 Editor 软件中,然后拖入ELFTemplate.bt,在原始so文件中(libnet_crypto.so)中按F5进行解析,接下来目标是把已经解密后的rw.so中的解密部分复制到原始的so文件中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c3tSxZpA-1591440543459)(C:%5CUsers%5Calan%5CDesktop%5Cupload%5Cimage-20200606165751543.png)]

image-20200606164217912

把rw.so中的解密部分复制到 libnet_crypto.so 对应部分,注意此时前面6行是不需要的

image-20200606164927410

image-20200606165111683

复制的目标位置如下

image-20200606170120190

image-20200606172216657

点击下面 char_s_data 进到data的位置,上面说了前面6行是不要的,所以下面红框中的6行是略过的,从 91 9A 04 00的地方开始粘贴,然后 ctrl+s 保存

image-20200606173857839

此时已经完成,so变成了解密后的数据

image-20200606175152461

注意:因为上面我们只复制了数据区,所以基本没啥错误(红区)的地方,但是如果上面的数据区的中间部分有跳转部分,那么dump出来的跳转部分就会多了动态调试的基址,这时候需要把原来so中关于跳转的部分(一般来说是乱码)直接复制到修改的so文件即可,如下图

image-20200606181749276

<think>嗯,用户想知道如何用Dobby Hook结合libart.so来脱壳Dump Dex文件。首先,我需要回忆一下Dobby Hook的相关知识。Dobby是一个多平台的Hook库,支持Android的ARM和ARM64架构,对吧?用户提到的脱壳通常是指从加壳的Android应用中提取始的Dex文件。而libart.so是Android运行时库,负责执行Dex字节码,所以脱壳的关键点可能在于Hook libart.so中的关键函数,比如加载Dex或执行方法时的函数。 根据引用中的资料,比如引用3提到Dobby的inline hook理,以及引用4中提到的Hook so层的方法,应该需要找到libart.so中负责Dex加载的函数。可能的目标函数包括OpenMemory、DefineClass或者DexFile相关的函数。例如,Art::DexFile::OpenMemory这个函数,当应用加载Dex时会被调用,Hook它可能可以获取到内存中的Dex数据。 然后,用户需要编写Hook代码,使用Dobby的DobbyHook函数来替换目标函数。在回调函数中,获取Dex文件的起始地址和大小,然后将这段内存数据写入文件,完成Dump。需要注意的是,加壳技术可能会有反Hook措施,所以可能需要绕过这些保护,比如检查代码签名(如引用3中的情况),或者处理多进程注入的问题。 另外,脱壳的时机也很重要。有些壳会在运行时动态解密Dex,所以需要找到合适的时机进行Dump,比如在类被加载时或者方法被执行时。可能需要Hook多个函数,确保覆盖所有可能的解密阶段。 还需要考虑Android版本的问题,不同版本的libart.so可能有不同的函数符号,需要找到对应版本的偏移地址或者符号名。对于Android 8.0以上,可能需要使用dlopen和dlsym来动态获取函数地址,或者解析ELF头来定位。 用户可能需要参考现有的脱壳工具或方法,比如Frida的脚本或者Xposed模块,了解它们是如何Hook这些函数的,然后将其迁移到使用Dobby Hook来实现。同时,要注意权限问题,可能需要root权限或者绕过签名验证,尤其是在非越狱环境下(如引用3提到的代码签名检查)。 最后,测试和验证是关键。编写完Hook代码后,需要在目标应用上测试,确认能够成功Dump出Dex文件,且文件没有损坏,可以使用反编译工具打开。如果遇到问题,可能需要调试Hook过程,检查参数是否正确,内存地址是否有效,以及是否有反调试机制在干扰。</think>### 如何结合Dobby Hook与libart.so进行Dex脱壳 #### 1. 核心思路 通过Hook `libart.so` 中与Dex加载相关的关键函数(如 `Art::DexFile::OpenMemory`),在内存中捕获解密后的Dex数据导出。Dobby Hook用于实现函数拦截,绕过加壳保护[^3][^4]。 #### 2. 实现步骤 **(1) 定位关键函数** - 目标函数示例: - `Art::DexFile::OpenMemory`(Dex文件加载入口) - `ClassLinker::DefineClass`(类加载时触发) - `art::DexFile::WriteToMemory`(内存写入Dex) - 需根据Android版本适配符号名,例如Android 8.0后符号命名规则改变[^2]。 **(2) 编写Hook代码** ```cpp #include "dobby.h" // 定义始函数指针 static void* (*orig_OpenMemory)(const uint8_t* base, size_t size, ...); // 自定义Hook函数 void* fake_OpenMemory(const uint8_t* dex_base, size_t dex_size, ...) { LOG("捕获到Dex内存地址: %p, 大小: %zu", dex_base, dex_size); // 将内存数据写入文件 FILE* fp = fopen("/data/local/tmp/dex_dump.dex", "wb"); fwrite(dex_base, 1, dex_size, fp); fclose(fp); return orig_OpenMemory(dex_base, dex_size, ...); } // 初始化Hook void init_hook() { void* target_addr = DobbySymbolResolver("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_"); DobbyHook(target_addr, (void*)fake_OpenMemory, (void**)&orig_OpenMemory); } ``` **(3) 注入与触发** - 使用 `ptrace` 或 `LD_PRELOAD` 注入so到目标进程 - 调用 `init_hook()` 激活Hook - 触发目标应用加载Dex(如启动Activity) #### 3. 关键问题解决 **(1) 反调试绕过** - 通过Hook `ptrace`/`syscall` 阻止调试检测 - 修改进程状态标志(如 `TASK_PTRACE`) **(2) 多Dex处理** - 使用哈希表记录已导出的Dex地址,避免重复Dump - 监听多个生命周期阶段(安装时/运行时) #### 4. 验证结果 - 使用 `dex2jar` 或 `jadx` 验证导出的Dex文件可读性 - 对比加壳前后方法数量变化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的林羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值