ShellCode
最近, BE的ShellCode被转储在网上, 我们决定写一篇关于BE 当前迭代的内容正在寻找的内容. 我们在过去的6个月没使用过BattlEye, 所以我们所用的最后一个shellcode很可能已经过时了. 在最近的转储中, 代码的各个部分完全从内存中识别出来, 这说明BE 只附加到shellcode并且不会删除以前的检测过程或者步骤.
How?
BE可能会将其shellcode从服务器流式传输到windows服务器, 称为BEService. 该服务与位于游戏开始时内部的模块进行通信, 称为BEClient. 通过namedpipe \\.\namedpipe\Battleye完成通信并且直到去年为止都没有进行加密. 现在,所有通信都通过带有非常小的密匙的xor密码进行加密, 使得已知的明文攻击变得基本毫无软用. 当shellcode已经流式传输到客户端时, 它将在任何已知模块之外进行分配和执行, 从而使分区变得容易. 要转储shellcode, 你可以hook那些流行的windows-api函数, 比如CreateFile, ReadFile等, 并转储任何调用者的相应内存部分(查询返回地址的内存信息), 这些部分位于任何已知模块之外, 或定期扫描游戏的虚拟内存空间, 用于任何已知模块之外的可执行内存, 并将其转储到磁盘. 确保跟踪你已经转储的部分这样就不会得到数千个相同的转储.
Disclaimer
一下伪代码部分被大量美化(简化). 你将无法转储BattlEye shellcode 并且立即识别其中一些部件; shellcode不包含任何函数调用, 并且许多算法都是被展开的. 这并不重要, 因为当你读完这个反作弊的时候, 你迟早可以绕过它
Memor Enumeration(内存枚举)
反作弊解决方案最常用的检测机制是内存枚举和内存扫描, 以检测已知的作弊图像. 只要你不忘记基本的汇编并将常用功能序列列入黑名单, 它就很容易实现并且非常有效, 正如我们过去所见.
Battleye 枚举游戏进程的整个地址空间(这个过程在下面的内容), 并在可执行页面时以及在相应的shellcode内存空间之外运行各种检查.
内存异常
BattlEye将标记内存地址空间中的任何异常, 主要是与加载的映像不对应的可执行内存部分.