c++ - Windows/C++:为什么加载的模块内存字节在运行时会发生变化?
问题描述
我正在尝试检测加载的模块是否在运行时被恶意进程修补。在这种情况下,模块是正在运行的 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 = ....
为什么创建到模块的文件流会改变模块的预加载字节?我假设模块在加载后会静态地存在于内存中(假设没有恶意补丁)显然是不正确的……但为什么呢?模块加载字节的特定区域是否是动态的?
解决方案
Paul Sanders 的问题为我指明了正确的方向。
模块的 .data 段在运行时发生变化,因此从我的哈希中排除该段可以保持结果相同。
推荐阅读
- linkedin - LinkedIn API:获取公司数据
- multithreading - 重新运行、重新启动和中止线程
- php - 使用 buildTree 生成所有可能分支的数组
- exchange-server - 使用 EWS API 创建会议时,会议室状态从“无响应”变为“接受”需要多长时间
- gcloud - 我可以同时使用服务帐户和用户凭据对 gcloud cli 进行身份验证吗?
- http - HTTP 请求与 RTC 电池消耗 ESP8266
- integration-testing - Apache Flink - 端到端测试如何终止输入源
- python - 如果用户未通过身份验证,如何限制 NGINX 提供媒体文件
- rtsp - 如何在 HTML5 中播放 RTP 流?
- javascript - Service Worker 发送两个请求