KiFastCallEntry过游戏驱动保护新玩法
内核重载+Hook KiFastCallEntry已经烂大街,白菜价格的技术了,所以我们要创新,我们要有新玩法:内核重载新玩法---借尸还魂。什么叫借尸还魂?基本的解释就是:迷信传说人死后灵魂还会借别人的尸体复活。但是用在计算机里面,顾名思义就是借助别人的东西来实现自己的目的。也就是借尸还魂的基本理论:借助360的HookPort,我们再Hook 360这个函数,即可绕过一些游戏保护对此函数的检测。那我们现在先来看360对KiFastCallEntry的Hook:
80542600 8b3f mov edi,dword ptr
80542602 8b1c87 mov ebx,dword ptr
80542605 e9d6945109 jmp 89a5bae0
lkd> u 89a5bae0
89a5bae0 e91f5e8527 jmp b12b1904
89a5bae5 0000 add byte ptr ,al
89a5bae7 0002 add byte ptr ,al
89a5bae9 0003 add byte ptr ,al
lkd> u b12b1904 l 20
b12b1904 8bff mov edi,edi
b12b1906 9c pushfd
b12b1907 60 pushad
b12b1908 57 push edi
b12b1909 53 push ebx
b12b190a 50 push eax
b12b190b e860ffffff call b12b1870
b12b1910 89442410 mov dword ptr ,eax
b12b1914 61 popad
b12b1915 9d popfd
b12b1916 2be1 sub esp,ecx
b12b1918 c1e902 shr ecx,2
b12b191b ff351c432bb1 push dword ptr ds:
b12b1921 c3 ret
我们怎么知道360这个Hook函数的参数,以及返回地址是什么含义呢?
b12b1908 57 push edi
b12b1909 53 push ebx
b12b190a 50 push eax
b12b190b e860ffffff call b12b1870
自己hook b12b1870,打印出來這些參數,就懂了。。
帖子的核心:借助360的HookPort,然后我们在Hook 360的地址,这样一来,游戏保护就会认为KiFastCallEntry是被360的Hook着,但是实际上,我们已经接管了360的HookPort
最後放馬:
NTSTATUS NewNtOpenProcess(
PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientId
)
{
if (KeGetCurrentIrql() == PASSIVE_LEVEL){
KdPrint(("NtOpenProcess() by %s\r\n",PsGetProcessImageFileName(PsGetCurrentProcess())));
}
//这里直接调用我们的重载函数,这样一来就可以直接绕过游戏保护对NtOpenProcess此函数的Hook
//我们可以做个判断,如果是0D,就要走重载内核的函数
//如果是游戏调用,就要走原始函数地址
return ReloadNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
}
//这个是360的过滤函数
//参数:1ssdt服务号,2当前调用的ssdt函数地址,3KiServiceTable
//返回值:假设如果调用的是NtOpenProcess,那么返回的是360自己的过滤函数,如果调用的是其他360不关心的函数,则直接返回
PVOID NewHookPortFunction(__in ULONG ulong_ssdt_number,
__in PVOID pvoid_ssdt_function_address,
__in PVOID KiServiceTable
)
{
PVOID pvoid_360_call_ret;
//首先调用360这个原始函数
HookPortFunction = (HOOKPORTFUNCTION)HookPortFunctionHookZone;
pvoid_360_call_ret = HookPortFunction(ulong_ssdt_number,pvoid_ssdt_function_address,KiServiceTable);
//for test
if (ulong_ssdt_number == 122)
{
KdPrint(("pvoid_360_call_ret:%08X %08X\r\n",pvoid_360_call_ret,pvoid_ssdt_function_address));
//直接返回我们自己的过滤函数地址,这样就达到了借尸还魂的目的
return NewNtOpenProcess;
}
return pvoid_360_call_ret;
}
页:
[1]