首页
社区
课程
招聘
[原创]另类获取nt基址
发表于: 2017-3-14 17:13 4305

[原创]另类获取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);




[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//