- 注册时间
- 2021-4-16
- 最后登录
- 2024-3-30
- 在线时间
- 2 小时
编程入门
- 龙马币
- 32
|
内核重载+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;
- }
复制代码
|
|