INT 2D 反取证方法

逆向工程 视窗 静态分析 恶意软件 反调试
2021-07-05 03:08:26

包含INT 2D指令似乎是 Windows 恶意软件作者使用的一种相当常见的反调试策略。据我了解,当调试器被附加时,它会导致一个进程的行为与未附加时不同。

我读到这部分是由于指令指针的异步(不是正常程序流的一部分)增量。这种增量可以导致指令中断。

可能有人解释这种反调试策略,特别是为什么这个增量指令指针发生,当一个调试器会发生什么情况,并没有连接。

4个回答

来自我的“终极”反调试参考(参见 pferrie.host22.com):

中断 0x2D 是一种特殊情况。执行时,Windows 使用当前的 EIP 寄存器值作为异常地址,然后将 EIP 寄存器值加 1。但是,Windows 还会检查 EAX 寄存器中的值以确定如何调整异常地址。如果 EAX 寄存器在所有版本的 Windows 上的值为 1、3 或 4,或者在 Windows Vista 和更高版本上的值为 5,则 Windows 会将异常地址增加 1。最后,如果存在调试器,它会发出 EXCEPTION_BREAKPOINT (0x80000003) 异常。中断 0x2D 行为可能会给调试器带来麻烦。问题是一些调试器可能使用 EIP 寄存器值作为恢复的地址,而其他调试器可能使用异常地址作为恢复的地址。这可能会导致跳过单字节指令,或者由于缺少第一个字节而执行完全不同的指令。这些行为可用于推断调试器的存在。可以使用以下代码(对于 32 位和 64 位相同)进行检查,以检查 32 位或 64 位 Windows 环境:

xor  eax, eax ;set Z flag
int  2dh
inc  eax ;debugger might skip
je   being_debugged

[结尾]

所以你可以看到这里没有异步发生。发生异常时立即发生更改。至于为什么发生,跳过的字节旨在用于在异常发生时传递一个字节的附加信息。

反逆向工程指南

以及那里提供的代码的主要解释性注释。

// The Int2DCheck function will check to see if a debugger
// is attached to the current process. It does this by setting up
// SEH and using the Int 2D instruction which will only cause an
// exception if there is no debugger. Also when used in OllyDBG
// it will skip a byte in the disassembly and will create
// some havoc.

注意这里有一点关于SEH

有关在恶意软件中使用 INT2d 的一些很好的示例,请查看 Dr. Fu 的博客:

http://fumalwareanalysis.blogspot.com/p/malware-analysis-tutorials-reverse.html

有 3 种不同的示例和解释,其中一种是 Max++,它可以很好地了解您自己的恶意软件样本中的预期内容。

中断 0x2D 是一种特殊情况。执行时,Windows 使用当前的 EIP 寄存器值作为异常地址,然后将 EIP 寄存器值加 1但是,Windows 还会检查 EAX 寄存器中的值以确定如何调整异常地址如果 EAX 寄存器的值在所有版本的 Windows 上都是 1、3 或 4,或者在 Windows Vista 和更高版本上的值是 5,那么 Windows 会将异常地址加 1. 最后,如果存在调试器,它会发出 EXCEPTION_BREAKPOINT (0x80000003) 异常。中断 0x2D 行为可能会给调试器带来麻烦。问题是一些调试器可能使用 EIP 寄存器值作为恢复的地址,而其他调试器可能使用异常地址作为恢复的地址。这可能会导致跳过单字节指令,或者由于缺少第一个字节而执行完全不同的指令。这些行为可用于推断调试器的存在。可以使用以下代码(对于 32 位和 64 位相同)进行检查,以检查 32 位或 64 位 Windows 环境:

一开始,我不明白“异常地址”的含义,我想我不是唯一一个。幸运的是,傅博士的博客对此有更好的解释。

来自傅博士的博客:

这里的“异常地址”是“上下文的EIP值”(要复制回用户进程),“EIP寄存器值”是异常发生时用户进程的真实EIP值。