调试没有符号的驱动时如何断在入口点处
2013-11-01 17:27
190 查看
关于调试没有符号的驱动时如何断在入口点处这个问题,先说一个我听来的很挫的方法:用C32ASM修改DriverEntry处为0xCC,就是int 3,修正校验和后加载,执行到DriverEntry时产生int 3异常自然就会中断在调试器了,这时再把原来的指令改回去继续跑就行了.改来改去的,确实比较挫~~.
那么怎么做比较好一点呢?
我们都知道有符号时直接bu drivername!DriverEntry就可以了,加载时就会停在入口点.但是没有符号时,调试器不知道DriverEntry到底指向哪个位置,但是谁知道呢?谁调用谁知道啊~~没错,就是IopLoadDriver()啦~~(关于该函数的具体实现,请自行参考WRK).
下面我就直接在IopLoadDriver函数中找调用DriverEntry的地方.
找啊找啊,终于找到了,在我的Xp sp2上如下:
lkd>
nt!IopLoadDriver+0x65a:
805a9787 83e103 and ecx,3
805a978a f3a4 rep movs byte ptr es:[edi],byte ptr [esi]
805a978c 8b7d80 mov edi,dword ptr [ebp-80h]
805a978f ffb570ffffff push dword ptr [ebp-90h] //指向RegistryPath
805a9795 57 push edi //edi指向DriverObject
805a9796 ff572c call dword ptr [edi+2Ch] //edi+2C,指向DriverObject->DriverInit,即入口点DriverEntry
805a9799 3bc3 cmp eax,ebx
805a979b 8b8d68ffffff mov ecx,dword ptr [ebp-98h]
顺便贴个DRIVER_OBJECT的结构,这样两个放一起看起来比较容易理解
lkd> dt _DRIVER_OBJECT 8a884e30
nt!_DRIVER_OBJECT
+0x000 Type : 4
+0x002 Size : 168
+0x004 DeviceObject : 0x898ef450 _DEVICE_OBJECT
+0x008 Flags : 0x92
+0x00c DriverStart : 0xf7b52000
+0x010 DriverSize : 0x8c480
+0x014 DriverSection : 0x8a960ae8
+0x018 DriverExtension : 0x8a884ed8 _DRIVER_EXTENSION
+0x01c DriverName : _UNICODE_STRING "\FileSystem\Ntfs"
+0x024 HardwareDatabase : 0x80696810 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
+0x028 FastIoDispatch : 0xf7b71820 _FAST_IO_DISPATCH
+0x02c DriverInit : 0xf7bd7204 long +fffffffff7bd7204 //这就是入口点了,代码中的edi+2C处
+0x030 DriverStartIo : (null)
+0x034 DriverUnload : (null)
+0x038 MajorFunction : [28] 0xf7b77e37 long +fffffffff7b77e37
这个call特征很明显的.就是:
push reg
call dword ptr [reg+2Ch]
不同的内核版本这里使用的寄存器可能是不一样的,找到后把这个偏移记下来
只要我们把断点下在这个call之前,比如我直接下bp nt!IopLoadDriver+0x65a
然后单步几下到805a9796,这个call dword ptr [reg+2Ch]单步进去,就是DriverEntry了,很简单!
如果你跟我一样使用WinXP Sp2,那么直接下断点bp nt!IopLoadDriver+0x65a就可以了
Vista系统下直接下断点 bp nt!IopLoadDriver+0x801
我提供的偏移可能不适用于你的系统,请自行查找适合你自己的偏移量,只需查找一次,以后就可以随便用了.
此法在Win2000/WinXP/Win2003/WinVista上均适用,对SoftIce,Syser当然也是可以用的.
不过SoftIce好像有专用的命令,而Syser有没有符号都可以自动断在入口点处,所以使用Windbg但仍不会这个方法的可以记录一下.
转载自:黑月教主的百度空间
那么怎么做比较好一点呢?
我们都知道有符号时直接bu drivername!DriverEntry就可以了,加载时就会停在入口点.但是没有符号时,调试器不知道DriverEntry到底指向哪个位置,但是谁知道呢?谁调用谁知道啊~~没错,就是IopLoadDriver()啦~~(关于该函数的具体实现,请自行参考WRK).
下面我就直接在IopLoadDriver函数中找调用DriverEntry的地方.
找啊找啊,终于找到了,在我的Xp sp2上如下:
lkd>
nt!IopLoadDriver+0x65a:
805a9787 83e103 and ecx,3
805a978a f3a4 rep movs byte ptr es:[edi],byte ptr [esi]
805a978c 8b7d80 mov edi,dword ptr [ebp-80h]
805a978f ffb570ffffff push dword ptr [ebp-90h] //指向RegistryPath
805a9795 57 push edi //edi指向DriverObject
805a9796 ff572c call dword ptr [edi+2Ch] //edi+2C,指向DriverObject->DriverInit,即入口点DriverEntry
805a9799 3bc3 cmp eax,ebx
805a979b 8b8d68ffffff mov ecx,dword ptr [ebp-98h]
顺便贴个DRIVER_OBJECT的结构,这样两个放一起看起来比较容易理解
lkd> dt _DRIVER_OBJECT 8a884e30
nt!_DRIVER_OBJECT
+0x000 Type : 4
+0x002 Size : 168
+0x004 DeviceObject : 0x898ef450 _DEVICE_OBJECT
+0x008 Flags : 0x92
+0x00c DriverStart : 0xf7b52000
+0x010 DriverSize : 0x8c480
+0x014 DriverSection : 0x8a960ae8
+0x018 DriverExtension : 0x8a884ed8 _DRIVER_EXTENSION
+0x01c DriverName : _UNICODE_STRING "\FileSystem\Ntfs"
+0x024 HardwareDatabase : 0x80696810 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
+0x028 FastIoDispatch : 0xf7b71820 _FAST_IO_DISPATCH
+0x02c DriverInit : 0xf7bd7204 long +fffffffff7bd7204 //这就是入口点了,代码中的edi+2C处
+0x030 DriverStartIo : (null)
+0x034 DriverUnload : (null)
+0x038 MajorFunction : [28] 0xf7b77e37 long +fffffffff7b77e37
这个call特征很明显的.就是:
push reg
call dword ptr [reg+2Ch]
不同的内核版本这里使用的寄存器可能是不一样的,找到后把这个偏移记下来
只要我们把断点下在这个call之前,比如我直接下bp nt!IopLoadDriver+0x65a
然后单步几下到805a9796,这个call dword ptr [reg+2Ch]单步进去,就是DriverEntry了,很简单!
如果你跟我一样使用WinXP Sp2,那么直接下断点bp nt!IopLoadDriver+0x65a就可以了
Vista系统下直接下断点 bp nt!IopLoadDriver+0x801
我提供的偏移可能不适用于你的系统,请自行查找适合你自己的偏移量,只需查找一次,以后就可以随便用了.
此法在Win2000/WinXP/Win2003/WinVista上均适用,对SoftIce,Syser当然也是可以用的.
不过SoftIce好像有专用的命令,而Syser有没有符号都可以自动断在入口点处,所以使用Windbg但仍不会这个方法的可以记录一下.
转载自:黑月教主的百度空间
相关文章推荐
- 调试没有符号的驱动时如何断在入口点处
- 调试没有符号的驱动时如何断在入口点处
- gdb如何调试没有符号表(未加-g选项的编译)的程序
- GDB如何调试没有符号表(未加-g选项的编译)的程序
- WinDbg调试没有符号表的驱动
- 如何在 C 程序中加入调试符号
- 附加到进程调试DLL时显示“无法命中断点,没有为该文档加载任何符号”
- 调试无符号驱动的时,快速到达DriverEntry的方法——2
- 调试没有符号的 iOS 应用
- 如何在MTK平台进行驱动调试
- 没有设备如何调试Android代码,最强Android模拟器 Genymotion: 你可以拥有所有 Android 设备
- VS2013代码调试:[7]如何避免调试时加载符号
- VS2013代码调试:如何避免调试时加载符号
- codeblock无法进行调试,没有符号表被读取。请使用 "file" 命令。
- VC调试的时候 “没有调试信息,未加载符号”解决方法
- 如何使用CeLog调试Windows mobile设备驱动
- 如何解决VS2003调试时,出现的未加载符号问题
- 如何使用调试诊断工具来解决在 IIS 中没有响应的进程
- vs 2005调试“没有为任何调用堆栈框架加载任何符号
- 【转】VC调试的时候 “没有调试信息,未加载符号”