驱动对象初识

介绍:

驱动程序:就是一个.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的属性为可读可写,就不会触发异常,也就不会触发写拷贝了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值