|
最近在学习win64下的驱动编程, 想自己写一款ARK软件
在坛主的<<WIN64驱动编程基础教程>> 中的关于SSDT UnHook获取SSDT原始函数地址的算法:
代码是这么实现的基本就是教程里的代码,我稍微改动了一些:
获取NtosBase的函数:
- VOID CUtils::GetNtosBase(ULONGLONG& NtosBase, CHAR* NtosName)
- {
- char FileName[260] = { 0 }, *FullName;
- NtosBase = GetNtosBaseAndPath(FileName);
- FullName = cs("C:\\Windows\\system32\", FileName);
- strcpy(NtosName, FullName);
- printf("NTOSKRNL base: %llx\n", NtosBase);
- printf("NTOSKRNL name: %s\n", NtosName);
- }
复制代码
获取NtosImageBase的函数
- VOID CUtils::GetNtosImageBase(ULONGLONG &NtosImageBase, char* NtosName)
- {
- PIMAGE_NT_HEADERS64 pinths64;
- PIMAGE_DOS_HEADER pdih;
- char *NtosFileData = NULL;
- NtosFileData = LoadDllContext(NtosName);
- pdih = (PIMAGE_DOS_HEADER)NtosFileData;
- pinths64 = (PIMAGE_NT_HEADERS64)(NtosFileData + pdih->e_lfanew);
- NtosImageBase = pinths64->OptionalHeader.ImageBase;
- printf("ImageBase: %llx\n", NtosImageBase);
- free(NtosFileData);
- }
复制代码
最终获取原始函数地址的函数:
- ULONGLONG CSSDTHookView::GetFunctionOriginalAddress(DWORD index)
- {
- //"C:\\Windows\\system32\\ntkrnlmp.exe"
- if (NtosInProcess == 0)
- NtosInProcess = (ULONGLONG)LoadLibraryExA(NtosName, 0, DONT_RESOLVE_DLL_REFERENCES);
- if (KiServiceTable == 0)
- {
- DWORD dwRet = 0;
- KiServiceTableAddr_INFO info;
- DriverCtrl::GetInstance()->IoControl(0x807, 0, 0, &info, sizeof(KiServiceTableAddr_INFO), &dwRet);
- if (dwRet <= 0)
- {
- MessageBox(L"获取KiServerTable地址失败", L"错误");
- return 0;
- }
- KiServiceTable = info.addr;
- }
- ULONGLONG RVA = KiServiceTable - NtosBase;
- ULONGLONG test = (NtosInProcess + RVA + 8 * (ULONGLONG)index);
- ULONGLONG temp = *(PULONGLONG) (NtosInProcess + RVA + 8 * (ULONGLONG)index);
- //IMAGE_OPTIONAL_HEADER64.ImageBase=0x140000000(这个值基本是固定的)
- ULONGLONG RVA_index = temp - NtosImageBase;
- return RVA_index + NtosBase;
- }
复制代码
我调试看了,其中的KiServiceTable 的地址是没问题的, 这是一次我调试断点变量的值
- NtosInProcess 7ff6f7ff0000
- NtosBase fffff800e881e000
- KiServiceTable fffff800e8b6d000
- NtosImageBase 140000000
复制代码
好像也都没什么问题,但是计算结果还有很大误差,我本机没有开任何可能hook ssdt(修该)函数地址的软件
下面是我的程序获取到的截图
这是我的系统版本信息
这个问题困扰我好几天了, 各种百度谷歌没有找到好的解决办法, 希望路过的大牛不吝赐教,指点一下, 先谢谢了!
|
|