本帖最后由 老坚果 于 2024-12-24 10:24 编辑
PE dump 通用技巧
恶意代码分析中,经常会出现在内存中释放PE文件的操作。内存中的PE文件,通常被称作展开后的文件,dump下来的内存文件通常是无法被直接反编译的,这篇文章将简述一个通用的dump技巧,使内存中dump下来的PE文件被正常反编译,方便你的静态分析。
关键字段
Virtual address、RAW address、Imagebase 、AddressOfEntryPoint。
涉及知识
virtual address 字段中的值,代表PE文件在内存中的页长度;RAW address 字段中的值,这代表PE文件在磁盘中的页长度;Imagebase 字段中的值,代表PE文件中的偏移地址从哪里开始计算;AddressOfEntryPoint 字段中的值,代表进程从哪里进入执行代码。
方法
- 把dump下来的PE文件,放进PE解析工具中如CFF Explore,或放入二进制编辑器中。
- 在所有节区中,将RAW address字段中的值,替换为Virtual address字段中的值。
- Imagebase字段中的值,替换为内存中的初始址。
- AddressOfEntryPoint 字段中的值替换为 调试过程中跳进这个进程的地址。
示例
以一个恶意代码为例,进行演示。
获取修改时需要的——各字段的值
首先在动态调试过程中,获取到内存中的PE文件。如下图中:
- 标号
1 的红框表示通过汇编代码 call eax 的方式跳转进释放的PE文件;
- 标号
2 的红框则是释放在内存中的PE文件数据,通过它的文件头 MZ 可以判断它的基地址Imagebase 字段的值为 0x006E0000 ;
- 标号
3 的红框,代表内存中PE文件的入口地址AddressOfEntryPoint 字段 的值为 0x006E1426 。

修改操作
接下来将内存中的PE文件保存下来,此时还无法正常进行反编译,需要进行一些调整,将所有节区的virtual address 字段 的值复制粘贴给 Raw address 字段 。将 rax 寄存器中的值赋值给AddressOfEntryPoint 字段 。本示例修改使用的工具为 CFF Explore 。
修改前
所有涉及的字段,在下图中用红框标记。


修改后


反编译
修改各字段后,反编译正常,各表正常解析,函数名也正常使用。整个dump和调整的过程就此结束。

|