Windows反调试实现与绕过姿势汇总

调试器检测

PEB相关

BeingDebugged

BeingDebugged是位于PEB(Process Environment Block,进程环境块)偏移0x2处的标志。

IsDebuggerPresent()

IsDebuggerPresent()是Windows的API,这个函数通过查询PEB中的BeingDebugged标志来判断当前进程是否处于被调试状态。

NtGlobalFlag

NtGlobalFlag位于PEB的0x068h处,如果BeingDebugged被设置为TRUE,则NtGlobalFlag的值为70h。

CheckRemoteDebuggerPresent()

CheckRemoteDebuggerPresent( )与IsDebuggerPresent( )类似,同为Windows API,可以直接调用,CheckRemoteDebuggerPresent()实际调用了NtQueryInformationProcess(),查询某个进程的ProcessDebugPort即系统与调试器通信的端口句柄,CheckRemoteDebuggerPresent()通过查询这个值来确定程序是否处于调试状态。

反调试技术


知识点

反调试技术,恶意代码用它来识别自身是否被调试,或者让调试器失效,或者通过反调试技术盐城分析人员对代码的分析时间,为了组织调试器的分析,当恶意代码意识到自己被调试时,他们可能改变正常的执行路径或者修改自身程序让自己崩溃,从而增加调试时间和复杂度。

探测Windows调试器:恶意代码会使用多种技术探测调试器调试它的痕迹,其中包括使用Windows API、手动检测调试器人工痕迹的内存结构,查询调试器遗留在系统中的痕迹等。调试器探测时恶意代码常用的反调试技术。

使用Windows API函数:使用Windows API函数探测调试器是否存在时最简单的反调试技术,Windows提供了一些函数可以让应用程序调用这些API来探测自己是否被调试。这些API中有些时专门来探测调试器存在的,而另一些API时处于其他目的而设计的。通常方式恶意代码使用API函数进行反调试的最简单方法是在恶意代码运行期间修改恶意代码,使其不能调用探测调试器的API函数,或者修改这些函数的返回值,也可以通过挂钩这些函数,如使用rootkit技术,下列时恶意代码常用来探测调试器的API函数:

  • IsDebuggerPresent:这是探测调试器最简单的API函数。它查询进程环境块(PEB)中的IsDebugged标志。如果进程没有运行在调试环境中,则函数返回0,否侧返回一个非0值。
  • CheckRemoteDebuggerPresent:这个函数跟IsDebuggerPresent很类似,它也查询进程环境块(PEB)中的IsDebugged标志。它可以探测自身进程或者系统其它进程是被调试,这个函数将一个句柄作为参数,检查这个句柄对应的进程是否被其他调试器附加。
  • NtQueryInformationProcess:这个函数时Ntdll.dll中的一个原生态API,它用来提取一个进程的信息,他的第一个参数是进程句柄,第二个参数告诉我们它需要提取进程信息的类型,例如将该参数设置为哦ProcessDebugPort,将会告诉你这个句柄标识的进程是否被调试。如果进程正在被调试,则返回被调试的端口,否则返回0.
  • OutputDebugString:这个函数的作用是在调试器中显示一个字符串,先通过SetLastError函数为当前的错误码设置一个随机的值,然后调用OutputDebugString,如果当前进程没有被调试则OutputDebugString的调用不会影响错误码的值。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×