2017-07-26 112 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;