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

use*_*188 5 x86 assembly cracking reverse-engineering software-protection

清单7.1 Cascade Virus的Decryptor

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 
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢

Ira*_*ter 5

采用断点或中断将"将数据推入堆栈",这将损坏堆栈指针引用区域中的数据字节.因此,如果您使用调试器在代码中放置断点(INT n),那么您的调试行为(遇到断点)将破坏此代码尝试解密的数据.

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


Eig*_*uru 1

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