首页 > 解决方案 > IMAGE_DOS_HEADER 的工作原理

问题描述

PIMAGE_NT_HEADERS ntheaders = (PIMAGE_NT_HEADERS)(PCHAR(virtualpointer) + PIMAGE_DOS_HEADER(virtualpointer)->e_lfanew);

在上面的代码中,virtualpointer指向加载了 PE 文件的内存位置。

为什么virtualpointer前面是括号PIMAGE_DOS_HEADER

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

我理解更大的图景,最终ntheaders得到一个指向存在位置的内存地址0x3cNT_HEADER但是代码是如何工作的?幕后发生了什么?

标签: c++portable-executable

解决方案


type(value)函数式转换,而(type)valuC 式转换。但是它们都只是类型转换(无论如何,出于此代码的目的)。

所以,在这个声明中:

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正在使用指针算法将 的值推进s 中指定pc的数量char(在这种情况下为字节)e_lfanew,其中包含结构从 PE 开始的偏移量IMAGE_NT_HEADERS

  • (PIMAGE_NT_HEADERS)(pc + dos->e_lfanew)将该算术的结果类型转换为IMAGE_NT_HEADERS*指针。

因此,代码只是获取存储在 中的起始地址virtualpointer,读取位于该内存前面的e_lfanew字段IMAGE_DOS_HEADER,向前推进指定的字节数,然后访问IMAGE_NT_HEADERS位于该新位置的 。

您应该阅读深入了解 Win32 可移植可执行文件格式以获取更多详细信息。


推荐阅读