C++ 比较词语特征

C++ 比较词语特征,c++,windows,winapi,portable-executable,C++,Windows,Winapi,Portable Executable,我正在尝试读取PE头文件,并想查看exe是否已启用ASLR 我目前正在做: if (PE.FileHeader->OptionalHeader.DllCharacteristics == IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) std::cout << "ASLR is enabled :)" << std::endl; else std::cout << "ASLR is d

我正在尝试读取PE头文件,并想查看exe是否已启用ASLR

我目前正在做:

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头是否具有特定的字字符?

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;

发现它在多位标志的情况下通过以下方式工作:图像\u DLLCHARACTERISTICS\u终端\u服务器\u 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;

重要的是要记住,如果模块缺少.reloc节,无论DllCharacteristics的内容如何,ASLR也将被禁用。查看陈雷蒙的博客了解更多信息:谢谢@byteptr,我不知道!请注意,对于许多本身由简单标志或位掩码枚举组成的位标志,您实际上需要使用掩码,然后还需要测试相等性。@ChrisBecke-是的,但在case中只需标记刚好一位就足够了&