2017-07-26 110 views
-1

我正在尝试读取PE标题,并且想要查看一个exe是否启用了ASLR。比较WORD特征

我目前做的:

if (PE.FileHeader->OptionalHeader.DllCharacteristics == IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) 
     std::cout << "ASLR is enabled :)" << std::endl; 
    else 
     std::cout << "ASLR is disabled >:(" << std::endl; 

不过,我总是得到“ASLR被禁用> :(”,即使我知道一个事实,ASLR启用

我知道这有如何测试并看看PE头是否有一个WORD字符?

+1

其重要要记住ASLR也将不顾禁止的DllCharacteristics *的内容是否*该模块缺少.reloc部分。请参阅Raymond Chen的博客以了解更多信息:https://blogs.msdn.microsoft.com/oldnewthing/20170607-00/?p=96295 – byteptr

+0

谢谢@byteptr,我不知道! – CPunkh

回答

5

DllCharacteristics是一个位掩码,它可以包含多个标志启用。您的检查必须使用位运算符&而不是==运算符:

if (PE.FileHeader->OptionalHeader.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) 
    std::cout << "ASLR is enabled :)" << std::endl; 
else 
    std::cout << "ASLR is disabled >:(" << std::endl; 
+0

注意到有很多位标记本身就是一个简单标记(或掩码枚举)的组合,所以实际上需要&(带一个掩码),然后还要测试其是否相等。 –

+0

@ChrisBecke - 是的,但万一简单地标记(恰好一个位)就够了'&' – RbMm

1

发现它致力于通过下面多位标志IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE的情况下,方法是在DllCharacteristics最高位:

if (PE.FileHeader->OptionalHeader.DllCharacteristics & 
    (IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE| 
    IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE) == 
    IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) 
    std::cout << "ASLR is enabled :)" << std::endl; 
else 
    std::cout << "ASLR is disabled >:(" << std::endl;