阅读Win32变量

时间:2012-06-20 19:12:29

标签: c++ winapi

如果我可以挂钩到Win32进程,我能做到:

  • 从流程内的类内部读取变量吗?

  • 我上面有Win32应用程序的完整源代码,我可以将其用作此主题的参考吗?

干杯。

1 个答案:

答案 0 :(得分:2)

是。只要模块挂钩到进程中,就会共享相同的地址空间。这意味着您可以访问进程已分配的内存(例如,用于类实例)。

如果你知道类实例的偏移量,那么你可以:

  • 将此内存地址强制转换为指向该类的指针(前提是您已包含类标题)
  • 使用此内存地址的偏移量来访问该类的成员。

请参阅MSDN上的Traversing the Module List。如果您希望“挂钩”该过程的MODULEENTRY32,则可以使用modBaseAddr作为抵消的基础。例如,如果您知道指向类实例的全局变量位于0x000AD421,则可以执行以下操作:

ClassName *pClassBase = moduleEntry->modBaseAddr + 0x000AD421;
pClassBase->UseSomeFunctions();

unsigned char *pClassBase = moduleEntry->modBaseAddr + 0x000AD421; // if we don't know the exact definition of the class we want to play with
float flMemberValue = *reinterpret_cast<float*>((unsigned char *)pClassBase + 24); // float member value at offset 24
// value of member is flMemberValue

*reinterpret_cast<float*>((unsigned char *)pClassBase + 24) = 15.25; // setting the same member value to 15.25.

正如其他评论者所说,找到班级基数的偏差是这个过程中最难的部分。但是,如果你有方便的类定义,这基本上是你必须做的唯一工作(即你也不必也找到类成员偏移)。