50.网游逆向分析与插件开发-游戏反调试功能的实现-TP、NP等反调试驱动的原理

前置内容一个调试器工作的状态是什么,工作状态有两种结构一种CreateProcess、一种是通过附加的方式详情看:49.网游逆向分析与插件开发-游戏反调试功能的实现-软件调试器设计的基本原理-CSDN博客

不管是两种里的哪一种,它都有几个问题:

首先CreateProcess它会调用内核里的PSCreateProcess,在调PSCreateProcess的时候,当应用层调用内核层的函数的时候,可以做HOOK接管(内核也是可以HOOK的),或者用回调函数接管,Windows整个设计理念的变化HOOK已经不是一个好的方法了,基本上都用回调函数,接管 PSCreateProcess 函数之后就能知道它的一个调用情况,这样就可以看一下PSCreateProcess(创建进程必须给它程序的路径)创建的进程路径是什么,如果是我们的东西(游戏等)这个时候就返回失败或者其它,连进程都跑不起来更别说调试了,创建进程的这种方式很少,因为会跑不起来,一般都是附加。

附加的时候会调用NtOpenProcess,这个位置就可以做反调试,接管NtOpenProcess就很轻松的发现你现在要调试的进程是什么,如果是我们的东西,这个时候就给返回失败,也就是说 NtOpenProcess 这一步就跑不过去,后面也就不用想了,后面也可以破坏掉,我们破坏的越多将来破解我们东西的人就恢复的越多,攻击我们的难度也就越大。

这两种方式不管哪一种,它都要把DebugPort附加到DebugObject结构体,这是调试子系统和我们整个进程被调试它关联起来的一个重点,另一个重点是可以把DebugPort清零,就是调试器给我们设置了它,那我们就把它的内容给删了。

一个调试器用到的函数还是比较多的,除了打开进程以外还有读进程写进程,这些地方要全部处理掉(把相关函数进行接管)在驱动层这是一个很简单的过程,但是很繁琐,因为驱动层本身编程就很累。

你可能感兴趣的:(游戏,网游逆向)