探索黑客技术攻防,实战研究与安全创新

导航菜单

反调试检测

反调试技术是一种常见的反检测技术,因为恶意软件总是企图监视自己的代码以检测是否自己正在被调试。为做到这一点,恶意软件可以通过检查自己代码是否被设置了断点,或者直接通过系统调用来检测调试器。本文危险漫步就为大家介绍一下常见的调试检测方法,并以实战编码的方式为大家讲解。首先来看一下常见的检测调试的方法。

1、断点检测

为了检测其代码是否被设置断点,目标软件可以查找指令操作码Oxcc(调试器会使用该指令在断点处取得恶意软件的控制权),它会引起一个SIGTRAP。如果目标软件代码本身建立了一个单独的处理程序的话,目标软件也可以设置伪断点。用这种方法目标软件可以在被设置断点的情况下继续执行其指令,这样也就可以执行发现被调试后的特定代码。

2、计算校验和

恶意软件也可以计算自身的校验和,如果校验和发生变化,那么病毒会假定它正在被调试,并且其代码内部已被放置断点。VAMPiRE是一款抗反调试工具,可用来逃避断点的检测。VaMPiRE通过在内存中维护一张断点表来达到目的,该表记录已被设置的所有断点。该程序由一个页故障处理程序(PFH),一个通用保护故障处理程序(GPFH),一个单步处理程序和一个框架API组成。当一个断点被触发的时候,控制权要么传给PFH(处理设置在代码、数据或者内存映射I/O中的断点),要么传给GPFH(处理遗留的I/O断点)。单步处理程序用于存放断点,使断点可以多次使用。

}ND62KXO6NJ1_$CB4QA}@EX.jpg

3、检测调试器

在Linux系统上检测调试器有一个简单的方法,只要调用Ptrace即可,因为对于一个特定的进程而言无法连续地调用Ptrace两次以上。在Windows中,如果程序目前处于被调试状态的话,系统调用isDebuggerPresent将返回1,否则返回0。这个系统调用简单检查一个标志位,当调试器正在运行时该标志位被置1。直接通过进程环境块的第二个字节就可以完成这项检查。

eax被设置为PEB(进程环境块),然后访间PEB的第二个字节,并将该字节的内容移入eax。通过查看eax是否为零,即可完成这项检测。如果为零,则不存在调试器:否则,说明存在一个调试器。

如果某个进程为提前运行的调试器所创建的,那么系统就会给ntdll.dll中的堆操作例程设置某些标志,这些标志分别是FLG_HEAP_ENABLE_TALL_CHECK、FLGL HEAP_ENABLE__ FRF,E—CHECK和FLG__ HEAP_ VALIDATE__ PARAMETERS。

我们还是访问PEB,然后通过将PEB的地址加上偏移量68h到达堆操作例程所使用的这些标志的起始位置,通过检查这些标志就能知道是否存在调试器。

另一种检测调试器的方法是,使用NtQueryInformationProcess这个系统调用。我们可以将ProcessInformationClass设为7来调用该函数,这样会引用ProcessDebugPort,如果该进程正在被调试的话,该函数将返回-1。示例代码如下所示。

本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。