【问题标题】:How can I detect the memory data changed?如何检测内存数据的变化?
【发布时间】:2012-01-05 16:53:07
【问题描述】:

我正在学习windows编程,我有一些问题。

我看到了一个保护内存数据的安全模块。 如果一个进程要更改其他进程的内存,它会检测并关闭该进程。

这通常用于游戏或银行应用程序的反作弊引擎(我住在韩国,所以我认为这是最好的例子。几乎每个在线游戏或银行应用程序都有自卫算法。 )

我的问题是,是否有任何 API 或函数可以检测到这一点?

谢谢。

附: 我可以举个例子,

如果 0x01000000 内存数据为 'A',则某些不同的进程将其更改为 'B'。 当我第一次想到这个时,我认为我必须创建一个线程来检查数据,如果它发生变化,请关闭该进程。 但我认为这不是一个好主意。有什么建议吗?

【问题讨论】:

  • 您是跨其他应用程序还是您自己的应用程序进行检测(即,这纯粹是内部功能,还是用于整个操作系统)?由于虚拟内存,您无法轻松直接访问任何其他应用程序的内存,但是可以做到。
  • @Nagi:没有现代操作系统(包括 Windows)允许一个进程更改另一个进程的内存。你说的是哪个安全模块?
  • @Igor Korhkov:如果你允许的话,他们当然可以。毕竟你的调试器以某种方式管理它。在他控制的机器上运行时,完全保护您的程序免受用户对其做“坏事”几乎是不可能的,通常会导致黑客/作弊者与应用程序程序员之间持续进行军备竞赛。
  • @SLaks, doynax:我当然知道调试器、内核驱动程序、特殊 API 和硬件调试器板。我只是想澄清所需的保护级别。

标签: c windows security


【解决方案1】:

对您的问题的一般回答:不,没有这样的 API 或函数。

但是有不同的方法可以达到相同的结果。 1. API 挂钩。您可以挂钩系统中的函数(例如 WriteProcessMemory),然后检查是否有人试图更改您的进程中的某些内容。更多关于这个here。 2. 调试。您可以在函数或内存更改上使用调试断点。

【讨论】:

    【解决方案2】:

    an API 允许您监控写入特定内存区域的操作。

    UINT GetWriteWatch(
      DWORD     dwFlags,
      PVOID     lpBaseAddress,
      SIZE_T    dwRegionSize,
      PVOID     *lpAddresses,
      ULONG_PTR *lpdwCount,
      LPDWORD   lpdwGranularity
    );
    

    当 API 检测到任何写入操作时,它会将写入地址附加到您作为 API 参数提供的数组中,直到您的数组已满。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多