C++ 比较词语特征
我正在尝试读取PE头文件,并想查看exe是否已启用ASLR 我目前正在做: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
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中只需标记刚好一位就足够了&