5

清单 7.1 级联病毒的解密器

lea si, Start ; position to decrypt (dynamically set)

mov     sp, 0682    ; length of encrypted body (1666 bytes)

Decrypt:
xor     [si],si ; decryption key/counter 1
xor     [si],sp ; decryption key/counter 2
inc     si  ; increment one counter
dec     sp  ; decrement the other
jnz     Decrypt ; loop until all bytes are decrypted

Start:  ; Encrypted/Decrypted Virus Body 

请注意,此解密器具有反调试功能,因为 SP(堆栈指针)寄存器用作解密密钥之一。

有人能解释一下为什么使用 SP 寄存器就像一个反调试功能吗?如果我错了,请纠正我,但我认为运行调试器不会改变堆栈布局......

提前致谢

4

4 回答 4

5

取断点或中断会“将数据压入堆栈”,这会损坏堆栈指针所引用区域中的数据字节。因此,如果您使用调试器在代码中放置断点 (INT n),那么您的调试行为(遇到断点)将破坏该代码试图解密的数据。

如果没有中断发生,这段代码可能在 DOS 下工作;也许他们首先禁用中断。您实际上无法在 Windows 或 Linux 下使用它(无论如何它的 16 位代码)。

于 2010-10-09T23:55:30.113 回答
2

如果堆栈段等于数据段(是 .com 还是 .exe 病毒?似乎是 .com,因为 DS 已经等于 CS)然后任何使用堆栈(调试器甚至中断)都会修改 ss 所在的内存:[sp] 正在指向,它将指向病毒体内的某个位置(因为它被用作计数器)。

于 2010-09-20T23:47:50.653 回答
1

我的 x86-fu 生锈了,但我似乎记得大多数断点调试工具都是通过触发 CPU 中的故障并将自己声明为主管进程来工作的——这将为您提供一个新堆栈和一个相应更改的堆栈指针。因此,单步执行该代码将为您提供sp与该进程通常看到的值不同的值,前提是它没有被调试器捕获。

于 2010-09-20T11:24:56.883 回答
0

大多数调试器期望 [e]sp 有效并指向堆栈区域。我想如果 sp 不指向有效内存,某些调试器可能会崩溃,但我不知道。

于 2010-09-20T11:41:27.943 回答