如何可靠地手动解压 Windows 驱动程序?

逆向工程 视窗 开箱 司机
2021-06-26 02:23:54

当您手动解压缩 Windows 用户模式可执行文件时,您可以轻松地在其入口点(或 TLS)处中断,然后跟踪直到到达原始入口点。但是,对于打包的驱动程序,这是不可能的。

如何可靠地手动解压 Windows 驱动程序?

4个回答

我有点喜欢你关于改变子系统的回答,特别是如果你不喜欢内核调试的话。不过,我是 Windbg 的忠实粉丝。我这样做的方法是:

  1. 将我的内核调试器连接到 VM
  2. 将驱动程序入口点的第一个字节更改为 INT3 (0xCC)。
  3. 修复 PE 校验和(我喜欢让pefile为我完成这项工作)。
  4. 在 VM 中加载驱动程序(OSR有一个很棒的驱动程序加载程序)

内核应该调用DriverEntry()您的驱动程序并为您闯入您的调试器。然后您可以跟踪代码,直到找到 OEP,就像您本来应该做的那样。我认为这种方法的主要优点是您不必伪造内核 DLL 或驱动程序在解包期间可能执行的调用,并且它适用于 x64。

  1. 将驱动程序子系统更改为 GUI(将其转换为用户模式二进制文件)
  2. 清除导入的 RVA,或使用一组假内核 DLL(仅 32 位)来启用导入加载
  3. 在您的调试器中启动并像在用户模式下一样继续运行 - 您可能需要在到达原始 EntryPoint 之前模拟一些 API 调用。

使用 INT3 修补 DriverInit 函数的另一种方法是在负责调用 DriverInitIopLoadDriver函数中放置一个断点在 Windows XP SP3 上,断点应添加在IopLoadDriver+0x66a 处,即call dword ptr [edi+2Ch](0x2C 是 _DRIVER_OBJECT.DriverInit)。

  1. 查找 IopLoadDriver x nt!IopLoadDriver
  2. 在 IopLoadDriver+0x66a 添加断点
  3. 加载并启动您的驱动程序

其他 Windows 版本的偏移量:

  • Windows 7 Pro SP1 32 位德语:nt!IopLoadDriver+0x7eb
  • Windows 7 Ultimate 64 位美国版:nt!IopLoadDriver+0xA04
  • Windows 10 Pro x64 US:nt!IopLoadDriver+0x51C(内部版本 10586.420)

(如果您有其他版本的 Windows 的偏移量,请编辑此答案)

nt!IopLoadDriver 间接调用仅用于 SERVICE_DEMAND 启动驱动程序入口

对于引导加载驱动程序,您还需要中断nt!IopInitializeBuiltInDriver间接调用

您可以在此链接中看到有关消息 #17 和 #18 的简短示例

http://www.osronline.com/showthread.cfm?link=231280

这是一个休眠脚本(稍微编辑以使用 gc(从条件运行而不是按照推荐的运行),它会一直等待并且会在内核调试会话中加载任何驱动程序时打印出 !drvobj 详细信息

没有自动换行命令应该在一行中

.foreach /pS 1 /ps 10 ( place { # call*dword*ptr*\[*\+*\] nt!IopInitializeBuiltinDriver} ) {bu place ".printf  \"%msu\\n\", poi(esp+4);r $t0 = poi(esp); gu; !drvobj $t0 2;gc"}
.foreach /pS 1 /ps 10 ( place { # call*dword*ptr*\[*\+*\] nt!IoploadDriver} ) {bu place ".printf  \"%msu\\n\", poi(esp+4);r $t1 = poi(esp); gu; !drvobj $t1 2;gc"}

xp sp3 虚拟机

在连接的 kd 会话中,sxe ibp; .reboot 当中断运行此脚本时,执行kd 将在重新启动时请求初始中断(相当于 boot.ini 中的 /break 开关)

$$>a< "thisscript.extension"

除了打印所有系统驱动程序入口点及其驱动程序对象

如果您的应用程序加载了额外的驱动程序,它们的详细信息也会被打印出来

在目标虚拟机中打开的 sysinternals dbgview 的示例输出

当您调用 dbgv.sys 入口点时 check mark the enable kernel capture (ctrl+k)

\REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\DBGV
*** ERROR: Module load completed but symbols could not be loaded for Dbgv.sys
Driver object (ffbd6248) is for:
 \Driver\DBGV
DriverEntry:   f6d89185 Dbgv
DriverStartIo: 00000000 
DriverUnload:  00000000 
AddDevice:     00000000 

Dispatch routines:
[00] IRP_MJ_CREATE                      f6d87168    Dbgv+0x1168
[01] IRP_MJ_CREATE_NAMED_PIPE           804fa87e    nt!IopInvalidDeviceRequest
[02] IRP_MJ_CLOSE                       f6d87168    Dbgv+0x1168
[03] IRP_MJ_READ                        804fa87e    nt!IopInvalidDeviceRequest
[04] IRP_MJ_WRITE                       804fa87e    nt!IopInvalidDeviceRequest
[05] IRP_MJ_QUERY_INFORMATION           804fa87e    nt!IopInvalidDeviceRequest
[06] IRP_MJ_SET_INFORMATION             804fa87e    nt!IopInvalidDeviceRequest
[07] IRP_MJ_QUERY_EA                    804fa87e    nt!IopInvalidDeviceRequest
[08] IRP_MJ_SET_EA                      804fa87e    nt!IopInvalidDeviceRequest
[09] IRP_MJ_FLUSH_BUFFERS               804fa87e    nt!IopInvalidDeviceRequest
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION    804fa87e    nt!IopInvalidDeviceRequest
[0b] IRP_MJ_SET_VOLUME_INFORMATION      804fa87e    nt!IopInvalidDeviceRequest
[0c] IRP_MJ_DIRECTORY_CONTROL           804fa87e    nt!IopInvalidDeviceRequest
[0d] IRP_MJ_FILE_SYSTEM_CONTROL         804fa87e    nt!IopInvalidDeviceRequest
[0e] IRP_MJ_DEVICE_CONTROL              f6d87168    Dbgv+0x1168
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     804fa87e    nt!IopInvalidDeviceRequest
[10] IRP_MJ_SHUTDOWN                    804fa87e    nt!IopInvalidDeviceRequest
[11] IRP_MJ_LOCK_CONTROL                804fa87e    nt!IopInvalidDeviceRequest
[12] IRP_MJ_CLEANUP                     804fa87e    nt!IopInvalidDeviceRequest
[13] IRP_MJ_CREATE_MAILSLOT             804fa87e    nt!IopInvalidDeviceRequest
[14] IRP_MJ_QUERY_SECURITY              804fa87e    nt!IopInvalidDeviceRequest
[15] IRP_MJ_SET_SECURITY                804fa87e    nt!IopInvalidDeviceRequest
[16] IRP_MJ_POWER                       804fa87e    nt!IopInvalidDeviceRequest
[17] IRP_MJ_SYSTEM_CONTROL              804fa87e    nt!IopInvalidDeviceRequest
[18] IRP_MJ_DEVICE_CHANGE               804fa87e    nt!IopInvalidDeviceRequest
[19] IRP_MJ_QUERY_QUOTA                 804fa87e    nt!IopInvalidDeviceRequest
[1a] IRP_MJ_SET_QUOTA                   804fa87e    nt!IopInvalidDeviceRequest
[1b] IRP_MJ_PNP                         804fa87e    nt!IopInvalidDeviceRequest