3

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

注意:我没有使用 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(不执行)?

4

1 回答 1

5

解决方案是选项嵌入在 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)
{
   // Any code is released into the public domain. No attribution required.
   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);
于 2013-09-25T18:54:18.160 回答