我读过INT 3(0xCC)用于软件断点.
它由(例如)调试器通过覆盖存储器中的实际程序代码来设置.
我还读到INT 3是一个"陷阱"而非"故障"异常,这意味着堆栈上的地址是INT3指令后面的指令地址.
如果未重新执行修补的指令,调试器如何保证正确性?
清单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寄存器就像一个反调试功能?如果我错了,请纠正我,但我不认为运行调试器会改变堆栈布局......
提前致谢
x86 assembly cracking reverse-engineering software-protection