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 文件的内存位置。

为什么virtualpointerPIMAGE_DOS_HEADER前面的括号里?

它如何处理指针,e_lfanew如何获取它的值?

我了解大局,最终,ntheaders 获得了一个指向 0x3c 位置的内存地址,其中 NT_HEADER 存在,但是代码工作?幕后发生了什么?

type(value)function-style 类型转换,而 (type)valuC-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_HEADERe_lfanew 字段,向前推进指定的字节数,然后访问位于该新位置的 IMAGE_NT_HEADERS

您应该阅读 An In-Depth Look into the Win32 Portable Executable File Format 了解更多详情。