我正在教自己分析恶意软件,为了增加对一些更常见的反调试技术的理解,我在汇编中编写了int 2d
调试器检测概念。但是,当它到达int 2d
时,程序终止而不是跳过预期的操作码。
这是我的代码:
include 'win32ax.inc'
.data
dbg db "Debugger!",0
nodbg db "No debugger!",0
.code
start:
xor eax,eax ;set the zero flag
int 2dh ;The debugger detection interupt
inc eax ;the instruction to be skipped during debugging
jnz notpresent ;the jump
invoke MessageBox,0,dbg,dbg,MB_OK ;Debugger detected!
jmp exit
notpresent:
invoke MessageBox,0,nodbg,nodbg,MB_OK ;No debugger detected!
exit:
invoke ExitProcess,0
.end start
应该做的是跳到MessageBox说“没有调试器!”,相反,当它到达int 2d
操作码时,即使没有被调试,程序也会崩溃。有用的提示吗?我做错了什么,我该如何解决?我正在使用The Flat Assembler,如果有帮助的话。
答案 0 :(得分:1)
如果没有连接调试器,INT 2Dh将抛出异常。因此,您需要处理此异常,否则您的程序将崩溃。
您尝试使用哪种调试器,因为看起来他们中的许多人都无法正确处理此操作码并可能会崩溃或显示意外行为。
可以在此处找到代码示例和更多信息:OpenRCE Debugger Detection