KiUserExceptionDispatcher 钩子

逆向工程 部件 例外
2021-06-14 13:17:12

我正在分析一个恶意软件,其中首先获得了“KiUserExceptionDispatcher”的地址(使用导出名称表,转到导出序数表,最后到导出地址表)。一旦收到地址(7773A408),恶意软件就会用以下几行覆盖前 6 个字节:

      (here is the finding part)
                ...
   mov BYTE PTR DS:[EDX], 68             -> EDX contains ntdll.KiUserExceptionDispatcher
   mov DWORD PTR DS:[EDX+1], malware.004035C2
   mov BYTE PTR DS:[EDX+5], 0C3
   ....

因此,7773A408(KiUserExceptionDispatcher 的地址)处的十六进制窗口按以下方式变化:

  7773A408   FC 8B 4C 24 | 04 8B .... (and so on)    <- original

  7773A408   68 C2 35 40 | 00 C3 .....(and so on)    <- after overwriting

那么,接下来会发生什么是恶意软件到达“UD2”指令。我查了一下:它引发了一个无效的操作码异常。然后恶意软件跳转到

 7773A40D   RETN    

然后导致我:

004035C2  DB 8B     <- clear, because 004035C2 starts at 7773A40D (hex window)

然后最后到另一个地方,一个全新的功能开始。所以,我的问题是:假设恶意软件试图通过用 004035C2 覆盖它以重定向异常流来更改异常处理程序是否正确?为什么 UD2 的异常处理程序是 KiUserExceptionDispatcher 的前 6 个字节?

最好的祝福,

1个回答

恶意软件KiUserExceptionDispatcher()使用以下内容覆盖用户模式异常调度程序 ( ):

PUSH malware.004035C2
RETN

上面的代码等价于JMP malware.004035C2.

现在,每当进程中发生任何用户模式异常时,malware.004035C2都会执行at 函数,而不是(或至少在之前)已注册的SEH函数。

恶意软件可能会将此“技巧”与UD2指令结合使用以混淆反汇编程序,因为大多数反汇编程序不会自动确定该UD2指令现在有效地跳转到malware.004035C2. 这种类型的混淆技巧通常用于使代码流的自动静态分析变得更加困难。