反调试手段
调用函数检测方式
----------------------------------------------------
IsDebuggerPresent(检测本进程)
检查进程环境块(PEB)中IsDebugged标志
如果没有被调试就返回0,如果调试附加了进程,函数返回非零值
CheckRemoteDebuggerPresent(检测其他进程)
这个函数和上面的函数检测的原理是一致的,但是他可以检查其他进程是否被调试,他需要一个进程句柄
NtQueryInformationProcess
此函数是Ntdll中的一个原生态的API,它用来提取一个给定的进程信息,第一个参数是进程句柄,第二个参数是想获取的进程相关的信息,如果将此参数设置为ProcessDebugPort(值为0x7),如果该程序被调试,则函数的返回值是调试端口,否则返回0
OutputDebugString
在有调试器存在和没有调试器存在时,OutputDebugString函数表现会有所不同。最明显的不同是, 如果有调试器存在,其后的GetLastError()的返回值为零。
![](https://img2018.cnblogs.com/blog/1541424/201811/1541424-20181120123908490-1630210137.png)
解析:先设置一个错误码,如果函数返回失败,就会重置错误码,相反如果错误码没有变,就证明OutputDebugString返回成功,正在被调试
----------------------------------------------------
手动检查反调试
1.检测BeingDebugged
原理是我们可以检测PEB结构(进程环境块)
我们可以检测FS:[30h]找到PEB的基址,然后检测BeingDebugged标志查看是否被调试
![](https://img2018.cnblogs.com/blog/1541424/201811/1541424-20181120123926585-1800241640.png)
具体代码
2.检测ProcessHeap属性
它处于PEB结构的0X18处,他被设置为加载器为进程分配的第一个堆的位置,第一个堆头有一个属性字段,他告诉这个堆是否在调试器中创建(ForceFlags和Flags)
在XP中ForceFlags位于堆头部偏移量0x10处,在win7他在0x44处
同理在XP中偏移量0x0C或者win7系统中偏离量0x40中查看Flags属性
![](https://img2018.cnblogs.com/blog/1541424/201811/1541424-20181120123951352-1909783599.png)
经过两次解析后检测方式
3检查NTGlobalFlag
检查PEB的0x68处标志位是否为0x70h
--------------------------------------------------
系统痕迹检测
简单的说 如果有调试器调试我们程序,那么在注册表中会有注册表项修改
![](https://img2018.cnblogs.com/blog/1541424/201811/1541424-20181120124019818-1469963047.png)
-----------------------------------------
INT扫描
查看int3 (0xcc)是否存在
执行代码校验和检查
查看CRC或者MD5校验
时钟检测
使用rdstc指令
使用QueryPerformanceCounter和GetTickCount
-------------------------------------------------
使用TLS回调
检测程序是否有.tls段,如果有在IDA中Ctrl+E来查看回调函数,TLS回调函数都拥有一个前缀字符串TlsCallback
![](https://img2018.cnblogs.com/blog/1541424/201811/1541424-20181120124039357-1949061485.png)
使用异常
原理就是我们的调试器通常遇到异常都会自己处理,不会交给程序自己处理,那么利用这一点,恶意代码程序就会检测异常是否由自己实现的异常处理函数处理,如果没有被处理,则视为在已经被调试
破解方法:在我们调试中,可以将所有的异常都由用户自己处理
----------------------------------------------
插入中断
1.插入INT3
双字节操作码0xCD03可以产生INT3中断,这种大部分用在干扰WinDbg,0XCD03会产生一个STATUS_BREAKPOINT异常,在WinDbg中由于断点是单字节0xcc 所以WinDbg会捕获到这个断点,将EIP加1,这样会导致程序错误执行
2.INT 2D
类似的有INT 2D 它与INT3类似,INT2D用来探测内核调试器
--------------------------------------------------
调试器漏洞
1.PE头漏洞
是利用修改PE文件,当OD在加载PE文件时候,导致OD崩溃
错误结果是Bad or Unknown 32-bit Executable File
![](https://img2018.cnblogs.com/blog/1541424/201811/1541424-20181120124058697-1134192020.png)
利用扩展头中的NumberOfRvaAndSizes
这个值普通是0x10,如果这个值大于0x10后,Winodws加载器会忽略这个值,但是OD在使用的时候,发现大于0x10,OD则会崩溃
还有一种PE头欺骗,就是当弹出"File contains too much data" 这是因为PE文件的扩展头中
![](https://img2018.cnblogs.com/blog/1541424/201811/1541424-20181120124110967-1511406003.png)
2.OutputDebugString漏洞