WEB开发网
开发学院网络安全安全技术 恶意软件反检测技术简介(下) 阅读

恶意软件反检测技术简介(下)

 2008-10-14 13:28:07 来源:WEB开发网   
核心提示: 3.检测调试器在Linux系统上检测调试器有一个简单的方法,只要调用Ptrace即可,恶意软件反检测技术简介(下)(2),因为对于一个特定的进程而言无法连续地调用Ptrace两次以上,在Windows中,如下所示:mov eax, fs:[30h]mov eax, [eax+18h] ;p

3.检测调试器

在Linux系统上检测调试器有一个简单的方法,只要调用Ptrace即可,因为对于一个特定的进程而言无法连续地调用Ptrace两次以上。在Windows中,如果程序目前处于被调试状态的话,系统调用isDebuggerPresent将返回1,否则返回0。这个系统调用简单检查一个标志位,当调试器正在运行时该标志位被置1。直接通过进程环境块的第二个字节就可以完成这项检查,以下代码为大家展示的就是这种技术:

mov eax, fs:[30h]
move eax, byte [eax+2]
test eax, eax  
jne @DdebuggerDetected

在上面的代码中,eax被设置为PEB(进程环境块),然后访问PEB的第二个字节,并将该字节的内容移入eax。通过查看eax是否为零,即可完成这项检测。如果为零,则不存在调试器;否则,说明存在一个调试器。

如果某个进程为提前运行的调试器所创建的,那么系统就会给ntdll.dll中的堆操作例程设置某些标志,这些标志分别是FLG_HEAP_ENABLE_TAIL_CHECK、FLG_HEAP_ENABLE_FREE_CHECK和FLG_HEAP_VALIDATE_PARAMETERS。我们可以通过下列代码来检查这些标志:

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

在上面的代码中,我们还是访问PEB,然后通过将PEB的地址加上偏移量68h到达堆操作例程所使用的这些标志的起始位置,通过检查这些标志就能知道是否存在调试器。

检查堆头部内诸如ForceFlags之类的标志也能检测是否有调试器在运行,如下所示:

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

上面的代码向我们展示了如何通过PEB的偏移量来访问进程的堆及堆标志,通过检查这些内容,我们就能知道Force标志是否已经被当前运行的调试器提前设置为1了。

上一页  1 2 3 4 5 6 7  下一页

Tags:恶意 软件 检测技术

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接