如何启用可执行文件的地址空间布局随机化?
注意:我没有使用Visual Studio或任何提供/dynamicbase
编译器选项的编译器。
出于本讨论的目的,假设我正在向编译器添加功能以启用ASLR。
还有其他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)?
答案 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);
注意:任何代码都会发布到公共域中。无需归属。