【问题标题】:SP (Stack Pointer) Anti-debug Trick - x86SP(堆栈指针)反调试技巧 - x86
【发布时间】:2011-04-14 15:11:51
【问题描述】:

清单 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 寄存器会起到反调试功能的作用吗?如果我错了,请纠正我,但我认为运行调试器不会改变堆栈布局...

提前致谢

【问题讨论】:

  • 听起来很像家庭作业...

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


【解决方案1】:

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

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

【讨论】:

  • 只是为了详细说明你的答案:“INT n 通常表现得像一个远调用,只是标志寄存器在返回地址之前被压入堆栈。中断过程通过 IRET 指令返回,该指令弹出标志和堆栈的返回地址。” - pdos.csail.mit.edu/6.828/2008/readings/i386/INT.htm
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 根据定义,(e)sp 是有效的。大多数经过智能设计的调试器都使用自己的自己的堆栈区域来避免超出应用程序使用的堆栈空间。请参阅我的答案,了解为什么使用自己的堆栈不会使调试器能够调试此代码。
      • 啊,有道理。我没有想到中断处理程序。
      猜你喜欢
      • 2012-12-13
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多