看流星社区

 找回密码
 注册账号
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 48|回复: 1

64位系统下7行代码隐藏驱动,不触发PG。

[复制链接]

该用户从未签到

发表于 2020-3-22 20:25:54 | 显示全部楼层 |阅读模式

思路来源是CSDN的一位大佬,不过他的文章中只提到了关键函数,没有贴出代码,于是乎,自己动手~

  1. extern "C" NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);

  2. typedef struct _KLDR_DATA_TABLE_ENTRY {
  3.     LIST_ENTRY InLoadOrderLinks;
  4.     PVOID ExceptionTable;
  5.     ULONG ExceptionTableSize;
  6.     PVOID GpValue;
  7.     ULONG UnKnow;
  8.     PVOID DllBase;
  9.     PVOID EntryPoint;
  10.     ULONG SizeOfImage;
  11.     UNICODE_STRING FullDllName;
  12.     UNICODE_STRING BaseDllName;
  13.     ULONG Flags;
  14.     USHORT LoadCount;
  15.     USHORT __Unused5;
  16.     PVOID SectionPointer;
  17.     ULONG CheckSum;
  18.     PVOID LoadedImports;
  19.     PVOID PatchInformation;
  20. } KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;

  21. typedef struct _SYSINFO {
  22.     ULONG U;
  23.     PVOID X[2];
  24.     PVOID BaseAddress;
  25.     PVOID Size;
  26. } SYSINFO, *PSYSINFO;

  27. typedef VOID(*_MiProcessLoaderEntry)(IN PKLDR_DATA_TABLE_ENTRY DataTableEntry, IN LOGICAL Insert);

  28. VOID HideDriver(PDRIVER_OBJECT DriverObject, ULONG Offset) {
  29.     ULONG NeededSize;
  30.     PSYSINFO SysInfo = (PSYSINFO)&SysInfo;
  31.     ZwQuerySystemInformation(11, NULL, 0, &NeededSize);
  32.     SysInfo = (PSYSINFO)ExAllocatePool(PagedPool, NeededSize);
  33.     ZwQuerySystemInformation(11, SysInfo, NeededSize, NULL);
  34.     _MiProcessLoaderEntry MiProcessLoaderEntry = (_MiProcessLoaderEntry)((PUCHAR)SysInfo->BaseAddress + Offset);
  35.     MiProcessLoaderEntry((PKLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection, 0);
  36. }
复制代码


其中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⊙)…
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2020-3-31 00:58

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表