绕过系统调试器检测

原因

有些时候,进程检测到有调试器时,会把异常直接交给调试器,这样,我们就调试不了我们的异常抓取逻辑。
(当然应该也有进程故意针对有调试器情况下做特殊处理的例子,同理是可以绕过去的)

步骤

  1. 打开windbg,打开exe和源代码,加载符号
  2. 下断点
    bp kernel32!UnhandledExceptionFilter

注意,UnhandledExceptionFilter的位置每个版本的操作系统都不一样,有的操作系统是在kernel32内,有的是kernelbase内,如果下断点之后无法命中,按以下步骤检查
a.检查windbg event filters设置,具体的异常事件(这里是access violation)对应的continue是否设置为not handled
b.观察UnhandledExceptionFilter代码,如果只是一个stub(通常是少数几行汇编,最后一条jmp指令),则需要在正确的(即jmp目标地址)UnhandledExceptionFilter下断点

  1. 继续跑进程

  2. 发现触发了 kernel32!UnhandledExceptionFilter,这在预期之中

  3. 此时按F10,直至运行了 call kernel32!BasepIsDebugPortPresent

  4. 将 寄存器 eax 改为 0 (eax 常常用来做返回值的寄存,此处可理解为 eax 为 该函数的返回值)

  5. 继续运行,进程便认为没调试器

上面 操作5 的返回值说明了当前有无连接调试器,我们将它的值由 1 改为了 0,能让kernel32误以为代码没有调试器

你可能感兴趣的:(日志)