配置好双机调试
DriverEntry设置断点 __asm int 3;
加载驱动 断下
u 查看 汇编
F8 步入
F10 步过
shift+F11 跳出函数 返回到上层call
F5 运行
bp 下CC断点 bp 模块名!函数名
bl 显示断点
bd 禁用断点
bc 清除断点
a 地址 之后 输入指令 之后回车
WINGDBG
SSDT的全称是System Services Descriptor Table,系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable 这个表
dd poi[KeServiceDescriptorTable]+索引号*4 显示
Kernel Detective v1.4.1工具 查看 索引号
索引号 计算 :
找到什么名称的函数 在WINDBG中 u zw函数 EG: u zwOpenFile
看到mov eax,74h
对指定源代码处下断:
bp `123!main.cpp:23`
最关键的一点,使用"`"而不是"'"
typedef struct ServiceDescriptorTable {
PVOID ServiceTableBase; //System Service Dispatch Table 的基地址
PVOID ServiceCounterTable(0);
//包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新。
unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目。
PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表
}
用windbg 了解SSDT结构:
windbg符号路径设置: srv*D:\WINDDK\symbols*http://msdl.microsoft.com/download/symbols
如何向内核地址写入自己代码
mov [xxx],xx //
1、如何向SSDT表写入内容呢,这个表是被保护的 正常情况不能被写入
方法有三
(1) 更改注册表 -最简单的做法
HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\
EnforceWriteProtection=0
与
HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\
DisablePagingExecutive=1
(2)改变CR0寄存器的第1位wp位 置0-常用 网上流传的
(3)通过Memory Descriptor List(MDL) 内存描述符表-正规做法
MmCreateMdl 函数 描述某块内存的情况 运用在后面讲解;
这里显示:
下面为编程: 先是函数解释
VOID RtlInitUnicodeString
(
IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString
);
DestinationString
需要初始化的指针PUNICODE_STRING
SourceString
指向一个以空结尾的Unicode字符串常量,用这个字符串来初始化DestinationString。
例子
PUNICODE_STRING s;
RtlInitUnicodeString(s, L"宽字符");//s=L"宽字符";
IoCreateDevice 为驱动创建一个设备对象 格式如下:
NTSTATUS IoCreateDevice(
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive,
OUT PDEVICE_OBJECT *DeviceObject );
参数:
DriverObject
为指针调用驱动程序对象。每个驱动程序接收一个参数的指针,并将司机反对其DriverEntry例程。波分复用功能和筛选器驱动程序也可领取的AddDevice例程的驱动程序对象的指针。
DeviceExtensionSize //0
给_DEVICE_OBJECT.DeviceExtension指定内存空间大小,具体看自己定义结构的大小
DeviceName
设备名字
DeviceType
设备类型 这里我们用FILE_DEVICE_UNKNOWN
DeviceCharacteristics
设备特征信息 一般为0
Exclusive
是否指定设备为独占 是为TRUE,否为FALSE
DeviceObject
指针变量接收一个指向新创建的DEVICE_OBJECT结构。用来回传数据
返回值
调用成功会返回 STATUS_SUCCESS 如果出错会返回下列值
STATUS_INSUFFICIENT_RESOURCES//资源不足
STATUS_OBJECT_NAME_EXISTS //指定对象名存在
STATUS_OBJECT_NAME_COLLISION//对象名有冲突
IoCreateSymbolicLink
创建一个设备链接。驱动程序虽然有了设备名称,但是这种设备名筄只能在内核 态可见,而对于应用程序是不可见的,因此,驱动需要要暴露一个符号链接,该链接指向真正的设备名称
NTSTATUS IoCreateSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName,
IN PUNICODE_STRING DeviceName );
参数:
SymbolicLinkName
Unicode字符串指针,是一个用户态可见的名称。
DeviceName
Unicode字符串指针,是驱动程序创建的设备对象名称。
Return Value
如果符号链接创建成功 返回STATUS_SUCCESS
删除符号链接
IoDeleteSymbolicLink(symLinkName);
VOID IoDeleteDevice(
IN PDEVICE_OBJECT DeviceObject
);
参数
DeviceObject
PDEVICE_OBJECT类型的指针,指向需要删除的设备对象
无返回值