反调试技术——常用技术介绍

本篇文章用来总结大概的反调试技术,并不详细,仅作概述。
反调试技术恶意代码和一些软件用来防止代码被动态调试的一项技术。

一、探测Windows调试器

通过调试的痕迹去识别是否正在被调试。
1.WindowsAPI
1.1 IsDebuggerPresent
IsDebuggerPresent查询进程环境块(PEB)中的IsDebugged标志。如果进程没有运行在调试器环境中,函数返回0;如果调试附加了进程,函数返回一个非零值。
1.2 CheckRemoteDebuggerPresent
CheckRemoteDebuggerPresent同IsDebuggerPresent几乎一致。它不仅可以探测系统其他进程是否被调试,通过传递自身进程句柄还可以探测自身是否被调试。
1.3 NtQueryInformationProcess
这个函数是Ntdll.dll中一个API,它用来提取一个给定进程的信息。它的第一个参数是进程句柄,第二个参数告诉我们它需要提取进程信息的类型。为第二个参数指定特定值并调用该函数,相关信息就会设置到第三个参数。第二个参数是一个枚举类型,其中与反调试有关的成员有ProcessDebugPort(0x7)、ProcessDebugObjectHandle(0x1E)和ProcessDebugFlags(0x1F)。例如将该参数置为ProcessDebugPort,如果进程正在被调试,则返回调试端口,否则返回0。
1.4 OutputDebugString
在调试器中显示一个字符串,同时也用来探测调试器是否存在。

2.手动检测数据结构
2.1 检测CeingDebugged属性
2.2 检测ProcessHeap属性
2.3 检测NTGlobalFlag

3.系统痕迹检测
3.1 FindWindows
3.2 文件和目录
3.3 注册表
3.4 查看当前进程是否有调试相关进程
3.5 查看当前窗口中是否有相关窗口

二、识别调试器的行为

在逆向工程中,为了帮助恶意代码分析人员进行分析,可以使用调试器设置一个断点,或是单步执行一个进程。然而,在调试器中执行这些操作时,它们会修改进程中的代码。因此,恶意代码常使用几种反调试技术探测软件/硬件断点、完整性校验、时钟检测等几种类型的调试器行为。
1.INT扫描
检查INT3 指令 0CCh
2.执行代码校验和检查
CRC/MD5/硬件断点
3.时钟检测
被调试时,进程的运行速度大大降低。
3.1 rdstc指令
3.2 QueryPerformanceCounter和GetTickCount
4.判断父进程是否是explorer.exe
一般程序的父进程为explorer.exe,被调试的进程一般为调试器进程。

三.干扰调试器的功能

1.使用TLS回调
tls回调函数在程序入口点之前执行,可以写入功能用来干扰调试。
2.使用异常
2.1RaiseException
RaiseException函数产生的若干不同类型的异常可以被调试器捕获。
3.插入中断
3.1 INT3
3.2 INT 2D 探测内核态的调试器。
3.3 插入ICE断点
片内仿真器断点指令icebp。

四、调试器漏洞

1.PE头漏洞
对抗这种饭调试技术:利用十六进制编辑器手动修改PE头部。
2.OutputDebugString漏洞

以上为反调试技术的大体概括,深入学习,需要针对以上的每种方式进行深入学习。

相关书籍:《恶意代码分析与实战》

警示自己:学习不可好高骛远,切记心静,持之以恒。

发布了23 篇原创文章 · 获赞 26 · 访问量 1337

猜你喜欢

转载自blog.csdn.net/weixin_43742894/article/details/105278690