日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Win64 驱动内核编程-25.X64枚举和隐藏内核模块

發(fā)布時間:2025/6/17 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win64 驱动内核编程-25.X64枚举和隐藏内核模块 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

X64枚舉和隱藏內(nèi)核模塊

? ? 在?WIN64?上枚舉內(nèi)核模塊的人方法:使用?ZwQuerySystemInformation?的第?11?號功能和枚舉?KLDR_DATA_TABLE_ENTRY?中的?InLoadOrderLinks?雙向鏈表;隱藏內(nèi)核模塊的通用方法是把指定的驅(qū)動對象從?KLDR_DATA_TABLE_ENTRY中的?InLoadOrderLinks?雙向鏈表上摘除。

X64內(nèi)核模塊枚舉(注意是在R3

#include <stdio.h> #include <Windows.h>typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION) (IN ULONG SystemInformationClass,OUT PVOID SystemInformation,IN ULONG Length,OUT PULONG ReturnLength );typedef unsigned long DWORD;typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {ULONG Unknow1;ULONG Unknow2;ULONG Unknow3;ULONG Unknow4;PVOID Base;ULONG Size;ULONG Flags;USHORT Index;USHORT NameLength;USHORT LoadCount;USHORT ModuleNameOffset;char ImageName[256]; } SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;typedef struct _SYSTEM_MODULE_INFORMATION {ULONG Count;//內(nèi)核中以加載的模塊的個數(shù)SYSTEM_MODULE_INFORMATION_ENTRY Module[1]; } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation;BOOLEAN EnumKM(char *HighlightDrvName) {ULONG NeedSize, i, ModuleCount, HLed=0, BufferSize = 0x5000;PVOID pBuffer = NULL;PCHAR pDrvName = NULL;NTSTATUS Result;PSYSTEM_MODULE_INFORMATION pSystemModuleInformation;do{//分配內(nèi)存pBuffer = malloc( BufferSize );if( pBuffer == NULL )return 0;//查詢模塊信息Result = ZwQuerySystemInformation( 11, pBuffer, BufferSize, &NeedSize );if( Result == 0xC0000004L ){free( pBuffer );BufferSize *= 2;}else if( Result<0 ){//查詢失敗則退出free( pBuffer );return 0;}}while( Result == 0xC0000004L );pSystemModuleInformation = (PSYSTEM_MODULE_INFORMATION)pBuffer;//獲得模塊的總數(shù)量ModuleCount = pSystemModuleInformation->Count;//遍歷所有的模塊for( i = 0; i < ModuleCount; i++ ){if((ULONG64)(pSystemModuleInformation->Module[i].Base) > (ULONG64)0x8000000000000000){pDrvName = pSystemModuleInformation->Module[i].ImageName+pSystemModuleInformation->Module[i].ModuleNameOffset;printf("0x%llx\t%s",(ULONG64)pSystemModuleInformation->Module[i].Base,pDrvName);if( _stricmp(pDrvName,HighlightDrvName)==0 ){printf("\t\t<--------------------");HLed=1;}printf("\n");}}if(HLed==0)printf("\n[%s] NOT FOUND!",HighlightDrvName);free(pBuffer);return 1; }int main() { ZwQuerySystemInformation=(ZWQUERYSYSTEMINFORMATION)GetProcAddress(LoadLibraryW(L"ntdll.dll"),"ZwQuerySystemInformation");EnumKM("win32k.sys");getchar();return 0; }
然后是R0 隱藏內(nèi)核模塊,摘鏈問題。也就是要注意結(jié)構(gòu)定義細節(jié)就行了。

#include <ntddk.h>#define kprintf DbgPrint #define kmalloc(_s) ExAllocatePoolWithTag(NonPagedPool, _s, 'SYSQ') #define kfree(_p) ExFreePool(_p)NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation (IN ULONG SystemInformationClass,OUT PVOID SystemInformation,IN ULONG Length,OUT PULONG ReturnLength );typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {ULONG Unknow1;ULONG Unknow2;ULONG Unknow3;ULONG Unknow4;PVOID Base;ULONG Size;ULONG Flags;USHORT Index;USHORT NameLength;USHORT LoadCount;USHORT ModuleNameOffset;char ImageName[256]; } SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;typedef struct _SYSTEM_MODULE_INFORMATION {ULONG Count;//內(nèi)核中以加載的模塊的個數(shù)SYSTEM_MODULE_INFORMATION_ENTRY Module[1]; } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;typedef struct _KLDR_DATA_TABLE_ENTRY {LIST_ENTRY64 InLoadOrderLinks;ULONG64 __Undefined1;ULONG64 __Undefined2;ULONG64 __Undefined3;ULONG64 NonPagedDebugInfo;ULONG64 DllBase;ULONG64 EntryPoint;ULONG SizeOfImage;UNICODE_STRING FullDllName;UNICODE_STRING BaseDllName;ULONG Flags;USHORT LoadCount;USHORT __Undefined5;ULONG64 __Undefined6;ULONG CheckSum;ULONG __padding1;ULONG TimeDateStamp;ULONG __padding2; }KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;PDRIVER_OBJECT pDriverObject = NULL;ULONG64 GetSystemModuleBase(char* lpModuleName) {ULONG NeedSize, i, ModuleCount, BufferSize = 0x5000;PVOID pBuffer = NULL;PCHAR pDrvName = NULL;NTSTATUS Result;PSYSTEM_MODULE_INFORMATION pSystemModuleInformation;do{//分配內(nèi)存pBuffer = kmalloc( BufferSize );if( pBuffer == NULL )return 0;//查詢模塊信息Result = ZwQuerySystemInformation( 11, pBuffer, BufferSize, &NeedSize );if( Result == STATUS_INFO_LENGTH_MISMATCH ){kfree( pBuffer );BufferSize *= 2;}else if( !NT_SUCCESS(Result) ){//查詢失敗則退出kfree( pBuffer );return 0;}}while( Result == STATUS_INFO_LENGTH_MISMATCH );pSystemModuleInformation = (PSYSTEM_MODULE_INFORMATION)pBuffer;//獲得模塊的總數(shù)量ModuleCount = pSystemModuleInformation->Count;//遍歷所有的模塊for( i = 0; i < ModuleCount; i++ ){if((ULONG64)(pSystemModuleInformation->Module[i].Base) > (ULONG64)0x8000000000000000){pDrvName = pSystemModuleInformation->Module[i].ImageName+pSystemModuleInformation->Module[i].ModuleNameOffset;if( _stricmp(pDrvName,lpModuleName)==0 )return (ULONG64)pSystemModuleInformation->Module[i].Base;}}kfree(pBuffer);return 0; }VOID HideDriver(char *pDrvName) {PKLDR_DATA_TABLE_ENTRY entry=(PKLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;PKLDR_DATA_TABLE_ENTRY firstentry;ULONG64 pDrvBase=0;KIRQL OldIrql;firstentry = entry;pDrvBase = GetSystemModuleBase(pDrvName);while((PKLDR_DATA_TABLE_ENTRY)entry->InLoadOrderLinks.Flink != firstentry){if( entry->DllBase==pDrvBase ){//typedef struct LIST_ENTRY64 {// ULONGLONG Flink;// ULONGLONG Blink;//} LIST_ENTRY64;//typedef LIST_ENTRY64 *PLIST_ENTRY64;//le->Flink->Blink=le->Blink;//le->Blink->Flink=le->Flink;OldIrql = KeRaiseIrqlToDpcLevel();((LIST_ENTRY64*)(entry->InLoadOrderLinks.Flink))->Blink=entry->InLoadOrderLinks.Blink;((LIST_ENTRY64*)(entry->InLoadOrderLinks.Blink))->Flink=entry->InLoadOrderLinks.Flink;entry->InLoadOrderLinks.Flink=0;entry->InLoadOrderLinks.Blink=0;KeLowerIrql(OldIrql);DbgPrint("Remove LIST_ENTRY64 OK!");break;}//kprintf("%llx\t%wZ\t%wZ",entry->DllBase,entry->BaseDllName,entry->FullDllName);entry = (PKLDR_DATA_TABLE_ENTRY)entry->InLoadOrderLinks.Flink;} }NTSTATUS UnloadDriver(IN PDRIVER_OBJECT DriverObject) {return STATUS_SUCCESS; }NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {DriverObject->DriverUnload = UnloadDriver;pDriverObject = DriverObject;HideDriver("win32k.sys"); //hidekm64.sysreturn STATUS_SUCCESS; }

?

?

?

總結(jié)

以上是生活随笔為你收集整理的Win64 驱动内核编程-25.X64枚举和隐藏内核模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。