Windows/C++:为什么加载的模块内存字节在 运行 时发生变化?
Windows/C++: why are loaded module memory bytes changing at run-time?
我正在尝试检测加载的模块是否在 运行 时被恶意进程修补。在这种情况下,模块是一个 EXE 运行.
我的检测方案如下:
MODULEINFO mInfo;
GetModuleInformation(myProc, myInstance, &modInfo, sizeof(MODULEINFO));
//
char* hash1 = hashBytes(mInfo.lpBaseOfDll, mInfo.SizeOfImage);
//.....some time later
char* hash2 = hashBytes(mInfo.lpBaseOfDll, mInfo.SizeOfImage);
//
bool moduleIsModified = compareHashes(hash1, hash2); //false == we're patched!
一开始效果很好...如果没有出现补丁,散列将是相同的,并且我可以成功检测到我自己的补丁(模块地址 space 中的字节已更改为 VirtualProect/CopyMemory)。
但是,我发现如果我在 hash1/hash2 的生成之间放置以下代码,哈希值将不再匹配:
//char* hash1 = ....
std::ifstream stream(pathToModule); //this causes hashes to no longer match???
//char* hash1 = ....
为什么创建到模块的文件流会更改模块的预加载字节?我假设模块在加载后会静态地驻留在内存中(假设没有恶意补丁)显然是不正确的……但为什么呢?模块加载字节的特定区域是否是动态的?
保罗·桑德斯的问题为我指明了正确的方向。
模块的 .data 段在运行时发生变化,因此从我的哈希中排除该段可保持结果不变。
我正在尝试检测加载的模块是否在 运行 时被恶意进程修补。在这种情况下,模块是一个 EXE 运行.
我的检测方案如下:
MODULEINFO mInfo;
GetModuleInformation(myProc, myInstance, &modInfo, sizeof(MODULEINFO));
//
char* hash1 = hashBytes(mInfo.lpBaseOfDll, mInfo.SizeOfImage);
//.....some time later
char* hash2 = hashBytes(mInfo.lpBaseOfDll, mInfo.SizeOfImage);
//
bool moduleIsModified = compareHashes(hash1, hash2); //false == we're patched!
一开始效果很好...如果没有出现补丁,散列将是相同的,并且我可以成功检测到我自己的补丁(模块地址 space 中的字节已更改为 VirtualProect/CopyMemory)。
但是,我发现如果我在 hash1/hash2 的生成之间放置以下代码,哈希值将不再匹配:
//char* hash1 = ....
std::ifstream stream(pathToModule); //this causes hashes to no longer match???
//char* hash1 = ....
为什么创建到模块的文件流会更改模块的预加载字节?我假设模块在加载后会静态地驻留在内存中(假设没有恶意补丁)显然是不正确的……但为什么呢?模块加载字节的特定区域是否是动态的?
保罗·桑德斯的问题为我指明了正确的方向。
模块的 .data 段在运行时发生变化,因此从我的哈希中排除该段可保持结果不变。