【问题标题】:C++ Read PE Optional Headers to determine DEP and ASLRC++ 读取 PE 可选标头以确定 DEP 和 ASLR
【发布时间】:2015-04-23 07:37:08
【问题描述】:

我希望解析一个 PE 文件并从中读取可选标头,以及一些其他数据,这些数据使我能够知道它是 32 位 PE 还是 64 位。 我知道 imagehlp 和 dbghlp 头文件给了我诸如 IMAGE_OPTIONAL_HEADER 之类的结构。 但我不确定如何解析我的文件以产生这些。我可以使用文档并使用偏移量编写自己的解析器,但是如果有人知道正确的 API 来解析 PE?

我的目标: 1) 确定文件是 x64 还是 x86 可执行文件。可能在标题中? 2) 检查 ASLR、DEP 和 SAFESEH。我认为前两个将在 PE Optional Headers 中。

那么是否有任何 API 可以解析我的 PE 并将这些结构返回给我?

【问题讨论】:

    标签: c++ winapi portable-executable


    【解决方案1】:

    您应该看看 Image Helper Library。有一个方法 MapAndLoad 会给你一个指向 PE 文件各个部分的指针 (LOADED_IMAGE structure),即 IMAGE_NT_HEADERSIMAGE_SECTION_HEADERIMAGE_NT_HEADERS structure 包含一个指向 IMAGE_OPTIONAL_HEADER structure 的指针。

    DllCharacteristic 字段包含各种标志,例如 IMAGE_DLLCHARACTERISTICS_NX_COMPATIMAGE_DLLCHARACTERISTICS_NO_SEH

    要使用这些 API,请包含 Imagehlp.h 和指向 Imagehlp.lib 的链接。

    【讨论】:

    • Imagehlp.h 和 DbgHelp.h 似乎不能同时包含,因为两者都定义了相同的结构。有什么诀窍吗?此外,无论我做什么,MapAndLoad 似乎都失败了。MapAndLoad(pimagename,pimagepath,pLoadedImage,FALSE,TRUE) 失败并显示 87(无效参数),pimagename 和 pimagepath 是 PCSTR(char*)。错误是因为它是一个 exe,而正确是因为我希望将其设为只读。它失败了。
    • 在我看来 Imagehlp.hDbgHelp.h 的超集,因此请尝试仅包含 Imagehlp.h
    • 是的,@HarryJohnston 我通过打击和试验达到了这一点。你怎么知道 Imagehlp.h 是超集?通过读取文件,还是有什么工具?
    • 是的,包括 Imagehlp.h 确实足以使用此 API。 @lel:如果它失败并出现错误 87,请告诉我们你如何调用它(什么参数)。
    • @bkausbk,我现在可以成功运行它。问题是我的项目设置了“使用 unicode charset ...”。我已经纠正了这个问题。
    【解决方案2】:

    1) 确定文件是 x64 还是 x86 可执行文件。

    Machine 字段来自IMAGE_FILE_HEADER

    2) 检查 ASLR、DEP 和 SAFESEH

    ASLR

    • IMAGE_OPTIONAL_HEADER检查DllCharacteristics
    • IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 的以上字段按位与:如果不为 0,则图像支持 ASLR。

    DEP

    • IMAGE_OPTIONAL_HEADER检查DllCharacteristics
    • IMAGE_DLLCHARACTERISTICS_NX_COMPAT 的以上字段按位与:如果不是 0,则图像支持 ASLR。

    安全

    • 请注意,SAFESEH 仅适用于 32 位 PE。
    • 转到IMAGE_OPTIONAL_HEADERDataDirectory 字段(IMAGE_DATA_DIRECTORY 的数组)
    • IMAGE_OPTIONAL_HEADER.DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].VirtualAddress 获取 RVA
    • 这导致IMAGE_LOAD_CONFIG_DIRECTORY 结构。
    • 如果 SEHandlerTable 字段不为 0,则图像支持 SAFESEH。

    【讨论】:

    • 嗨,我已经知道如何通过使用 AND 与值来获取值。我想知道的是解析 exe dll ocx 等的 API。这仍然很有帮助:)
    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 2016-12-25
    • 2011-01-06
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多