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;
}
64位下暴力搜索硬编码
最新推荐文章于 2023-11-01 18:11:12 发布
该博客主要介绍了如何在Windows系统中获取内核模块(如ntoskrnl.exe)的基础地址。通过遍历_LDR_DATA_TABLE_ENTRY结构体的链表,找到对应的基址。同时,展示了使用MmIsAddressValid函数检查内存地址的有效性,以及通过特定指令序列搜索内核函数的方法。
摘要由CSDN通过智能技术生成