找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4357|回复: 4

win7 shadowssdt hook NtUserCallTwoParam 蓝屏

[复制链接]

3

主题

15

回帖

0

精华

初来乍到

积分
31
发表于 2021-4-6 12:00:59 | 显示全部楼层 |阅读模式
在irp中hook  shadowssdt 函数地址可以取到  

irp
  1. case IOCTL_IO_SSSDT_HOOK:
  2.                 {
  3.                         PVOID64 sssdt = GetSSSDTAddress();
  4.                         //获取NtUserCallTwoParam
  5.                         PVOID64 faddress = GetSSSDTFuncAddr64(sssdt, 42);
  6.                         //faddress = 0xFFFFF960000F8D74;
  7.                         ori_pslp = InlineHook(faddress, Proxy_NtUserCallTwoParam);
  8.                         break;
  9.                 }
复制代码


inlineHook
  1. PVOID64 InlineHook(PVOID64 FunctionAddress, VOID * MyFunctionAddress)
  2. {
  3.         //记录原始字节包含跳转到原指令
  4.         VOID * org_body = NULL;
  5.         //跳转 jmp [-8] 位置 -8为MyFunctionAddress
  6.         UCHAR jmp_code[] = "\xFF\x25\xF2\xFF\xFF\xFF";
  7.         UCHAR jmp_org_code[] = "\xFF\x25\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
  8.         KIRQL irql = WPOFFx64();
  9.         //函数头部-8位置写入代理函数地址
  10.         memcpy((ULONG64)FunctionAddress - 8,(ULONG64)MyFunctionAddress,8);
  11.         WPONx64(irql);
  12.         //获取完整指令的字节数
  13.         ULONG patchLen = GetPatchSize(FunctionAddress);
  14.         org_body = ExAllocatePoolWithTag(NonPagedPool, patchLen + sizeof(jmp_org_code), 0);
  15.         //保存原始汇编指令 设置代理函数
  16.         irql = WPOFFx64();
  17.         //设置jmpcode 跳转到 原始指令
  18.         memcpy(jmp_org_code + 6, (ULONG64)FunctionAddress + patchLen, 8);
  19.         memcpy((ULONG64)org_body, FunctionAddress, patchLen);
  20.         memcpy((ULONG64)org_body + patchLen, jmp_org_code, 14);
  21.         WPONx64(irql);
  22.         //设置hook jmp[-8]
  23.         irql = WPOFFx64();
  24.         //设置jmpcode 跳转到 原始指令
  25.         memcpy((ULONG64)FunctionAddress, jmp_code, 6);
  26.         WPONx64(irql);
  27.         //保存原始
  28.         return org_body;
  29. }
复制代码


3

主题

15

回帖

0

精华

初来乍到

积分
31
 楼主| 发表于 2021-4-6 14:24:12 | 显示全部楼层
已经跳到 代理函数里边了 但是原始函数跳的时候就执行出错  检查地址 \xFF\x25\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF   后面的8位不知道该如何查看
调用了下dbgprint
   60 fffff880`03a36e40 4489442418      mov     dword ptr [rsp+18h],r8d
   60 fffff880`03a36e45 4889542410      mov     qword ptr [rsp+10h],rdx
   60 fffff880`03a36e4a 48894c2408      mov     qword ptr [rsp+8],rcx
   60 fffff880`03a36e4f 4883ec38        sub     rsp,38h
   62 fffff880`03a36e53 488d0da6060000  lea     rcx,[communicationDrivce! ?? ::FNODOBFM::`string' (fffff880`03a37500)]
   62 fffff880`03a36e5a e821040000      call    communicationDrivce!DbgPrint (fffff880`03a37280)
//这边好像是调用ori_pslp  原始函数
   63 fffff880`03a36e5f 488b0532540000  mov     rax,qword ptr [communicationDrivce!ori_pslp (fffff880`03a3c298)]
   63 fffff880`03a36e66 4889442428      mov     qword ptr [rsp+28h],rax
   63 fffff880`03a36e6b 448b442450      mov     r8d,dword ptr [rsp+50h]

看半天也看不明白 地址到底是跳到哪里了。
困惑。。

3

主题

15

回帖

0

精华

初来乍到

积分
31
 楼主| 发表于 2021-4-6 15:12:49 | 显示全部楼层
已解决。  windbg 断点 跟 代理函数  看到 jmp的地址 是 原函数地址的汇编指令  并不是 地址  

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2021-4-7 05:15:17 | 显示全部楼层
使用14字节HOOK之前,需要确定前14字节没有CALL、JMP等指令。

我的WIN7虚拟机的NtUserCallTwoParam的函数头是这样子的:
  1. lkd> u win32k!NtUserCallTwoParam
  2. win32k!NtUserCallTwoParam:
  3. fffff960`002364d4 48895c2408      mov     qword ptr [rsp+8],rbx
  4. fffff960`002364d9 4889742410      mov     qword ptr [rsp+10h],rsi
  5. fffff960`002364de 57              push    rdi
  6. fffff960`002364df 4883ec20        sub     rsp,20h
  7. fffff960`002364e3 488bf1          mov     rsi,rcx
复制代码
理论上说使用14字节HOOK是没问题的。

3

主题

15

回帖

0

精华

初来乍到

积分
31
 楼主| 发表于 2021-4-7 20:19:33 | 显示全部楼层
Tesla.Angela 发表于 2021-4-7 05:15
使用14字节HOOK之前,需要确定前14字节没有CALL、JMP等指令。

我的WIN7虚拟机的NtUserCallTwoParam的函数 ...

嗯 感觉这个6字节的更精炼 感谢提供的教程 让新手少跑歪路  很赞。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表