L o a d i n g . . .
主打一个C++
文章详情

C++驱动层通过内核导出变量PsLoadedModuleList遍历获取驱动信息

Posted on 2018-08-10 13:21:35 by 主打一个C++

LDR_DATA_TABLE_ENTRY结构:

typedef struct _LDR_DATA_TABLE_ENTRY {
	LIST_ENTRY InLoadOrderLinks;
	LIST_ENTRY InMemoryOrderLinks;
	LIST_ENTRY InInitializationOrderLinks;
	PVOID DllBase;
	PVOID EntryPoint;
	ULONG SizeOfImage;
	UNICODE_STRING FullDllName;
	UNICODE_STRING BaseDllName;
	ULONG Flags;
	USHORT LoadCount;
	USHORT TlsIndex;
	union {
		LIST_ENTRY HashLinks;
		struct {
			PVOID SectionPointer;
			ULONG CheckSum;
		};
	};
	union {
		struct {
			ULONG TimeDateStamp;
		};
		struct {
			PVOID LoadedImports;
		};
	};
	struct _ACTIVATION_CONTEXT* EntryPointActivationContext;

	PVOID PatchInformation;

} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;

关键遍历函数:

void EnumDriver()
{

	int count = 0;
	PLIST_ENTRY listHead = PsLoadedModuleList.Flink;
	PLIST_ENTRY entry= listHead;
	for (entry = listHead->Flink; entry != listHead && ++count < 500; entry = entry->Flink)
	{
		// 假定类型为LDR_DATA_TABLE_ENTRY
		PLDR_DATA_TABLE_ENTRY moduleEntry = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);

		// 获取模块名称,作为测试,只输出名称即可
		UNICODE_STRING moduleName = moduleEntry->BaseDllName;

		// 根据模块名获取PDRIVER_OBJECT
		//PDRIVER_OBJECT driverObject = NULL;

		DbgPrint("[%d] Name=[%ws]\n", count, moduleName.Buffer);
	}
}

image.png

*转载请注明出处:原文链接:https://cpp.vin/page/83.html

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog