如何在Windows PE二进制文件中启用ASLR?

时间:2013-09-25 18:28:05

标签: aslr

如何启用可执行文件的地址空间布局随机化?

注意:我没有使用Visual Studio或任何提供/dynamicbase编译器选项的编译器。

出于本讨论的目的,假设我正在向编译器添加功能以启用ASLR。

其他PE标志

还有其他Windows可执行映像选项,我已经知道如何设置。例如,然后IMAGE_FILE_NET_RUN_FROM_SWAP标志。在PE二进制头中设置PE选项:

LOADED_IMAGE li;
MapAndLoad(fileName), null, li, false, false)

LI.FileHeader.FileHeader.Characteristics |= IMAGE_FILE_NET_RUN_FROM_SWAP;

UnMapAndLoad(li)

如何启用地址空间布局随机化?它是PE旗帜吗?它是汇编清单条目吗?

加成

如何将可执行文件选择为NX(No Execute)?

1 个答案:

答案 0 :(得分:4)

解决方案是选项 嵌入在PE二进制头中。但不是

loadedImage.FileHeader.FileHeader.Characteristics

它在:

loadedImage.FileHeader.OptionalHeader.DllCharacteristics

您设置标志的位置:

IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040; //The DLL can be relocated at load time.

对于辅助函数伪代码:

void SetPEOptFlags(String filename, UInt32 flags)
{
   LOADED_IMAGE li;
   MapAndLoad(filename, null, li, false, false);

   li.FileHeader.OptionalHeader.DllCharacteristics |= flags;
   UnMapAndLoad(li);
}

然后调用

//Optional dll characteristics
const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040; //The DLL can be relocated at load time.
const IMAGE_DLLCHARACTERISTICS_NX_COMPAT =    0x0100; //The image is compatible with data execution prevention (DEP).


SetPEOptFlags("C:\Foo\Contoso.exe", 
   IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | IMAGE_DLLCHARACTERISTICS_NX_COMPAT);
  

注意:任何代码都会发布到公共域中。无需归属。