180307 逆向-反调试技术(2)CheckRemoteDebuggerPresent

本文介绍了Windows系统的两种反调试技术:CheckRemoteDebuggerPresent和ThreadHideFromDebugger。CheckRemoteDebuggerPresent通过NtQueryInformationProcess检测调试器,而ThreadHideFromDebugger利用ZwSetInformationThread来隐藏线程,防止调试事件的发生。

1625-5 王子昂 总结《2018年3月7日》 【连续第522天总结】
A. 反调试技术(2)
B.

CheckRemoteDebuggerPresent

BOOL CheckRemoteDebuggerPresent(
HANDL hProcess, 
PBOOL pbDebuggerPresent
);

这是另外一个MSDN上提供的检测调试器的函数,测试发现及时修改BeingDebugged标志也会被检测到

这个函数的核心代码只有一句话,就是对NtQueryInformationProcess的调用。
NtQueryInformationProcess不是Win32API,而是NativeAPI。
大多NativeAPI都是未文档化的,因此没有源码和使用说明。不过GaryNebbett写了一本参考手册《Windows NT 2000 Native API Reference》

手册中写着CheckRemoteDebuggerPresent调用了NtQueryInformationProcess的第7个值ProcessDebugPort
这个值是系统用来与调试器通信的端口句柄,若将其设为0,系统就不会向用户态调试器发送调试事件通知,调试器当然就无法工作了

到了这一步,自然想到通过NtSetInformationProcess函数将DebugPort设为0。不过可惜的是说明中写明了“调试端口仅能在初始状态(即为0)时设置”,因此无法在调试器启动进程后修改Port

ThreadHideFromDebugger

虽然NtSetInformationProcess这条路走不通,但是显然NativeAPI中存在着一些接近内核态的东西
ZwSetInformationThread这个API可以设置一个线程相关的信息,而ThreadInformationClass的最后一项就是ThreadHideFromDebugger
当该值被设置为True时,会禁止进程产生调试事件。

原理是
如果当前进程成功映射了一个映像,并跟一个调试端口关联起来,就会通知调试器发生了LOAD_DLL_DEBUG_EVENT事件。但是如果线程的HideFromDebugger为TRUE,那么在通知之前就会返回,使得调试器对进程一无所知

C. 明日计划
反调试技术(3)

## Features ### Anti-debugging attacks - IsDebuggerPresent - CheckRemoteDebuggerPresent - Process Environement Block (BeingDebugged) - Process Environement Block (NtGlobalFlag) - ProcessHeap (Flags) - ProcessHeap (ForceFlags) - NtQueryInformationProcess (ProcessDebugPort) - NtQueryInformationProcess (ProcessDebugFlags) - NtQueryInformationProcess (ProcessDebugObject) - NtSetInformationThread (HideThreadFromDebugger) - NtQueryObject (ObjectTypeInformation) - NtQueryObject (ObjectAllTypesInformation) - CloseHanlde (NtClose) Invalide Handle - SetHandleInformation (Protected Handle) - UnhandledExceptionFilter - OutputDebugString (GetLastError()) - Hardware Breakpoints (SEH / GetThreadContext) - Software Breakpoints (INT3 / 0xCC) - Memory Breakpoints (PAGE_GUARD) - Interrupt 0x2d - Interrupt 1 - Parent Process (Explorer.exe) - SeDebugPrivilege (Csrss.exe) - NtYieldExecution / SwitchToThread - TLS callbacks ### Anti-Dumping - Erase PE header from memory - SizeOfImage ### Timing Attacks [Anti-Sandbox] - RDTSC (with CPUID to force a VM Exit) - RDTSC (Locky version with GetProcessHeap & CloseHandle) - Sleep -> SleepEx -> NtDelayExecution - Sleep (in a loop a small delay) - Sleep and check if time was accelerated (GetTickCount) - SetTimer (Standard Windows Timers) - timeSetEvent (Multimedia Timers) - WaitForSingleObject -> WaitForSingleObjectEx -> NtWaitForSingleObject - WaitForMultipleObjects -> WaitForMultipleObjectsEx -> NtWaitForMultipleObjects (todo) - IcmpSendEcho (CCleaner Malware) - CreateWaitableTimer (todo) - CreateTimerQueueTimer (todo) - Big crypto loops (todo) ### Human Interaction / Generic [Anti-Sandbox] - Mouse movement - Total Physical memory (GlobalMemoryStatusEx) - Disk size using DeviceIoControl (IOCTL_DISK_GET_LENGTH_INFO) - Disk size using GetDiskFreeSpaceEx (TotalNumberOfBytes) - Mouse (Single click / Double click) (todo) - DialogBox (todo) - Scrolling (todo) - Execution after reboot (todo) - Count of processors (Win32/Tinba - Win32/Dyre) - Sandbox k
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值