项目

image.png

项目文件

image.png
可以删掉 .inf 文件

DriveEntery和Unload

默认情况下驱动会有DriveEntry作为程序入口 ,相当于main 函数 ,此函数在被调用时候, 会被上调IRQL (PASSIVE_LEVEL)到0

示例代码

  1. #include <ntddk.h>
  2. void SampleUnload(_In_ PDRIVER_OBJECT DriverObject) {
  3. UNREFERENCED_PARAMETER(DriverObject);
  4. }
  5. extern "C"
  6. NTSTATUS
  7. DriverEntry(_In_ PDRIVER_OBJECT DriveObject,_In_ PUNICODE_STRING RegisteryPath) {
  8. UNREFERENCED_PARAMETER(RegisteryPath);
  9. DriveObject->DriverUnload = SampleUnload;
  10. return STATUS_SUCCESS;
  11. }
  • UNREFERENCED_PARAMETER 宏,重新赋值,让变量变成引用过的 ,就不会报警了
  • 驱动必须具有c的链接方式 ,默认c++ 链接不是c的 要加上extern “C”
  • Unload 实例 ,可以卸载

image.png

加载驱动

开启测试模式

  1. bcdedit /set testsigning on
  2. 重启

命令

  1. 注册
  2. sc create sample type kernel binPath=c:\dev\sample\x64\debug\sample.sys
  3. 启动
  4. sc start sample
  5. 停止
  6. sc stop sample

使用软件加载

image.png

简单跟踪

使用KdPrint

KdPrint 是一个宏,调用了底层DbgPrint 内核api

  1. #include <ntddk.h>
  2. void SampleUnload(_In_ PDRIVER_OBJECT DriverObject) {
  3. UNREFERENCED_PARAMETER(DriverObject);
  4. KdPrint(("sample driver unload called\n"));
  5. }
  6. extern "C"
  7. NTSTATUS
  8. DriverEntry(_In_ PDRIVER_OBJECT DriveObject,_In_ PUNICODE_STRING RegisteryPath) {
  9. UNREFERENCED_PARAMETER(RegisteryPath);
  10. DriveObject->DriverUnload = SampleUnload;
  11. KdPrint(("sample driver initialized successfully\n"));
  12. return STATUS_SUCCESS;
  13. }

dbgView

  • dbgview 需要管理员权限,打开capature kernel
  • 从vista以后,使用dbgview 时,要向注册表中 的
    1. HKLM\SYSTEM\CurrentControlSet\Control\Session Manager
    下面新增一个叫Debug Print Filter 的键 (一般是不存在)
    在这个键里增加一个叫 DEFAULT的DWORD 值 设置为8
    重启生效

image.png

结果

image.png