当您手动解压缩 Windows 用户模式可执行文件时,您可以轻松地在其入口点(或 TLS)处中断,然后跟踪直到到达原始入口点。但是,对于打包的驱动程序,这是不可能的。
如何可靠地手动解压 Windows 驱动程序?
当您手动解压缩 Windows 用户模式可执行文件时,您可以轻松地在其入口点(或 TLS)处中断,然后跟踪直到到达原始入口点。但是,对于打包的驱动程序,这是不可能的。
如何可靠地手动解压 Windows 驱动程序?
使用 INT3 修补 DriverInit 函数的另一种方法是在负责调用 DriverInit的IopLoadDriver函数中放置一个断点。在 Windows XP SP3 上,断点应添加在IopLoadDriver+0x66a 处,即call dword ptr [edi+2Ch]
(0x2C 是 _DRIVER_OBJECT.DriverInit)。
x nt!IopLoadDriver
其他 Windows 版本的偏移量:
(如果您有其他版本的 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