如何使用IDA调试Windows驱动程序并使用其对应的IDB?

问题描述

我熟悉使用windbg或IDA进行远程内核调试,但是现在我已经从可执行文件中提取了一个内核驱动程序,并对其IDB进行了静态分析并重命名了许多变量,这是最简单的方法使用我的IDB文件在可执行文件加载远程调试对象上时调试驱动程序?

我知道如何使用IDA附加到远程内核,但是我如何使用当前的IDB文件,并在其某些功能上放置断点,以便在加载驱动程序时会遇到中断? (我没有用于驱动程序的相应pdb文件,因此我不能将符号用于断点)

解决方法

这是在任何DriverInit上都中断的有效答案

一旦DriverInit中断,您可以在所有MajorFunctions上查找并设置bp

假设您的kd连接正常

使用sxe -ibp; .reboot重启目标

重新连接时,目标会很早地破裂,如下所示

kd> sxe ibp;.reboot
Shutdown occurred at (Sun Oct 18 02:58:09.077 2020 )...unloading all symbol tables.
Waiting to reconnect...
Connected to Windows 7 7601 x86 compatible target at (xxx),ptr64 FALSE
Kernel Debugger connection established.  (Initial Breakpoint requested)

一旦损坏,在nt!IopLoadDriver上设置一个断点

在此函数内搜索间接调用 调用_DRIVER_OBJECT-> DriverInit

kd> ?? #FIELD_OFFSET(nt!_DRIVER_OBJECT,DriverInit)
long 0x2c

喜欢

nt!IopLoadDriver+0x7ea:
829d5355 ff562c call dword ptr[esi+2Ch] ds:84f2928c={cdrom!FxDriverEntry (87eb53cf)}

在此处设置一个断点

现在您已设置为输入几乎所有已加载的驱动程序 一旦您进入任何驾驶员的入口 使用DriverObject(DriverEntry接受的参数) 并在每个MAJORFunction上设置断点

kd> bp . "du poi(@esi+1c+4);gc"
kd> bl
     0 e Disable Clear  829d4b6a     0001 (0001) nt!IopLoadDriver
     1 e Disable Clear  829d5355     0001 (0001) nt!IopLoadDriver+0x7ea "du poi(@esi+1c+4);gc"

kd> bd 0
kd> bl
     0 d Enable Clear  829d4b6a     0001 (0001) nt!IopLoadDriver
     1 e Disable Clear  829d5355     0001 (0001) nt!IopLoadDriver+0x7ea "du poi(@esi+1c+4);gc"

kd> g
841bd1d0  "\Driver\Null.Ѕ捁印䍁䥐停偎〰〰"
84f18718  "\Driver\Beep.Б浍摌䂈蓶䈸蓶...."
84eef210  "\Driver\VgaSave"
84eb2860  "\Driver\RDPCDDᛛ..В浍慃憠褎.蓫菌蓲"
84e903c0  "\Driver\RDPENCDD..浍摌읨蓤潤獷獜獹整.尲牤癩牥"
84e90400  "屳摲数据摤献獹"
84ef15c0  "\Driver\RDPREFMP..牉..蓧"
84ef4a78  "\FileSystem\Msfs.В浍慃冀褘蝴蓳荤蓶"
84f191f0  "\FileSystem\Npfs.З獍䑆.°"

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...