知识点
WinDbg
是微软提供的一个免费调试器,支持内核调试,也具有监控Windows系统交互的功能。
**驱动与内核代码:**Windows设备驱动简称为驱动,他让第三方开发商在Windows内核模式下运行代码。驱动程序常驻与内存,并且负责响应用户态程序的请求,而且应用程序不直接与驱动程序通信,而是直接访问设备对象,向具体的物理设备发送请求。设备对象由驱动程序创建和销毁,可以被用户态的程序直接访问,但他们并不一定是真实的物理设备。为了系统能正常工作,驱动程序必须加载到内核空间,这与DLL需要加载到进程空间道理相同,当驱动被首次加载时,DriverEntry
函数将被调用。
与DLL通过导出函数表来提供其功能不同,驱动程序通过注册回调函数来提供功能。当用户态的应用程序请求一个服务时,这些回调函数将被调用。回调函数在DriverEntry
程序中被注册。Window会为每个条创建一个驱动对象,并以参数形式将其传递给DriverEntry
函数,DriverEntry
函数用回调函数填充这个驱动对象。然后DriverEntry
会创建一个可以被用户态应用程序访问的设备对象,应用程序与去当的交互请求都通过这个设备对象进行。
考虑到来自用户态应用程序的一个读取数据的请求。最终这个请求发送到负责管理硬件并存储读入数据的驱动程序。首先,用户态的应用程序应该获得该硬件设备的一个文件句柄,然后再该具柄上调用函数ReadFile
,接着内核会处理ReadFile
函数的请求,最终由驱动程序的回调函数来响应对IO设备的读请求。七个球内核态的而已组建最常见函数时DeviceIoControl
,它是从用户态模块到内核折别的一种通用请求方法,使用该函数时,用户态应用程序传递一个任意长度的缓冲区数据作为输入,并且接收一个任意长度的缓冲区作为输出。
**安装内核调试:**由于运行内核调试时操作系统会被冻结,因此我们需要Vmware
来进行这一操作,与用户态调试不同,内核调试需要一些初始化设置。首先要在虚拟机系统中开启内核调试,然后配置Vmware
使虚拟机与宿主系统之间有一条虚拟化的串口,同时还应该配置宿主系统中的WinDbg
。详细的配置方法在网上能搜索到,在这里就不赘述了 。
boot.ini
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional with Kernel Debugging" /noexecute=optin /fastdetect /debug /debugport=COM1 /baudrate=115200
**WinDbg读取内存中的数据:**通过再WinDbg的内存窗