加载PE标头

Kij*_*jan 5 c winapi portable-executable

基本上,我想要做的是找到PE文件的最后一部分.我非常认真地阅读了PE规范,但我无法发现我的代码失败的地方.

PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)buffer;
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)(pidh + pidh->e_lfanew);
PIMAGE_FILE_HEADER pifh = (PIMAGE_FILE_HEADER)&pinh->FileHeader;
PIMAGE_OPTIONAL_HEADER pioh = (PIMAGE_OPTIONAL_HEADER)&pinh->OptionalHeader;
PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)(pinh + sizeof(IMAGE_NT_HEADERS) + (pifh->NumberOfSections - 1) * sizeof(IMAGE_SECTION_HEADER));
Run Code Online (Sandbox Code Playgroud)

buffer是包含加载的可执行文件的字节数组,pish是指向最后一节的指针.出于某种原因,似乎部门的数量超过20 000.

有任何想法吗 ?提前致谢

jow*_*owo 15

我看到一个问题:e_lfanew是IMAGE_NT_HEADERS结构的偏移量,以字节为单位.您正在向IMAGE_DOS_HEADER指针添加此字节数,因此您将按sizeof(IMAGE_DOS_HEADER)*pidh->e_lfanew字节向前移动.

固定版本:

PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)buffer;
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)((BYTE*)pidh + pidh->e_lfanew);
PIMAGE_FILE_HEADER pifh = (PIMAGE_FILE_HEADER)&pinh->FileHeader;
PIMAGE_OPTIONAL_HEADER pioh = (PIMAGE_OPTIONAL_HEADER)&pinh->OptionalHeader;
PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)((BYTE*)pinh + sizeof(IMAGE_NT_HEADERS) + (pifh->NumberOfSections - 1) * sizeof(IMAGE_SECTION_HEADER));
Run Code Online (Sandbox Code Playgroud)

调试此类问题的最佳方法是使用调试器进入代码并在内存中查看PE数据.例如,您可以打开Visual Studio十六进制编辑器,查看所有字节数据以及实际读取的值.

以下是有关在VS 2010中查看程序内存的一些信息:http: //msdn.microsoft.com/en-us/library/s3aw423e.aspx