【问题标题】:Windows/C++: why are loaded module memory bytes changing at run-time?Windows/C++:为什么加载的模块内存字节在运行时会发生变化?
【发布时间】:2021-10-02 02:45:44
【问题描述】:

我正在尝试检测加载的模块是否在运行时被恶意进程修补。在这种情况下,模块是一个正在运行的 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的生成之间加上下面的代码,hash就不再匹配了:

//char* hash1 = ....

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

//char* hash1 = ....

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

【问题讨论】:

  • mInfo.SizeOfImage 是否包含数据段?

标签: c++ windows memory module patch


【解决方案1】:

Paul Sanders 的问题为我指明了正确的方向。

模块的 .data 段在运行时发生变化,因此从我的哈希中排除该段可以保持结果不变。

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多