Visual C ++生成带有.code.rdata.data节的二进制文件(按此顺序)。 Themida将所有这三个部分合并为一个无名部分,这不利于分析。特别是,我想在Themida可执行文件的内存转储上运行IDA的Extra Pass插件(导入未恢复),但它需要.code节的实际界限,否则它将积极地转换大量实际值。数据写入代码。

如何恢复.rdata.data部分的基数?

#1 楼

基本上,开始执行此操作的最佳方法是编译自己的EXE(如果可能,使用与Themida保护的文件相同的编译器),然后尝试自己合并​​这些部分。我为您制作了一个示例(源代码:http://codepad.org/RqNiH3Ly,下载RAR(合并并直接编译):https://mega.co.nz/#!aoAUALBJ!6riSM4VmT43Ywf_jxQAY73EsVXyjEAAhJ1rOSGaYdeI,只是一些可执行文件

.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对齐(您可以从原始文件中学到)。在这种情况下:




012518EE $-FF25 68202501 JMP DWORD PTR DS:[<&MSVCR100.controlfp>; end
012518F4 00 DB 00
012518F5 00 DB 00


0x12518EE-0x1250000 = 0x18EE,向上舍入为0x2000,因此.rdata节的原始RVA为0x2000 .rebr可以对.reloc节进行类似的计算(搜索二进制掩码“ 3?3?3?3?3?3?”将使您在x86上非常接近)。

只需学习了解编译器结构并使用它来恢复类似于原始结构的内容(也许Themida只是追加了原始节数据并更改了所有数据指针等)。希望这会有所帮助:)