2006年4月25日星期二

PE Loader 遇到难题

开始做 PE Loader。我的思路是,在自己的宿主程序里读入一个 EXE 文件,将之映像(Image)复制到内存(当然是这个 Loader 宿主程序的内存空间里的某处),同时把相关 DLL 以同样的方式载入,最后跳转(JMP)到 EXE 程序的入口地址,将程序的控制权交给它。我还没有考虑到如果目标 EXE 程序结束后,程序运行指针会指向哪里,实在不行,用一个 CALL 来调用。

现在的进度是,能够将 EXE 读入内存(Section 正确对齐 SectionAlignment),能把所有相关 DLL 载入内存,找到导入函数入口地址并修改 FirstThunk 数组。由于 Loader 宿主程序的映像自己占据了 0x00400000(ImageBase 默认值),所以载入的 EXE 的 ImageBase 肯定会在其他地方。当我想 JMP 时,发现程序中很多地址还是以 0x00400000 作为 ImageBase,所以一访问这些地址就会出错。我现在想不到怎么解决这个问题,想不明白 Windows 的 PE Loader 是怎么考虑这个重定位的,而且我手动把一个 EXE 的 ImageBase 改到 0x00500000,程序一样无法运行。

最大嫌疑是在 IAT 表和 Relocation 表。但很多程序根本没有 Relocation 表,IAT 也在修正 FirstThunk 数组时改过了。网上关于 PE Loader 方面的资料真的很少,更多的都是讲 PE 文件结构(想来这几天把 Iczelion 和 LUEVELSMEYER 的 PE 教程看了不知道多少遍)。我想,很可能为这个 EXE 分配内存时不能用常规的 VirtualAlloc,在 Loader 宿主空间里申请,而应该类似虚拟机那样让其有一个独立的虚拟内存空间。

现在的打算是,有时间就研究一下类似 OllyDbg 的这些调试器,因为它们确实能做到 Load and Execute PE file.

1 条评论:

匿名 说...

很不错。
以后有PE方面的问题经常到你这里来看看~~:)