清单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
Note that this decryptor has antidebug features because the SP (stack pointer) register is used as one of the decryption keys.
有人可以解释为什么使用SP寄存器就像一个反调试功能?如果我错了,请纠正我,但我不认为运行调试器会改变堆栈布局......
提前致谢
4 回答
采用断点或中断将“将数据推入堆栈”,这将损坏堆栈指针引用区域中的数据字节 . 因此,如果您使用调试器在代码中放置断点(INT n),那么您的调试行为(遇到断点)将破坏此代码尝试解密的数据 .
如果没有中断发生,此代码可能在DOS下工作;也许他们先禁用中断 . 你无法在Windows或Linux下实际使用它(无论如何它的16位代码) .
如果堆栈段等于数据段(是.com还是.exe病毒?似乎.com,因为DS已经等于CS)那么堆栈(调试器甚至中断)的任何使用都将修改ss中的内存:[sp]指向,它将指向病毒体中的某个位置(因为它用作计数器) .
我的x86-fu是生锈的,但我似乎记得大多数断点调试工具都是通过触发CPU中的故障并将自己断言为管理程序进程来工作 - 这会给你一个新的堆栈,以及相应改变的堆栈指针 . 因此,单步执行该代码将为您提供
sp
的值,这些值与进程在未被调试器捕获时通常会看到的值不同 .大多数调试器期望[e] sp有效并指向堆栈区域 . 我想如果sp没有指向有效内存,有些调试器可能会崩溃,但我不知道 .