BattleEye有一个EAC与TP不具备的特性,那就是拦截DLL注入。
BattleEye注册了一个minifilter用其自定义的白名单策略过滤每一个加载进入游戏的DLL。
secret.club提出了一种纯ring3的绕过方式。
https://secret.club/2020/02/26/be_umode.html
不过当BEService转到syscall实现功能(必定附带VM),这个方法将会失效。
或者
也有一种内核级的绕过方式,首先挂起BE驱动的线程,其次劫持系统minifilter回调表中BE注册的回调,待注入DLL完毕后恢复劫持,恢复驱动线程。
此方法最稳定,但是这种攻击需要对每个内核版本进行适配。而且BE会有一个短时间的心跳超时。
于是本文提出另一种绕过方式,ring0级
minifilter拦截DLL加载实际上是通过使NtCreateSection失败实现的。
NtCreateSection 是操作系统装载DLL的一个重要过程,操作系统在ntdll里面实现DLL的装载过程中需要用到此函数生成的句柄。
于是存在一种绕过,即被注入程序不进行 NtCreateSection 操作确能获得句柄即可。
https://github.com/MoePus/AntiBEAntiDllInjection
我实现了一种不进行 NtCreateSection却得到句柄的方式。同理利用子进程取句柄,或者在内核中Hook(或ETW HOOK)均可实现注入。