LyShark®

信息安全电子刊物出版品牌

NtGlobalFlag 是一个`Windows`内核全局标记,在`Windows`调试方案中经常用到。这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关、造成崩溃的错误代码和处理方式等等。通过改变这个标记,可以在运行时设置和禁用不同的调试技术和错误处理方式,比如调试器只能访问当前进程、只允许用户模式调试、启用特定的错误处理方式等等。但由于`NtGlobalFlag`标记是内核全局标记,其改变会影响整个系统的行为,需要谨慎处理。

阅读全文 »

BeingDebugged 是`Windows`系统`PEB`结构体中的一个成员,它是一个标志位,用于标识当前进程是否正在被调试。BeingDebugged的值为0表示当前进程未被调试,值为1表示当前进程正在被调试。由于`BeingDebugged`是在`PEB`结构体中存储的,因此可以通过访问`PEB`结构体来获取`BeingDebugged`的值。恶意软件可以使用`BeingDebugged`来判断自己是否正在被调试,以此来防止被反病毒工程师或调试程序进行分析。反病毒工程师们也可以通过检查`BeingDebugged`的值来判断程序是否正被调试从而进行恶意软件的检测和分析。

阅读全文 »

CheckRemoteDebuggerPresent 也是一个微软提供的反调试函数,该函数可以在本地或者远程进程中使用。函数接收两个参数进程句柄和一个指向布尔值的指针。如果指定的进程正在被调试,则函数会把指向布尔值的指针设为 TRUE,否则设为FALSE。

阅读全文 »

STARTUPINFO 结构体,可以用来指定新进程的主窗口外观风格、背景颜色、标题等信息,也可以用来实现反调试技术。通常情况下,我们可以将`STARTUPINFO`结构体中的`dwFlags`成员设置为`STARTF_DEBUGONLYTHISPROCESS`,以防止调试器附加到当前进程。设置了`STARTF_DEBUGONLYTHISPROCESS`后,如果尝试通过调试器附加到该进程,则调试器将直接失败并退出。

阅读全文 »

首先这是一种比较奇特的反调试思路,通过检测自身父进程来判定是否被调试,原理非常简单,我们的系统在运行程序的时候,绝大多数应用程序都是由`Explorer.exe`这个父进程派生而来的子进程,也就是说如果没有被调试其得到的父进程就是`Explorer.exe`的进程PID,而如果被调试则该进程的父进程PID就会变成调试器的PID值,通过对父进程的检测即可实现检测是否被调试的功能。

阅读全文 »

通常可以通过在程序中设置异常处理函数,并在其中发起一个异常,然后判断程序是否已经被调试器附加来实现反调试。如果异常处理函数没有被触发,则说明程序已经被调试器附加;如果异常处理函数被触发,则说明程序没有被调试器附加。

阅读全文 »

ProcessHeap 是`Windows`进程的默认堆,每个进程都有一个默认的堆,用于在进程地址空间中分配内存空间。默认情况下`ProcessHeap`由内核进行初始化,该堆中存在一个未公开的属性,它被设置为加载器为进程分配的第一个堆的位置(进程堆标志),`ProcessHeap`标志位于`PEB`结构中偏移为`0x18`处,第一个堆头部有一个属性字段,这个属性叫做`ForceFlags`属性偏移为`0x44`,该属性为0说明程序没有被调试,非0说明被调试,另外的`Flags`属性为2说明被调试,不为2则说明没有被调试。

阅读全文 »

RDTSC时钟检测同样可实现反调试检测,使用时钟检测方法是利用`rdtsc`汇编指令,它返回至系统重新启动以来的时钟数,并且将其作为一个64位的值存入`EDX:EAX`寄存器中,通过运行两次`rdstc`指令,然后计算出他们之间的差值,即可判定对方是否在调试我们的程序。

阅读全文 »

反调试技术是指恶意程序中使用的一些手段,用于防止被反病毒工程师或调试程序进行分析。恶意程序使用反调试技术以判断自身是否正在被调试并有意识地阻止调试行为的进行。除了防止恶意程序被分析和检测之外,反调试技术还可用于保护合法程序不被恶意破解。实现反调试技术的方式有多种,本章将依次介绍这些反调试技术的实现原理,并使用C语言实现这些技术。

阅读全文 »

动态反汇编调试器是一种软件工具,用于分析和调试二进制程序的执行过程。它能够将二进制程序转换为可读的汇编代码,并提供了一系列的调试功能,帮助开发人员理解和控制程序的执行流程,本篇文章将重点分析动态反汇编调试软件中,软件断点,硬件断点,内存断点,寄存器参数,单步步入,步过,反汇编等功能的实现原理。

阅读全文 »