我正在尝试检测加载的模块是否在运行时被恶意进程修补。在这种情况下,模块是正在运行的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!
一开始工作得很好…如果没有补丁,哈希值将是相同的,并且我可以成功地检测到我自己的补丁(使用virtualproject/CopyMemory更改的模块地址空间中的字节)。
但是,我发现如果在hash1/hash2的生成之间放置以下代码,哈希将不再匹配:
//char* hash1 = ....
std::ifstream stream(pathToModule); //this causes hashes to no longer match???
//char* hash1 = ....
为什么创建一个文件流到一个模块改变模块的预加载字节?我假设模块在加载后会静态地坐在内存中(假设没有恶意补丁)显然是不正确的…但是为什么呢?是否有一个特定区域的模块的加载字节是动态的?
保罗·桑德斯的问题为我指明了正确的方向。
模块的。data段在运行时发生了变化,因此从我的哈希中排除该段可以保持结果不变。