介绍:
驱动程序:就是一个.sys模块,
驱动对象:则是.sys被加载到内核中的实例化出来的对象, 用于表示这个驱动模块.
ntdll!_DRIVER_OBJECT
+0x000 Type : 0n4
+0x002 Size : 0n168
+0x004 DeviceObject : (null)
+0x008 Flags : 0x12
+0x00c D : 0xf794d000 Void
+0x010 DriverSize : 0x6000
+0x014 DriverSection : 0x8619bcb8 Void
+0x018 DriverExtension : 0x86127460 _DRIVER_EXTENSION
+0x01c DriverName : _UNICODE_STRING "\Driver\MyDriver1"
+0x024 HardwareDatabase : 0x80671ae0 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
+0x028 FastIoDispatch : (null)
+0x02c DriverInit : 0xf7951000 long MyDriver1!GsDriverEntry+0
+0x030 DriverStartIo : (null)
+0x034 DriverUnload : 0xf794e030 void MyDriver1!DriverUnload+0
+0x038 MajorFunction : [28] 0x804f454a long nt!IopInvalidDeviceRequest+0
type:驱动对象类型
Size:驱动对象大小
DeviceObject:设备对象
DriverStart:驱动加载的位置
DriverSize:模块大小
DriverSection:一个结构体,未导出文档 _LDR_DATA_TABLE_ENTRY
DriverExtension:驱动扩展对象,一个结构体
DriverName:驱动名
HardwareDatabase:驱动注册表路径
DriverInit:驱动入口点
DriverUnload:驱动卸载函数地址
MajorFunction:回调函数列表
驱动前两个字段是固定的,可以通过特征找到系统中所以驱动,替换MajorFunction拦截消息
kd> dt _DRIVER_EXTENSION
ntdll!_DRIVER_EXTENSION
+0x000 DriverObject : Ptr32 _DRIVER_OBJECT //指向当前驱动对象首地址。
+0x004 AddDevice : Ptr32 long
+0x008 Count : Uint4B
+0x00c ServiceKeyName : _UNICODE_STRING //驱动服务注册表文件夹名。
+0x014 ClientDriverExtension : Ptr32 _IO_CLIENT_EXTENSION
+0x018 FsFilterCallbacks : Ptr32 _FS_FILTER_CALLBACKS
kd> dt _LDR_DATA_TABLE_ENTRY
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY //双向链表,加载的模块
+0x008 InMemoryOrderLinks : _LIST_ENTRY
+0x010 InInitializationOrderLinks : _LIST_ENTRY
+0x018 DllBase : Ptr32 Void
+0x01c EntryPoint : Ptr32 Void
+0x020 SizeOfImage : Uint4B
+0x024 FullDllName : _UNICODE_STRING //驱动对象全路径
+0x02c BaseDllName : _UNICODE_STRING //驱动名字
+0x034 Flags : Uint4B
+0x038 LoadCount : Uint2B
+0x03a TlsIndex : Uint2B
+0x03c HashLinks : _LIST_ENTRY
+0x03c SectionPointer : Ptr32 Void
+0x040 CheckSum : Uint4B //校验和
+0x044 TimeDateStamp : Uint4B
+0x044 LoadedImports : Ptr32 Void
+0x048 EntryPointActivationContext : Ptr32 Void
+0x04c PatchInformation : Ptr32 Void
驱动断链隐藏
#include<ntddk.h>
#pragma warning( disable : 4100)
void DriverUnload(PDRIVER_OBJECT pDriver)
{
DbgPrint("卸载!");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)//类似main
{
PLIST_ENTRY Section;
Section = pDriver->DriverSection;;
DbgPrint("%wZ Hello world %X!", pReg, pDriver);//输出驱动安装位置&驱动所在地址
DbgBreakPoint();
Section->Blink->Flink = Section->Flink;
Section->Flink->Blink = Section->Blink;
DbgBreakPoint();
pDriver->DriverUnload = DriverUnload;//驱动程序必须含有卸载函数
return STATUS_SUCCESS;
}
写拷贝:
是指如果在当前写的地址是写拷贝属性的,会报一个异常,然后会把你写的地址所有内容复制到另一个新的地址中去,在新的地址中进行写操作。并不会影响原内容
kd> dt _EPROCESS 85ef90f8
ntdll!_EPROCESS
...
+0x0c4 ObjectTable : 0xe1499c18 _HANDLE_TABLE
+0x0c8 Token : _EX_FAST_REF
+0x0cc WorkingSetLock : _FAST_MUTEX
+0x0ec WorkingSetPage : 0x1a687
+0x0f0 AddressCreationLock : _FAST_MUTEX
+0x110 HyperSpaceLock : 0
+0x114 ForkInProgress : (null)
+0x118 HardwareTrigger : 0
+0x11c VadRoot : 0x85fc7378 Void //线性地址管理的基址
+0x120 VadHint : 0x85ec6978 Void
+0x124 CloneRoot : (null)
+0x128 NumberOfPrivatePages : 0x217
+0x12c NumberOfLockedPages : 0
+0x130 Win32Process : 0xe10a4300 Void
...
kd> !vad 0x85fc7378
VAD Level Start End Commit
...
861a7f00 7 18b0 1aaf 89 Private READWRITE
85ec6978 2 50000 50147 8 Mapped Exe EXECUTE_WRITECOPY \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\DEVSHL.DLL
85ec6f30 5 50300 5035d 4 Mapped Exe EXECUTE_WRITECOPY \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\DEVPRJ.PKG
85e74f30 6 50400 50578 21 Mapped Exe EXECUTE_WRITECOPY \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\IDE\DEVRES.PKG
86192a10 4 50800 508bc 15 Mapped Exe EXECUTE_WRITECOPY \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\DEVEDIT.PKG
86181f30 6 50c00 50c93 7 Mapped Exe EXECUTE_WRITECOPY \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\IDE\DEVDBG.PKG
...
level :层级
start :开始地址 单位是页
end : 结束地址
commit : 属性 EXECUTE_WRITECOPY -写拷贝
绕过方法:
申请一个新的线性地址,新的pte 。和要hook的地方指向同一个物理页
直接修改pte的属性为可读可写,就不会触发异常,也就不会触发写拷贝了。