反作弊内存扫描

逆向工程 x86 反调试
2021-06-13 13:34:29

问题

我正在附上一个游戏的过程来查看/编辑我的弹药。我已经颠倒了一些游戏并了解了 x86 汇编;但是,我是整个反调试器内存扫描位的新手我已经搜索了有关如何解决此问题的资源,但仍然一无所获。每当我附加到游戏时它仍然有效,但是一旦我更改单个指令,就好像应用程序“扫描”它并检测到我的更改,从而导致崩溃。此外,有时如果我碰巧“绕过”检测,反作弊总是会找到一种方法将我踢出去。

我已经阅读了一些程序可能使用的一些功能,但它们似乎都没有真正的帮助。

问题

  1. 这些游戏/应用程序使用什么来检测这一点?
  2. 有没有办法避免这种检测?
2个回答

关于问题:

  1. 应用程序正在读取代码内存和计算校验和。如果校验和与预定义的值不匹配 - 应用程序会相应地采取行动。
  2. 没有通用且易于解释的方法来避免这种检测。此类操作最常见的一点是修补检查校验和的代码。

在您的情况下,我会尝试保护更改的内存不被读取(例如,通过从注入的 dll调用VirtualProtect)或在更改区域上的读取内存上创建断点并检查将发生更改内存读取的代码区域 - 这将是读取更改代码的位置。您需要使用新更改的代码重新计算校验和,或者修改导致校验和反应不正确的代码。

请注意,您需要更改的校验和代码也可能以相同的方式受到保护。

首先,没有完美的解决方案。在计算机上运行的应用程序会受到各种操纵。你所能做的就是采取一些合理的步骤来防止那些不愿意花费足够资源来找出如何规避你的反作弊措施的人对客户的大多数欺骗和操纵。

您可以采取的几个步骤包括:

  1. 通过随机化链接器来混淆二进制文件。这样,每次推送新版本时,任何内存中的黑客都会发生变化。

  2. 在客户端中嵌入密钥。每次连接到客户端时检查正确的密钥。

  3. 混淆记忆。为每个内存结构设置一组随机的 XOR pad,让内存黑客更难确定如何操作内存。

  4. 校验和。对于每个结构,存储定期验证的所有值的校验和。

  5. 约束验证。对于任何受约束的值,每次将它们用于合理值时,最好在服务器上仔细检查它们。

  6. 登录并禁止。记录任何可疑行为并立即禁止用户。最终,这是对作弊的最好威慑。