首页
社区
课程
招聘
[翻译]Windows系统下的反调试机制(翻译自Symantec官网)
发表于: 2019-6-23 03:57 9086

[翻译]Windows系统下的反调试机制(翻译自Symantec官网)

2019-6-23 03:57
9086
[1]引言

本文对基于Windows NT的操作系统上使用的几种反调试技术进行了分类和介绍。
反调试技术是程序检测它是否在调试器(Debugger)下运行的方法。反调试技术被用于商业可执行程序的保护,加壳工具以及病毒等,以杜绝或减缓软件被逆(向工程)

我们假设程序是在r3 debugger下进行分析的,例如Windows平台上的OD。本文面向逆向工程师和恶意软件分析师。
请注意,我们将纯粹谈论通用的反调试和反跟踪技术。此文不会涉及特定的调试器检测,例如窗口或进程的枚举,注册表扫描等。

[2]反调试和反跟踪技术

- 利用内存差

(1) kernel32!IsDebuggerPresent
如果正在调试进程,则IsDebuggerPresent返回1,否则返回0。此API只读取PEB!BeingDebugged 的byte-flag(位于PEB结构中的偏移 2)。
绕过它就只需要 PEB!BeingDebugged 设置为 0
例:
call IsDebuggerPresent
test eax, eax
jne @DebuggerDetected
...

call IsDebuggerPresent
test eax, eax
jne @DebuggerDetected
...


(2) PEB!IsDebugged
该字段引用进程的Process Environment Block(进程环境块/区间?)中的第二个字节. 被调试期间会由系统设置为非0, 该字节可以被重置为0,而不会对程序的执行过程产生影响(因为这是一个信息标志).
例:
mov eax, fs:[30h]
mov eax, byte [eax+2]
test eax, eax
jne @DebuggerDetected
...

mov eax, fs:[30h]
mov eax, byte [eax+2]
test eax, eax
jne @DebuggerDetected
...

(3) PEB!NtGlobalFlags
当有进程被创建时,系统会设置一些标志,这些标志将定义各种API对此进程的行为。这些标志可以在PEB中被读取,位于偏移量0x68的DWORD中.
默认情况下,根据是否在Debugger下创建了进程而设置不同的NtGlobalFlags标志。如果调试了该进程,将出现一些控制ntdll中的常规堆栈操作的flags:
FLG_HEAP_ENABLE_TAIL_CHECK,
FLG_HEAP_ENABLE_FREE_CHECK,
FLG_HEAP_VALIDATE_PARAMETERS.
可以通过重置NtGlobalFlags字段来绕过这种反调试技术。
例:
mov eax, fs:[30h]
mov eax, [eax+68h]
and eax, 0x70
test eax, eax
jne @DebuggerDetected
...

mov eax, fs:[30h]
mov eax, [eax+68h]
and eax, 0x70
test eax, eax
jne @DebuggerDetected
...


(4) Heap flags(堆栈标志)
如前所述,NtGlobalFlags标注常规堆栈将会出现什么样的行为。虽然很容易修改PEB字段,但如果堆栈的行为与程序未被调试的时候的行为方式不同,则可能会出现问题。这是一个挺厉害的反调试机制,因为进程堆很多,并且它们的chunks可以单独受FLG_HEAP_* flags(例如chunk尾端)的影响。堆栈头部也会受到影响。例如,检查堆栈头中的字段ForceFlags(偏移量0x10)可用于检测Debugger的存在与否。

有两种简单的方法来避开这种检测机制:

 - 1.创建一个未被调试的进程,并在创建进程后附加调试器(一个简单的解决方案是创建进程挂起,直至运行达到Entry-Point,将Entry-Point跳转至无​​限循环,恢复进程,附加调试器,并恢复原始Entry-Point)。

 - 2.通过注册表项“HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”强制NtGlobalFlags为我们要调试的进程赋值:创建一个名为你要运行的进程名称的子键(非值),并在这个子键,String值“GlobalFlags”设置为空。

例:
mov eax, fs:[30h]
mov eax, [eax+18h] ;process heap
mov eax, [eax+10h] ;heap flags
test eax, eax
jne @DebuggerDetected
...

mov eax, fs:[30h]
mov eax, [eax+18h] ;process heap
mov eax, [eax+10h] ;heap flags
test eax, eax
jne @DebuggerDetected
...


(5) Vista anti-debug (没起名字)
我估计没人再用Vista了,再加上我对Vista机制也不熟悉,就偷了个懒。原文如下:
Here's an anti-debug specific to Windows Vista that I found by comparing memory dumps of a program running with and without control of a debugger. I'm not sure of its realiability, but it's worth mentionning (tested on Windows Vista 32 bits, SP0, English version).

When a process is debugged, its main thread TEB, at offset 0xBFC, contains a pointer to a unicode string referencing a system dll. Moreover, the string follows this pointer (therefore, located at offset 0xC00 in the TEB). If the process is not debugged, the pointer is set to NULL and the string is not present.

Example:
call GetVersion
cmp al, 6
jne @NotVista
push offset _seh
push dword fs:[0]
mov fs:[0], esp
mov eax, fs:[18h] ; teb
add eax, 0BFCh
mov ebx, [eax] ; pointer to a unicode string
test ebx, ebx ; (ntdll.dll, gdi32.dll,...)
je @DebuggerNotFound
sub ebx, eax ; the unicode string follows the
sub ebx, 4 ; pointer
jne @DebuggerNotFound
;debugger detected if it reaches this point
;...

call GetVersion
cmp al, 6
jne @NotVista
push offset _seh
push dword fs:[0]
mov fs:[0], esp
mov eax, fs:[18h] ; teb
add eax, 0BFCh
mov ebx, [eax] ; pointer to a unicode string
test ebx, ebx ; (ntdll.dll, gdi32.dll,...)
je @DebuggerNotFound
sub ebx, eax ; the unicode string follows the
sub ebx, 4 ; pointer
jne @DebuggerNotFound
;debugger detected if it reaches this point
;...



- 利用系统差

(1) NtQueryInformationProcess
ntdll!NtQueryInformationProcess 是ZwQueryInformationProcess系统调用的打包
它的原型如下:
NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess(
IN HANDLE ProcessHandle,
IN PROCESS_INFORMATION_CLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength
);

NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess(
IN HANDLE ProcessHandle,
IN PROCESS_INFORMATION_CLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength
);

当被call时的ProcessInformationClass被设置为7(ProcessDebugPort constant)时,进程被调试的话,系统会将ProcessInformation 设置为 -1.
这是一个强大的反调试机制,没有很简单的方法来绕开。但是,如果跟踪程序,则可以在syscall返回时修改ProcessInformation。
另一种解决方案是使用系统驱动Hook ZwNtQueryInformationProcess
绕过NtQueryInformationProcess将能绕过许多反调试机制的检测(例如CheckRemoteDebuggerPresent或UnhandledExceptionFilter)
例:
push 0
push 4
push offset isdebugged
push 7 ;ProcessDebugPort
push -1
call NtQueryInformationProcess
test eax, eax
jne @ExitError
cmp isdebugged, 0
jne @DebuggerDetected
...

push 0
push 4
push offset isdebugged
push 7 ;ProcessDebugPort
push -1
call NtQueryInformationProcess
test eax, eax
jne @ExitError
cmp isdebugged, 0
jne @DebuggerDetected
...

(2) kernel32!CheckRemoteDebuggerPresent
此API有两个参数:Process Handle,Ptr* DWORD. 如果调用成功,则在调试进程时,DWORD值将设置为1。
内部来说,此API将ProcessInformationClass设置为ProcessDebugPort (7)后调用ntdll!NtQueryInformationProcess
例:
push offset isdebugged
push -1
call CheckRemoteDebuggerPresent
test eax, eax
jne @DebuggerDetected
...

push offset isdebugged
push -1
call CheckRemoteDebuggerPresent
test eax, eax
jne @DebuggerDetected
...


(3) UnhandledExceptionFilter
当发生异常时,使用Windows XP SP>=2,Windows 2003和Windows Vista时,操作系统处理异常的常用方法是:

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-6-24 03:02 被一个菜鸟Andy编辑 ,原因: Update
收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 13992
活跃值: (17371)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
mark,lz辛苦了
2019-6-23 13:43
0
雪    币: 422
活跃值: (835)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持一下
PS: "利用系统差" 下面的空行是什么情况....
2019-6-23 13:48
0
雪    币: 12275
活跃值: (5018)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

学习了,多谢楼主分享
2019-6-23 14:39
0
雪    币: 428
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
流星暴雨 支持一下 PS: "利用系统差" 下面的空行是什么情况....
不好意思哈,当时多打了个Text Plain  
2019-6-24 02:09
0
雪    币: 428
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
准备继续翻译了,等会见 兄弟们
最后于 2019-6-24 02:10 被一个菜鸟Andy编辑 ,原因:
2019-6-24 02:10
0
雪    币: 199
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
OiZ
7
原文的链接有吗
2019-7-5 23:45
0
游客
登录 | 注册 方可回帖
返回
//