c++ - Windows/C++ : why are loaded module memory bytes changing at run-time?

标签 c++ windows memory module patch

我试图检测加载的模块是否在运行时被恶意进程修补。在这种情况下,模块是一个正在运行的 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!
起初这很好用......如果没有补丁出现,哈希将是相同的,我可以成功检测到我自己的补丁(模块地址空间中的字节随 VirtualProect/CopyMemory 改变)。
但是,我发现如果我在 hash1/hash2 的生成之间放入以下代码,哈希将不再匹配:
//char* hash1 = ....

std::ifstream stream(pathToModule); //this causes hashes to no longer match???

//char* hash1 = ....
为什么向模块创建文件流会更改模块的预加载字节?我假设模块在加载后会静态地位于内存中(假设没有恶意补丁)显然是不正确的......但为什么呢?模块加载的字节是否有特定区域是动态的?

最佳答案

保罗桑德斯的问题为我指明了正确的方向。
模块的 .data 段在运行时发生变化,因此从散列中排除该段可使结果保持不变。

关于c++ - Windows/C++ : why are loaded module memory bytes changing at run-time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68525164/

相关文章:

c++ - C++/Qt - 内存分配如何工作?

c - 算术和递归函数调用的堆栈内存使用

c++ - 为什么总是等级是1?

c++ - 在隐式类型转换期间最多可以隐式应用多少个用户定义的转换运算符?

windows - powershell 脚本中的程序集

windows - 有没有办法使批处理文件自动填充/自动将文件路径填充到通过批处理文件打开的另一个应用程序中?

C++ STL 映射异常。 (不可变树的根)

c++ - 如何区分 C++ 中的隐式/显式构造函数调用?

在 XP 中从隐藏或剪切的窗口复制内容?

c++ - 获取内存区域的 "execute"权限