其实所有的HOOK,都基本是一样道理。就是勾住你的目标函数,实现你自己的功能。只要你掌握了,HOOK的原理。剩下的就是寻找目标函数了。 今天回忆一下 HOOK SYSENTER,目的当然还是继续充实自己的BLOG,继续灌水。 一:认识SYSENTER SYSENTER是一个东西?大家都知道调用门,陷阱门,任务门(这里没有照片!_!).。通过他们我们可以从R3到达R0。简单的说SYSENTER就是他们的替代品。SYSENTER是一个入的 过程,SYSEXIT是他的反过程。 我们以OpenProcess为例,看看他是怎么从R3-R0 kernel32!OpenProcess -> ntdll!ZwOpenProcess -> ntdll!KiFastSystemCall -> sysenter -> nt!KiFastCallEntry -> nt!NtOpenProcess -> nt!KiFastCallEntry> nt! KiServiceExit -> sysexit -> ntdll!KiFastSystemCallRet -> kernel32!OpenProcess 现在来看看SYSENTER是怎么样处理的。 R3-R0需要把相关的工作交给R0层的。包括:设置CS,IP,SS,SP。SYSENTER有三个特殊的寄存器(MSR)来帮助我们完成。 SYSENTER_CS_MSR SYSENTER_ESP_MSR SYSENTER_EIP_MSR 他们的地址分别是:0x174,0x175,0x176。我们可以通过指令rdmsr/wrmsr。来读写这三个寄存器。相关代码如下: _asm { mov ecx,0x176 rdmsr mov OldKiFastCallEntry,eax } 我们来看看SYSENTER的工作流程。 1. 装载SYSENTER_CS_MSR 到CS 寄存器,设置目标代码段 2. 装载SYSENTER_EIP_MSR到 EIP寄存器,设置目标指令 3. SYSENTER_CS_MSR+8 装载到SS寄存器 ,设置栈段 4. 装载SYSENTER_ESP_MSR 到ESP寄存器,设置栈帧 5. 切换RING0. 6. 清除 EFLAGS的 VM标志 7. 执行RING0例程 SYSEXIT的工作流程 1. SYSENTER_CS_MSR+16装载到 CS寄存器 2. 将EDX的值送入EIP 3. SYSENTER_CS_MSR+24 装载到SS寄存器 4. 将ECX的值送入ESP 5. 切换回RING3 6. 执行EIP处的RING3指令 这样就完成了R3-RO-R3的过程。 二:相关代码 ////////////////////////////////////////////////// // Hook SysEnter.cpp文件 extern "C" { #include <ntddk.h> } VOID UnloadDriver(PDRIVER_OBJECT pDriverObj); ULONG OldKiFastCallEntry; VOID NewKiFastCallEntry() { DbgPrint("一个系统调用...\n"); _asm { jmp DWORD PTR[OldKiFastCallEntry] } } // 驱动程序加载时调用DriverEntry例程 NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString) { pDriverObj->DriverUnload = UnloadDriver; // _asm { mov ecx,0x176 rdmsr mov OldKiFastCallEntry,eax mov eax,NewKiFastCallEntry wrmsr } // 请视情况返回DriverEntry例程执行结果 return STATUS_SUCCESS; } VOID UnloadDriver(PDRIVER_OBJECT pDriverObj) { _asm { mov ecx,0x176 xor edx,edx mov eax,OldKiFastCallEntry wrmsr } } |
Wednesday, August 31, 2011
Hook SYSENTER
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment