-
-
[原创]另类获取nt基址
-
发表于: 2017-3-14 17:13 4305
-
首先这篇翻译文有详细解释了PG是如何运作的
http://bbs.pediy.com/thread-148451.htm
其中有这么一段:
如果系统不是以安全模式启动的,则KiInitializePatchGuard()就会开始初始化PG子系统了:
(1). 计算ntoskrnl.exe中的INITKDBG节的大小
已知nt!FsRtlUninitializeSmallMcb()函数就在INITKDBG节中。
将nt!FsRtlUninitializeSmallMcb()函数的地址传递给nt!RtlPcToFileHeader。
RtlPcToFileHeader在ntoskrnl.exe中搜索FsRtlUninitializeSmallMcb()后,第二个输出参数返回一个nt基地址。
将得到的nt基地址传给nt!RtlImageNtHeader()函数。这个函数返回一个PIMAGE_NT_HEADERS指针。
FsRtlUninitializeSmallMcb()的RVA = FsRtlUninitializeSmallMcb()地址 – nt基地址。
然后将nt基地址、获得的IMAGE_NT_HEADERS地址、RVA传递给nt!RtlSectionTableFromVirtualAddress()函数,从而计算出INITKDBG节的基地址。
标红的就是重点,通过RtlPcToFileHeader获得NtBase
代码如下:
NTKERNELAPI PVOID NTAPI RtlPcToFileHeader(_In_ PVOID PcValue, _Out_ PVOID *BaseOfImage);
using RtlPcToFileHeaderType = decltype(RtlPcToFileHeader);
void *UtilGetSystemProcAddress(
const wchar_t *proc_name) {
PAGED_CODE();
UNICODE_STRING proc_name_U = {};
RtlInitUnicodeString(&proc_name_U, proc_name);
return MmGetSystemRoutineAddress(&proc_name_U);
}
void *UtilPcToFileHeader(void *pc_value) {
void *base = nullptr;
return g_utilp_RtlPcToFileHeader(pc_value, &base);
}
auto p_RtlPcToFileHeader = UtilGetSystemProcAddress(L"RtlPcToFileHeader");
if (p_RtlPcToFileHeader)
g_utilp_RtlPcToFileHeader = reinterpret_cast<RtlPcToFileHeaderType *>(p_RtlPcToFileHeader);
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创]1字节 [hook引擎] 开源分享,最高效,简单 11348
- [讨论][求助]某游戏的变态R3级保护....我TM没辙了,求助攻 14128
- [悬赏]手机游戏外挂,要如何防护,检测? 5076
- [原创]另类获取nt基址 4306