64位下暴力搜索硬编码

该博客主要介绍了如何在Windows系统中获取内核模块(如ntoskrnl.exe)的基础地址。通过遍历_LDR_DATA_TABLE_ENTRY结构体的链表,找到对应的基址。同时,展示了使用MmIsAddressValid函数检查内存地址的有效性,以及通过特定指令序列搜索内核函数的方法。
摘要由CSDN通过智能技术生成
ULONG64 g_kernelModuleBase=0;

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
	{
		ULONG TimeDateStamp;
		PVOID LoadedImports;
	};
	PULONG_PTR * EntryPointActivationContext;
	PVOID PatchInformation;
	LIST_ENTRY ForwarderLinks;
	LIST_ENTRY ServiceTagLinks;
	LIST_ENTRY StaticLinks;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;


ULONG_PTR GetKernelModuleBase(PDRIVER_OBJECT pDriverObj)
{

	PLDR_DATA_TABLE_ENTRY pLDTE = NULL;
	PLDR_DATA_TABLE_ENTRY pNextLDTE = NULL;

	pLDTE = pDriverObj->DriverSection;
	//用pNextLDTE来遍历链表
	pNextLDTE = pLDTE;
	UNICODE_STRING moduleName;
	RtlInitUnicodeString(&moduleName, L"ntoskrnl.exe");

	do{
		if (pNextLDTE->BaseDllName.Buffer == NULL)
		{
			pNextLDTE = (PLDR_DATA_TABLE_ENTRY)(((PLIST_ENTRY)pNextLDTE)->Flink);
			continue;
		}

		if (RtlCompareUnicodeString(&moduleName, &pNextLDTE->BaseDllName, FALSE) == 0)
		{
			return (ULONG_PTR)(pNextLDTE->DllBase);
		}


		//下面这两种方式都可以  原理是 _LDR_DATA_TABLE_ENTRY 的第一项是PLIST_ENTRY   +0  Blink  +4Flink
		//pNextLDTE=(PLDR_DATA_TABLE_ENTRY)(*((PULONG)pNextLDTE+1));  
		pNextLDTE = (PLDR_DATA_TABLE_ENTRY)(((PLIST_ENTRY)pNextLDTE)->Flink);

	} while (pLDTE != pNextLDTE);
		RtlFreeUnicodeString(&moduleName);
	return 0;
}

typedef BOOLEAN (*SEARCHPROC)(ULONG_PTR i);


ULONG_PTR SearchFunction(SEARCHPROC SearchProc)
{

	for (ULONG_PTR i = g_kernelModuleBase; i < g_kernelModuleBase + 0xffffff; i++)
	{

		if (!MmIsAddressValid((PVOID)i))
		{
			i = i + 0x1000;
			KdPrint(("无效页:%I64x\n", i));
			continue;
		}

		if (SearchProc(i))
		{
			return i;
		}
	}
	return 0;
}

BOOLEAN MiProcessLoderEntryProc(ULONG_PTR i)
{
	if (*(PUCHAR)i == 0x48 && *((PUCHAR)i + 0xa) == 0x57 && *((PUCHAR)i + 0x24) == 0xb2 && *((PUCHAR)i + 0x25) == 0x01 && *((PUCHAR)i + 0x40) == 0xe8 && *((PUCHAR)i + 0x41) == 0x83)
	{
		return TRUE;
	}
	return FALSE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值