c++ - 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
得到一个指向存在位置的内存地址0x3c
,NT_HEADER
但是代码是如何工作的?幕后发生了什么?
解决方案
type(value)
是函数式转换,而(type)valu
是C 式转换。但是它们都只是类型转换(无论如何,出于此代码的目的)。
所以,在这个声明中:
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 可移植可执行文件格式以获取更多详细信息。
推荐阅读
- kubernetes - Kubernetes 多主设置失败
- github - 由于 SSO,Jenkins 可嵌入构建状态插件被重定向
- excel - 如何将工作区下载到 Excel 工作表中,我可以在其中更新 Excel 中的变量,并且它们也可以在 MATLAB 中更新?
- react-native - FontFamily 不是系统字体,尚未通过 Font.loadAsync 加载。- 反应原生
- react-native - TypeError: undefined is not a function ('..._styledComponents.default.button...'附近)
- raspberry-pi - 无法通过 USB(虚拟串行端口)从 Raspberry Pi Pico 接收数据到 Windows 主机?
- c++ - 无法使用 regex_search 匹配大括号
- php - ajax成功后jquery返回php代码
- c# - C#:在二叉搜索树中根据类别列出项目而不使用集合类
- google-sheets - 将雅虎金融股票价格刮到谷歌表格