C ++读取PE可选标头以确定DEP和ASLR

时间:2015-04-23 07:37:09

标签: c++ winapi portable-executable

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

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

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

2 个答案:

答案 0 :(得分:2)

你应该看一下Image Helper Library。有一个方法MapAndLoad可以指向PE文件的各个部分(LOADED_IMAGE structure),即 IMAGE_NT_HEADERS IMAGE_SECTION_HEADER IMAGE_NT_HEADERS structure包含指向IMAGE_OPTIONAL_HEADER structure的指针。

字段 DllCharacteristic 包含各种标记,例如 IMAGE_DLLCHARACTERISTICS_NX_COMPAT IMAGE_DLLCHARACTERISTICS_NO_SEH

要使用这些API,请使用Imagehlp.h并链接到Imagehlp.lib。

答案 1 :(得分:0)

  

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

来自IMAGE_FILE_HEADER

Machine字段

  

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