Visual C++ 生成带有.code
、.rdata
和.data
节(按此顺序)的二进制文件。Themida 将所有三个合并为一个无名部分,这不利于分析。特别是,我想在Themida'd 可执行文件(未恢复导入)的内存转储上运行IDA的Extra Pass插件,但它需要 .code 部分的真实边界,否则它会积极地转换很多实际数据转化为代码。
我怎样才能恢复.rdata
和.data
部分的基础?
Visual C++ 生成带有.code
、.rdata
和.data
节(按此顺序)的二进制文件。Themida 将所有三个合并为一个无名部分,这不利于分析。特别是,我想在Themida'd 可执行文件(未恢复导入)的内存转储上运行IDA的Extra Pass插件,但它需要 .code 部分的真实边界,否则它会积极地转换很多实际数据转化为代码。
我怎样才能恢复.rdata
和.data
部分的基础?
基本上,开始执行此操作的最佳方法是编译您自己的 EXE(尽可能使用与 Themida 保护文件相同的编译器)并尝试自己合并这些部分。我为你制作了一个例子(源代码:http : //codepad.org/RqNiH3Ly,下载 RAR(合并 + 直接编译):https : //mega.co.nz/#!aoAUALBJ!6riSM4VmT43Ywf_jxQAY73EsVXyjEAAhJ1rOSGaYdeI,只是一些可执行文件目前正在使用,使用 VS10 编译)。
.data 节的基址基本上可以通过搜索代码中对齐到 0x1000 的每个地址的引用来找到(VS10 按顺序使用数据指针,因此只需向上滚动到第一节的基址并查找指针)。例如:
01251000 /$ 81EC 0C010000 SUB ESP,10C
01251006 |. A1 00302501 MOV EAX,DWORD PTR DS:[1253000]; 指向.data
0125100B |的指针。33C4 XOR EAX,ESP
在我的情况下(EXE 也有重定位)ImageBase 是 0x1250000,所以 .data 部分的 RVA 将是 0x1253000 - 0x1250000 = 0x3000
.rdata 部分只是从代码的实际末尾对齐到 0x1000 的 RVA(您可以从原始文件中了解到这一点)。在这种情况下:
012518E2 $ - FF25 60202501 JMP DWORD PTR DS:[<&MSVCR100._except_han>
012518E8 $ - FF25 64202501 JMP DWORD PTR DS:[<&MSVCR100._invoke_wat>
012518EE $ - FF25 68202501 JMP DWORD PTR DS:[<&MSVCR100。控制 fp > ; 结束
012518F4 00 DB 00
012518F5 00 DB 00
0x12518EE - 0x1250000 = 0x18EE,向上取整为 0x2000,所以 .rdata 部分的原始 RVA 为 0x2000。
可以对 .reloc 部分进行类似的计算(搜索二进制掩码“3?3?3?3?3?”将使您非常接近 x86)。
只需学习了解编译器结构并使用它来恢复与原始类似的东西(也许 Themida 只是附加原始部分数据并更改所有数据指针等)。希望这有所帮助 :)