恶意样本分析--16Windows中一些常用的反调试记录

本文详细介绍了Windows系统中常见的反调试技术,包括API检测如IsDebuggerPresent、CheckRemoteDebuggerPresent和NtQueryInformationProcess,PEB结构的BeingDebugged、NtGlobalFlag和ProcessHeap标志的检查,以及其他手段如INT指令检测、时间检测和TLS回调等。同时,文章提供了对抗这些反调试方法的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows中一些常用的反调试记录

这里笔记会记录一些关于Windows中的反调试技术的汇编代码,方便后续分析程序时回来查看。反调试技术包括

  • Windows APIs 调用
  • 其他手段检测调试器

Windows APIs

IsDebuggerPresent

这个函数主要检测的是PEBIsDebugged标志,如果返回非零值则表示被调试

CheckRemoteDebuggerPresent

这个函数和IsDebuggerPresent函数一样也是检测PEB->IsDebugged状态值, 不过还可以检测其他进程是否被调试,此时需要传入的是目标进程的句柄。

对抗方法:

1、找一些辅助插件过掉

2、动态调试阶段修改指令

**3、动态调试阶段改变状态寄存器 **

4、修改二进制的指令

NtQueryInformationProcess

这个ntdll.dll内的一个原生API,目的是用来提取指定进程的信息

函数原型

__kernel_entry NTSTATUS NtQueryInformationProcess(
  IN HANDLE           ProcessHandle,
  IN PROCESSINFOCLASS ProcessInformationClass,
  OUT PVOID           ProcessInformation,
  IN ULONG            ProcessInformationLength,
  OUT PULONG          ReturnLength
);

这里的ProcessInformatinoClass是一个枚举量,当ProcessInformationClass=ProcessDebugport,例如ProcessDebugport=0x70或者别的调试器端口号就能判断指定的进程是否被调试,如果是则返回调试端口,否则返回0.

对抗方法:

1、找一些辅助插件过掉

2、动态调试阶段修改指令

**3、动态调试阶段改变状态寄存器 **

4、修改二进制的指令

OutputDebugString

函数的目的是在调试器中显示一个字符串以检测调试器是否存在。

使用方法:

  • 调用SetLastError函数设置一个任意值,例如0x111
  • 调用OutputDebugString 函数,如果这个函数调用失败,SetLastError函数就会被系统分配一个新的值
  • 调用GetLastError来判断是否是设定的值,例如0x111

代码片段如下

DWORD errorValue=0x111;
SetLastError(errorValue);
OutputDebugString("Test for Debugger!");
if(GetLastError() == errorValue)
{
    printf("Debugger was attached !\n");
    ExistProcess();
}
printf("Normal procedure!!\n");

如下使用OD调试时的截图,检测出调试器附加

在这里插入图片描述

注:直接使用VisualStudio2015编译执行也是会提示debugger存在,估计是环境不对?

在这里插入图片描述

不过需要记住这个检测手段即可,再之后分析中遇到多注意。

对抗方法:

1、找一些辅助插件过掉

2、动态调试阶段修改指令

**3、动态调试阶段改变状态寄存器 **

4、修改二进制的指令

检测数据结构PEB

检测BeingDebugged

这个反调试检测或多或少都遇到了,例如

mov eax,dword ptr fs:[30];
mov ebx,byte ptr [eax+0x2];
test ebx,ebx;检测这个是否为零
jz NoDebuggerDetected

或者

push dword ptr fs:[30];
pop ebx;
cmp byte ptr [ebx+0x2],1;检测是否大于1,正常应该是小于1
je DebuggerDetected;跳转到调试器检测

这里的PEB是存在fs:[30]段寄存器中,结构为


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值