逆向辅助技术------反检测技术之解除函数屏蔽

逆向开发者在开发过程中,可能有不少人遇到这样的一个问题:

在不开游戏的情况下,某些函数可以正常调用和使用。
但是在游戏运行后。该类函数直接失效。
最典型的例子为FPS 和 DNF。

绝大多数检测成熟的游戏,都会屏蔽键鼠类函数的执行,由安全系统所接管,最典型的函数为mouse_event()

那么有什么办法或者思路来解除这一函数屏蔽呢?答案是有的。

分析:
首先,函数失效,只是针对游戏本身,当游戏最小化之后,函数可以正常调用,说明该保护并不是直接HOOK R0 全局,而是游戏运行后,再去调用HOOK函数。 而微软对内核函数接口开放越来越严格,新出的win10以及新版本的win7系统,想在R0层下HOOK难度也慢慢增大,这也是某些游戏驱动保护,在10系统失效的原因。

      确定了屏蔽函数是在游戏程序中调用而不是全局执行,还需确定以下几点:

1、该屏蔽函数是何时执行(如:游戏启动完毕还是游戏开局之后)

2、该屏蔽函数位于何处(如:某个模块被游戏加载之后,函数才失效,即可确定)

3、找到HOOK mouse_event() 的地方,将其恢复(不一定是直接HOOK mouse_event,更大的可能是HOOK该函数更内层的调用)

先确定第一点:该屏蔽函数是何时执行非常简单,写一个调用mouse_event的程序,不停的来回调用,观察函数何时失效,经测试,某FPS在二次进程通讯后(先出现一个进程,加载模块和驱动,再由被加载的驱动重启并保护该进程),即加载了屏蔽函数。

其次是第二点:该屏蔽函数位于何处在上一条的基础上,在函数失效的瞬间,用PCHunter等第三方工具,观察加载了哪些模块。

只加载了3个模块,而咱们调用函数却失效了,那么屏蔽函数定在这三个模块之中。而其中主模块(exe模块)基本可以忽略,检测手段一般不会存在于主线程当中。那么只剩下xxxbase.dll和 bugxxx.dll。想要测试非常简单,不让其dll加载即可。当然,不加载dll是上不去游戏的,但是不影使mouse_event失效。

在这里插入图片描述
游戏进程存在,但是mouse_event 并未失效,说明屏蔽函数位于xxxbase.dll 某处。

随即,在xxxbase.dll加载之后,内核鼠标钩子中,可观察到内核函数被屏蔽。

到这里,就有多种方法恢复/不让其下HOOK。
1、来到原始函数地址, 写代码直接在R0层恢复原有的模样
2、找到BASE中下HOOK的函数,直接JMP或者NOP不让其执行 (目前市场主流)
3、直接右键用工具恢复HOOK。

发布了8 篇原创文章 · 获赞 0 · 访问量 87

猜你喜欢

转载自blog.csdn.net/qq_41697345/article/details/104757968