- 注册时间
 - 2021-4-16
 
- 最后登录
 - 2025-3-14
 
- 在线时间
 - 6 小时
 
 
 
 
 
编程入门 
  
	- 龙马币
 - 470 
 
 
 
 
 | 
 
 
思路来源是CSDN的一位大佬,不过他的文章中只提到了关键函数,没有贴出代码,于是乎,自己动手~ 
 
- extern "C" NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);
 
 -  
 
 - typedef struct _KLDR_DATA_TABLE_ENTRY {
 
 -     LIST_ENTRY InLoadOrderLinks;
 
 -     PVOID ExceptionTable;
 
 -     ULONG ExceptionTableSize;
 
 -     PVOID GpValue;
 
 -     ULONG UnKnow;
 
 -     PVOID DllBase;
 
 -     PVOID EntryPoint;
 
 -     ULONG SizeOfImage;
 
 -     UNICODE_STRING FullDllName;
 
 -     UNICODE_STRING BaseDllName;
 
 -     ULONG Flags;
 
 -     USHORT LoadCount;
 
 -     USHORT __Unused5;
 
 -     PVOID SectionPointer;
 
 -     ULONG CheckSum;
 
 -     PVOID LoadedImports;
 
 -     PVOID PatchInformation;
 
 - } KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;
 
 -  
 
 - typedef struct _SYSINFO {
 
 -     ULONG U;
 
 -     PVOID X[2];
 
 -     PVOID BaseAddress;
 
 -     PVOID Size;
 
 - } SYSINFO, *PSYSINFO;
 
 -  
 
 - typedef VOID(*_MiProcessLoaderEntry)(IN PKLDR_DATA_TABLE_ENTRY DataTableEntry, IN LOGICAL Insert);
 
 -  
 
 - VOID HideDriver(PDRIVER_OBJECT DriverObject, ULONG Offset) {
 
 -     ULONG NeededSize;
 
 -     PSYSINFO SysInfo = (PSYSINFO)&SysInfo;
 
 -     ZwQuerySystemInformation(11, NULL, 0, &NeededSize);
 
 -     SysInfo = (PSYSINFO)ExAllocatePool(PagedPool, NeededSize);
 
 -     ZwQuerySystemInformation(11, SysInfo, NeededSize, NULL);
 
 -     _MiProcessLoaderEntry MiProcessLoaderEntry = (_MiProcessLoaderEntry)((PUCHAR)SysInfo->BaseAddress + Offset);
 
 -     MiProcessLoaderEntry((PKLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection, 0);
 
 - }
 
  复制代码 
其中HideDriver函数就是主要代码啦,一共7行(诚实的楼主)。 
 
第二个参数是版本偏移(其实就是硬编码= =我自己通过IDA找出来的) 
Win7 32位是 0x761D7 ,Win7 64位是 0x16A1D0 ,Win10 64位是 0x18AD8 。 
 
我根据多份系统样品的IDA分析,这个常量应该是不会变的,其中Win10的截至1809Preview(build 17713)暂未改变。 
 
结构体KLDR_DATA_TABLE_ENTRY来自百度。 
结构体SYSINFO为自创,网上找的定位ntoskrnl基址的代码都太繁琐或者兼容性差,so我自己改了一下~ 
在卸载驱动之前必须恢复隐藏,也就是再调用一次函数,第二个参数由0改成1。 
我这个方法隐藏驱动后一切正常,不触发PG,可以与应用层通信,也可以FltRegisterFilter等。 
 
但如果按照原文中说的执行DriverObject->DriverSection = NULL后会出问题(在MajorFunction[IRP_MJ_DEVICE_CONTROL]函数中执行的), 
不知道是不是我注册了MiniFilter导致的-_-... 
 
-------------------------------------------- 
好了,本小白继续去钻研WSK去了(⊙o⊙)… 
 
 
 |   
 
 
 
 |