获得内核模块 通过DriverSection
2017-03-09 21:26
183 查看
/*************************************************************************************** * AUTHOR : yifi * DATE : 2016-1-20 * MODULE : EnumKernelModules.H * * IOCTRL Sample Driver * * Description: * Demonstrates communications between USER and KERNEL. * **************************************************************************************** * Copyright (C) 2010 yifi. ****************************************************************************************/ #ifndef CXX_ENUMKERNELMODULES_H #define CXX_ENUMKERNELMODULES_H #include <ntifs.h> typedef struct _LDR_DATA_TABLE_ENTRY64 { LIST_ENTRY64 InLoadOrderLinks; LIST_ENTRY64 InMemoryOrderLinks; LIST_ENTRY64 InInitializationOrderLinks; PVOID DllBase; PVOID EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; ULONG Flags; USHORT LoadCount; USHORT TlsIndex; PVOID SectionPointer; ULONG CheckSum; PVOID LoadedImports; PVOID EntryPointActivationContext; PVOID PatchInformation; LIST_ENTRY64 ForwarderLinks; LIST_ENTRY64 ServiceTagLinks; LIST_ENTRY64 StaticLinks; PVOID ContextInformation; ULONG64 OriginalBase; LARGE_INTEGER LoadTime; } LDR_DATA_TABLE_ENTRY64, *PLDR_DATA_TABLE_ENTRY64; typedef struct _LDR_DATA_TABLE_ENTRY32 { LIST_ENTRY32 InLoadOrderLinks; LIST_ENTRY32 InMemoryOrderLinks; LIST_ENTRY32 InInitializationOrderLinks; ULONG DllBase; ULONG EntryPoint; ULONG SizeOfImage; UNICODE_STRING32 FullDllName; UNICODE_STRING32 BaseDllName; ULONG Flags; USHORT LoadCount; USHORT TlsIndex; union { LIST_ENTRY32 HashLinks; struct { ULONG SectionPointer; ULONG CheckSum; }; }; union { struct { ULONG TimeDateStamp; }; struct { ULONG LoadedImports; }; }; } LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32; #ifdef _WIN64 #define LDR_DATA_TABLE_ENTRY LDR_DATA_TABLE_ENTRY64 #define PLDR_DATA_TABLE_ENTRY PLDR_DATA_TABLE_ENTRY64 #else #define LDR_DATA_TABLE_ENTRY LDR_DATA_TABLE_ENTRY32 #define PLDR_DATA_TABLE_ENTRY PLDR_DATA_TABLE_ENTRY32 #endif VOID UnloadDirver(PDRIVER_OBJECT DriverObject); BOOLEAN GetKernelModuleInformationByKernelModuleName(PDRIVER_OBJECT CurrentDriverObject); #endif /*************************************************************************************** * AUTHOR : yifi * DATE : 2016-1-20 * MODULE : EnumKernelModules.C * * Command: * Source of IOCTRL Sample Driver * * Description: * Demonstrates communications between USER and KERNEL. * **************************************************************************************** * Copyright (C) 2010 yifi. ****************************************************************************************/ //####################################################################################### //# I N C L U D E S //####################################################################################### /*************************************************************************************** * AUTHOR : yifi * DATE : 2016-9-8 * MODULE : KernelMode.C * * Command: * Source of IOCTRL Sample Driver * * Description: * Demonstrates communications between USER and KERNEL. * **************************************************************************************** * Copyright (C) 2010 yifi. ****************************************************************************************/ //####################################################################################### //# I N C L U D E S //####################################################################################### #ifndef CXX_KERNELMODE_H # include "KernelMode.h" #endif NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegisterPath) { GetKernelModuleInformationByKernelModuleName(DriverObject); return STATUS_SUCCESS; } BOOLEAN GetKernelModuleInformationByKernelModuleName(PDRIVER_OBJECT CurrentDriverObject) { BOOLEAN bOk = FALSE; if (CurrentDriverObject) { PLDR_DATA_TABLE_ENTRY ListHead = NULL, ListFlink = NULL; ListHead = (PLDR_DATA_TABLE_ENTRY)CurrentDriverObject->DriverSection; //dt _DriverObject DbgPrint("%S\r\n", ListHead->BaseDllName.Buffer); if (ListHead->BaseDllName.Buffer) //wcsstr(ListHead->BaseDllName.Buffer, wzKernelModuleName) != NULL) { //*KernelModuleBase = (PVOID)ListHead->DllBase; //*ulKernelModuleSize = ListHead->SizeOfImage; bOk = TRUE; } ListFlink = (PLDR_DATA_TABLE_ENTRY)ListHead->InLoadOrderLinks.Flink; while ((PLDR_DATA_TABLE_ENTRY)ListFlink != ListHead) { DbgPrint("%S\r\n", ListFlink->BaseDllName.Buffer); if (ListFlink->BaseDllName.Buffer)//&&wcsstr(ListFlink->BaseDllName.Buffer, wzKernelModuleName) != NULL) { //*KernelModuleBase = (PVOID)ListFlink->DllBase; //*ulKernelModuleSize = ListFlink->SizeOfImage; bOk = TRUE; } ListFlink = (PLDR_DATA_TABLE_ENTRY)ListFlink->InLoadOrderLinks.Flink; } } return bOk; } //BOOLEAN GetKernelModuleInformationByKernelModuleName(WCHAR* wzKernelModuleName,PVOID* KernelModuleBase,ULONG32* ulKernelModuleSize) //{ // // BOOLEAN bOk = FALSE; // if (CurrentDriverObject) // { // PLDR_DATA_TABLE_ENTRY ListHead = NULL, ListFlink = NULL; // // // // ListHead = (PLDR_DATA_TABLE_ENTRY)CurrentDriverObject->DriverSection; //dt _DriverObject // DbgPrint("%S\r\n",ListHead->BaseDllName.Buffer); // if (ListHead->BaseDllName.Buffer&& // wcsstr(ListHead->BaseDllName.Buffer,wzKernelModuleName)!=NULL) // { // // // *KernelModuleBase = (PVOID)ListHead->DllBase; // *ulKernelModuleSize = ListHead->SizeOfImage; // // bOk = TRUE; // } // // ListFlink = (PLDR_DATA_TABLE_ENTRY)ListHead->InLoadOrderLinks.Flink; // // while((PLDR_DATA_TABLE_ENTRY)ListFlink != ListHead) // { // DbgPrint("%S\r\n",ListFlink->BaseDllName.Buffer); // if (ListFlink->BaseDllName.Buffer&& // wcsstr(ListFlink->BaseDllName.Buffer,wzKernelModuleName)!=NULL) // { // // // *KernelModuleBase = (PVOID)ListFlink->DllBase; // *ulKernelModuleSize = ListFlink->SizeOfImage; // // bOk = TRUE; // } // // ListFlink = (PLDR_DATA_TABLE_ENTRY)ListFlink->InLoadOrderLinks.Flink; // } // } // // return bOk; //}
相关文章推荐
- python通过exifread模块获得图片exif信息的方法
- 通过netlink实现内核模块和应用层通信
- 在内核中通过/proc/kallsyms获得符号的地址
- 内核程序中通过KPCR获取内核模块基址
- 内核中通过/proc/kallsyms获得符号的地址--全局变量snd_write_bypass
- 在内核模块中通过系统调用ioctl获取ATA/SCSI硬盘序列号
- 通过ramdisk内核模块研究Linux文件系统
- kernel module编程(九):通过用户程序的strace检查内核模块调用情况
- 通过内核模块设置服务器看门狗的方法
- Arch下永久去掉响铃---Beep(通过添加内核模块配置文件的方法)
- 通过hello world介绍2.6内核模块编译的最基本原理 .
- 在内核中通过/proc/kallsyms获得符号的地址
- 通过make编译多文件的内核模块
- Linux 2.6版内核中通过模块获取sys_call_table地址的方法
- 内核子系统或设备驱动可以直接编译到内核,也可以编译成模块,如果编译到内核,可以使用前一节介绍的方法通过内核启动参数来向它们传递参数,如果编译成模块,则可以通过命令行在插入模块时传递参数,或者在运行时,
- 应用层创建socket,内核模块通过该socket发送数据包
- 通过hello world介绍2.6内核模块编译的最基本原理
- 增加Linux系统调用——通过增加内核模块
- [译]5.10. Tuning via /procs Filesystem 通过/proc文件系统来调整内核模块
- 通过GDB调试内核(Kernel)和模块(Module)