【问题标题】:Read std::map<string, string> using ReadProcessMemory使用 ReadProcessMemory 读取 std::map<string, string>
【发布时间】:2015-03-29 18:05:13
【问题描述】:

我的目的是从进程(间谍)中读取另一个进程(目标)的变量值。

我从目标进程中大小为 2 的 std::map 开始。

在间谍过程中,遵循以下步骤:

  • 将 UAC 执行级别设置为“requireAdministrator (/level='requireAdministrator')”
  • 启用 SE_DEBUG_NAME
  • 打开了目标进程
  • 已使用 ReadProcessMemory

并成功读取地图。我验证了读取地图的大小为 2。但是,无法评估地图的内容。在监视窗口中观察每个字符串键/值对以评估错误。

为了确认我的步骤是否正确,我尝试读取整数变量而不是地图。可以成功获取整数值。

任何有助于检索地图完整内容的建议?

【问题讨论】:

  • 您的地图实现和目标二进制文件可能不匹配 - 更准确地说,如果您在 msvc 10 中编译应用程序,并且目标应用程序是使用 msvc 11 构建的,很可能您将无法直接阅读。
  • 或任何其他实现,就此而言。有几种 STL 实现(RogueWave、STLPort、Dinkumware 等)。只有当您知道目标进程实际使用的 EXACT 实现,并且您知道该特定实现的 std::map 类的节点的精确布局时,您尝试做的事情才会起作用。而且,您还必须考虑 32 位与 64 位的差异。因此,除非您同时控制目标和间谍可执行文件(或者您已经对目标进行了反向工程),否则您所要求的内容是不可行的。
  • @RemyLebeau,谢谢,是的,我现在正在这样做。

标签: c++ memory win32-process


【解决方案1】:

除了节点计数之外,映射对象还包含指向节点的指针。您还需要在这些指针上使用ReadProcessMemory。如果您将节点内容读取到进程地址空间中的不同地址,则需要更新节点指针。

【讨论】:

    【解决方案2】:

    如果您拥有这两个应用程序,您是否可以使用共享内存(CreateFileMapping/OpenFileMapping 和 MapViewOfFile)以更简单的方式执行此操作?然后,您可以使用特定于会话的互斥锁来保护它,序列化映射,将其写入共享内存,然后在它更改时发出特定于会话的事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2015-10-22
      • 2012-06-17
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多