-
-
[原创]从应用层进程中KiFastSystemCall接管进入内核的一切
-
发表于:
2014-7-6 11:06
14293
-
[原创]从应用层进程中KiFastSystemCall接管进入内核的一切
早期时候发过一个帖子 http://bbs.pediy.com/showthread.php?t=163658 介绍 HOOK KiFastSystemCall 这算是这帖子的延续 完整版.
大致原理就是构造一个类似内核中SSDT表的HOOK数组存,当有函数通过KiFastSystemCall进入系统内核时 查找HOOK数组,看对应的Index中有无函数地址,有的话跳入新函数地址. 主要问题在于进入我们的函数时如果获取参数并且获取调用后函数返回!
DWORD dwKiFastSystemCall;
DWORD dwKiFastSystemCallReturn;
//HOOK后跳入的函数地址
DWORD dwHookSystemCall[0x2048*2];
//保存原始函数调用地址
DWORD *dwOrigSystemCall[0x2048*2];
__declspec(naked) void KiFastSystemCallEx()
{
__asm {
mov edx,esp
__emit 0x0F
__emit 0x34
retn
}
}
//EX SystemCall
__declspec(naked) void SystemCall()
{
__asm {
__emit 0x90
mov eax,0x11B2
call KiFastSystemCallEx
retn 0xFF
__emit 0x90
}
}
__declspec(naked) void KiFastSystemCall()
{
__asm{
pushad
pushfd
cmp dword ptr [eax*4+dwHookSystemCall],0
jz Label
popfd
popad
add esp,4
jmp dword ptr [dwHookSystemCall+eax*4]
Label:
popfd
popad
jmp KiFastSystemCallEx
}
}
add esp,4
//初始化
BOOL HookSystemCall::Initialization()
{
DWORD dwOldProtect;
HMODULE hModule = GetModuleHandleA("NTDLL.dll");
dwKiFastSystemCall = PtrToUlong(GetProcAddress(hModule, "KiFastSystemCall"));
dwKiFastSystemCallReturn = dwKiFastSystemCall + 2;
VirtualProtect(ULongToPtr(dwKiFastSystemCall - 0xA), 100, PAGE_EXECUTE_READWRITE, &dwOldProtect);
//保存原始代码
memcpy(szCode,(VOID*)(dwKiFastSystemCall - 6),0xF);
// Hook KiFastSystemCall
*(PWORD)ULongToPtr(dwKiFastSystemCall) = 0xF9EB;
*(PBYTE)ULongToPtr(dwKiFastSystemCall - 0x5) = 0xE9;
*(PDWORD)ULongToPtr(dwKiFastSystemCall - 0x4) = PtrToUlong(KiFastSystemCall) - (dwKiFastSystemCall - 0x5) - 5;
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课