编写加载驱动软件
我们知道dll加载进入程序需要loadlibrary。而安装驱动等于创建服务,CreateSever把驱动信息记录注册表。
CreateServiceA
SC_HANDLE hService=CreateServiceA( hSCM, // handle to SCM database "CR33", // name of service to start "CR33Display", // display name SERVICE_ALL_ACCESS, // type of access to service SERVICE_KERNEL_DRIVER, // type of service SERVICE_DEMAND_START, // when to start service SERVICE_ERROR_NORMAL, // severity of service failure strPath.toStdString().c_str(), // name of binary file sys路径 NULL, // name of load ordering group NULL, // tag identifier NULL, // array of dependency names NULL, // account name NULL // account password );
就这几个参数比较重要
dwServiceType
选这个就表示写内核程序
dwStartType
这个是驱动方式
第一个是系统启动后就会启动
第二个会开机就启动
第三个只有调用startSever才会启动
第四个不能启动
第五个系统初始化之前启动
lpBinaryPathName
sys路径
StartService(开启驱动)
ControlService(停止)
DeleteService(卸载)
SERVICE_STATUS status; SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); //check //1.安装 CreateService SC_HANDLE hService = CreateService(hSCM, "cr33Hello", "cr33Hello", SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, //内核驱动 SERVICE_DEMAND_START, /*启动方式*/ SERVICE_ERROR_NORMAL, "C:\\Documents and Settings\\Administrator\\桌面\\Hello.sys", //驱动路径 NULL, NULL, NULL, NULL, NULL); if (hService == NULL) { printf("CreateService Error:%d\n", GetLastError()); CloseServiceHandle(hSCM); system("pause"); return 0; } else { printf("CreateService OK\n"); } //2.启动 StartService if (StartService(hService, NULL, NULL) == 0) { printf("StartService Error:%d\n", GetLastError()); DeleteService(hService); CloseServiceHandle(hService); CloseServiceHandle(hSCM); system("pause"); return 0; } else { printf("StartService OK\n"); } //3.停止 ControlService ControlService(hService, SERVICE_CONTROL_STOP, &status); //4.卸载 DeleteService //OpenService(); DeleteService(hService); CloseServiceHandle(hService); CloseServiceHandle(hSCM); system("pause"); return 0;
调试驱动程序
蓝屏保存DUM
当系统出错后会dump内存保存下来
为了看到蓝屏把这个取消
现在编写一个有问题的驱动程序
启动运行后出错了,可以看到里面有错误驱动名,错误类型还有代码位置
如果真的蓝屏,上面也写了,可以进入安全模式,然后把驱动删除,因为安全模式,只会加载基础的驱动,第三方的都不会加载。
这个就是我们DUM的文件
拷贝出来用windbg打开
点击自动分析
能分析错误位置,和错误类型,还能调试,有源码的话还能判断哪行出错
双机调式
我系统64位的所以打开这个
然后重启虚拟机里面的xp系统
最后打开windbg
然后输入g,系统就能正常跑起来
现在可以编写驱动的调试代码了,用代码给下断点,我们一般不用int 3
用DbgBreakPoint()
DbgBreakPoint()
_asm int 3
编译好,用加载器启动
触发断点就能调试了