- 注册时间
 - 2021-4-16
 
- 最后登录
 - 2024-9-9
 
- 在线时间
 - 2 小时
 
 
 
 
 
编程入门 
  
	- 龙马币
 - 234 
 
 
 
 
 | 
 
 
内核重载+Hook KiFastCallEntry已经烂大街,白菜价格的技术了,所以我们要创新,我们要有新玩法:内核重载新玩法---借尸还魂。什么叫借尸还魂?基本的解释就是:迷信传说人死后灵魂还会借别人的尸体复活。但是用在计算机里面,顾名思义就是借助别人的东西来实现自己的目的。也就是借尸还魂的基本理论:借助360的HookPort,我们再Hook 360这个函数,即可绕过一些游戏保护对此函数的检测。那我们现在先来看360对KiFastCallEntry的Hook: 
 
- 80542600 8b3f            mov     edi,dword ptr [edi]
 
 - 80542602 8b1c87          mov     ebx,dword ptr [edi+eax*4]
 
 - 80542605 e9d6945109      jmp     89a5bae0
 
 -  
 
 - lkd> u 89a5bae0
 
 - 89a5bae0 e91f5e8527      jmp     b12b1904
 
 - 89a5bae5 0000            add     byte ptr [eax],al
 
 - 89a5bae7 0002            add     byte ptr [edx],al
 
 - 89a5bae9 0003            add     byte ptr [ebx],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 [esp+10h],eax
 
 - b12b1914 61              popad
 
 - b12b1915 9d              popfd
 
 - b12b1916 2be1            sub     esp,ecx
 
 - b12b1918 c1e902          shr     ecx,2
 
 - b12b191b ff351c432bb1    push    dword ptr ds:[0B12B431Ch]
 
 - 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;
 
 - }
 
  复制代码 
 |   
 
 
 
 |