IMAGE_DOS_HEADER 的工作原理
How IMAGE_DOS_HEADER works
PIMAGE_NT_HEADERS ntheaders = (PIMAGE_NT_HEADERS)(PCHAR(virtualpointer) + PIMAGE_DOS_HEADER(virtualpointer)->e_lfanew);
在上面的代码中,virtualpointer
指向加载了 PE 文件的内存位置。
为什么virtualpointer
在PIMAGE_DOS_HEADER
前面的括号里?
它如何处理指针,e_lfanew
如何获取它的值?
我了解大局,最终,ntheaders
获得了一个指向 0x3c
位置的内存地址,其中 NT_HEADER
存在,但是代码工作?幕后发生了什么?
type(value)
是 function-style 类型转换,而 (type)valu
是 C-style 类型转换。但它们都只是类型转换(无论如何,为了这段代码的目的)。
所以,在这个声明中:
PIMAGE_NT_HEADERS ntheaders = (PIMAGE_NT_HEADERS)(PCHAR(virtualpointer) + PIMAGE_DOS_HEADER(virtualpointer)->e_lfanew);
PIMAGE_DOS_HEADER(virtualpointer)
将 virtualpointer
类型转换为 IMAGE_DOS_HEADER*
指针。我们称之为 dos
.
PCHAR(virtualpointer)
将 virtualpointer
类型转换为 char*
指针。我们称之为 pc
.
pc + dos->e_lfanew
正在使用 指针算法 将 pc
的值推进 char
的数量(即字节,在这种情况下)在 e_lfanew
中指定,其中包含从 PE 开始的 IMAGE_NT_HEADERS
结构的 offset。
(PIMAGE_NT_HEADERS)(pc + dos->e_lfanew)
正在将该算法的结果类型转换为 IMAGE_NT_HEADERS*
指针。
所以,代码只是获取存储在 virtualpointer
中的起始地址,读取位于该内存前面的 IMAGE_DOS_HEADER
的 e_lfanew
字段,向前推进指定的字节数,然后访问位于该新位置的 IMAGE_NT_HEADERS
。
您应该阅读 An In-Depth Look into the Win32 Portable Executable File Format 了解更多详情。
PIMAGE_NT_HEADERS ntheaders = (PIMAGE_NT_HEADERS)(PCHAR(virtualpointer) + PIMAGE_DOS_HEADER(virtualpointer)->e_lfanew);
在上面的代码中,virtualpointer
指向加载了 PE 文件的内存位置。
为什么virtualpointer
在PIMAGE_DOS_HEADER
前面的括号里?
它如何处理指针,e_lfanew
如何获取它的值?
我了解大局,最终,ntheaders
获得了一个指向 0x3c
位置的内存地址,其中 NT_HEADER
存在,但是代码工作?幕后发生了什么?
type(value)
是 function-style 类型转换,而 (type)valu
是 C-style 类型转换。但它们都只是类型转换(无论如何,为了这段代码的目的)。
所以,在这个声明中:
PIMAGE_NT_HEADERS ntheaders = (PIMAGE_NT_HEADERS)(PCHAR(virtualpointer) + PIMAGE_DOS_HEADER(virtualpointer)->e_lfanew);
PIMAGE_DOS_HEADER(virtualpointer)
将virtualpointer
类型转换为IMAGE_DOS_HEADER*
指针。我们称之为dos
.PCHAR(virtualpointer)
将virtualpointer
类型转换为char*
指针。我们称之为pc
.pc + dos->e_lfanew
正在使用 指针算法 将pc
的值推进char
的数量(即字节,在这种情况下)在e_lfanew
中指定,其中包含从 PE 开始的IMAGE_NT_HEADERS
结构的 offset。(PIMAGE_NT_HEADERS)(pc + dos->e_lfanew)
正在将该算法的结果类型转换为IMAGE_NT_HEADERS*
指针。
所以,代码只是获取存储在 virtualpointer
中的起始地址,读取位于该内存前面的 IMAGE_DOS_HEADER
的 e_lfanew
字段,向前推进指定的字节数,然后访问位于该新位置的 IMAGE_NT_HEADERS
。
您应该阅读 An In-Depth Look into the Win32 Portable Executable File Format 了解更多详情。