SP(堆栈指针)反调试技巧 - x86

时间:2010-09-20 11:14:53

标签: assembly x86 reverse-engineering cracking software-protection

清单7.1 Cascade Virus的解密器

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 

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

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

提前致谢

4 个答案:

答案 0 :(得分:5)

断点或中断将“将数据推入堆栈”,这将损坏堆栈指针引用区域中的数据字节。因此,如果使用调试器在代码中放置断点(INT n),则调试(遇到断点)将破坏此代码尝试解密的数据。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我的x86-fu很生疏,但我似乎记得大多数断点调试工具都是通过触发CPU中的故障并将自己断言为管理程序进程来工作 - 这会给你一个新的堆栈,以及相应改变的堆栈指针。因此,单步执行该代码将为您提供sp的值,这些值与过程通常看到的值不同,如果它没有被调试器捕获。

答案 3 :(得分:0)

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