反调试手段

调用函数检测方式
----------------------------------------------------
IsDebuggerPresent(检测本进程)
检查进程环境块(PEB)中IsDebugged标志
如果没有被调试就返回0,如果调试附加了进程,函数返回非零值
 
CheckRemoteDebuggerPresent(检测其他进程)
这个函数和上面的函数检测的原理是一致的,但是他可以检查其他进程是否被调试,他需要一个进程句柄
 
NtQueryInformationProcess
此函数是Ntdll中的一个原生态的API,它用来提取一个给定的进程信息,第一个参数是进程句柄,第二个参数是想获取的进程相关的信息,如果将此参数设置为ProcessDebugPort(值为0x7),如果该程序被调试,则函数的返回值是调试端口,否则返回0
 
OutputDebugString
在有调试器存在和没有调试器存在时,OutputDebugString函数表现会有所不同。最明显的不同是, 如果有调试器存在,其后的GetLastError()的返回值为零。
解析:先设置一个错误码,如果函数返回失败,就会重置错误码,相反如果错误码没有变,就证明OutputDebugString返回成功,正在被调试
 
----------------------------------------------------
手动检查反调试
1.检测BeingDebugged
原理是我们可以检测PEB结构(进程环境块)
我们可以检测FS:[30h]找到PEB的基址,然后检测BeingDebugged标志查看是否被调试

具体代码

 

2.检测ProcessHeap属性
它处于PEB结构的0X18处,他被设置为加载器为进程分配的第一个堆的位置,第一个堆头有一个属性字段,他告诉这个堆是否在调试器中创建(ForceFlags和Flags)
在XP中ForceFlags位于堆头部偏移量0x10处,在win7他在0x44处
同理在XP中偏移量0x0C或者win7系统中偏离量0x40中查看Flags属性
经过两次解析后检测方式
 
3检查NTGlobalFlag
检查PEB的0x68处标志位是否为0x70h

 

--------------------------------------------------
系统痕迹检测
简单的说 如果有调试器调试我们程序,那么在注册表中会有注册表项修改

 

-----------------------------------------
INT扫描
查看int3 (0xcc)是否存在
 
执行代码校验和检查
查看CRC或者MD5校验
 
时钟检测
使用rdstc指令
使用QueryPerformanceCounter和GetTickCount
 
-------------------------------------------------
使用TLS回调
检测程序是否有.tls段,如果有在IDA中Ctrl+E来查看回调函数,TLS回调函数都拥有一个前缀字符串TlsCallback
使用异常
原理就是我们的调试器通常遇到异常都会自己处理,不会交给程序自己处理,那么利用这一点,恶意代码程序就会检测异常是否由自己实现的异常处理函数处理,如果没有被处理,则视为在已经被调试
破解方法:在我们调试中,可以将所有的异常都由用户自己处理
 
----------------------------------------------
插入中断
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

 

利用扩展头中的NumberOfRvaAndSizes
这个值普通是0x10,如果这个值大于0x10后,Winodws加载器会忽略这个值,但是OD在使用的时候,发现大于0x10,OD则会崩溃
还有一种PE头欺骗,就是当弹出"File contains too much data" 这是因为PE文件的扩展头中

 

2.OutputDebugString漏洞

转载于:https://www.cnblogs.com/Tempt/p/9988255.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值