haha0518 发表于 2021-5-4 17:15:12

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]
查看完整版本: KiFastCallEntry过游戏驱动保护新玩法