adobase 发表于 2021-4-6 12:00:59

win7 shadowssdt hook NtUserCallTwoParam 蓝屏

在irp中hookshadowssdt 函数地址可以取到

irp
case IOCTL_IO_SSSDT_HOOK:
                {
                        PVOID64 sssdt = GetSSSDTAddress();
                        //获取NtUserCallTwoParam
                        PVOID64 faddress = GetSSSDTFuncAddr64(sssdt, 42);
                        //faddress = 0xFFFFF960000F8D74;
                        ori_pslp = InlineHook(faddress, Proxy_NtUserCallTwoParam);
                        break;
                }


inlineHook
PVOID64 InlineHook(PVOID64 FunctionAddress, VOID * MyFunctionAddress)
{
        //记录原始字节包含跳转到原指令
        VOID * org_body = NULL;
        //跳转 jmp [-8] 位置 -8为MyFunctionAddress
        UCHAR jmp_code[] = "\xFF\x25\xF2\xFF\xFF\xFF";
        UCHAR jmp_org_code[] = "\xFF\x25\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
        KIRQL irql = WPOFFx64();
        //函数头部-8位置写入代理函数地址
        memcpy((ULONG64)FunctionAddress - 8,(ULONG64)MyFunctionAddress,8);
        WPONx64(irql);
        //获取完整指令的字节数
        ULONG patchLen = GetPatchSize(FunctionAddress);
        org_body = ExAllocatePoolWithTag(NonPagedPool, patchLen + sizeof(jmp_org_code), 0);
        //保存原始汇编指令 设置代理函数
        irql = WPOFFx64();
        //设置jmpcode 跳转到 原始指令
        memcpy(jmp_org_code + 6, (ULONG64)FunctionAddress + patchLen, 8);
        memcpy((ULONG64)org_body, FunctionAddress, patchLen);
        memcpy((ULONG64)org_body + patchLen, jmp_org_code, 14);
        WPONx64(irql);
        //设置hook jmp[-8]
        irql = WPOFFx64();
        //设置jmpcode 跳转到 原始指令
        memcpy((ULONG64)FunctionAddress, jmp_code, 6);
        WPONx64(irql);
        //保存原始
        return org_body;
}

adobase 发表于 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 ,r8d
   60 fffff880`03a36e45 4889542410      mov   qword ptr ,rdx
   60 fffff880`03a36e4a 48894c2408      mov   qword ptr ,rcx
   60 fffff880`03a36e4f 4883ec38      sub   rsp,38h
   62 fffff880`03a36e53 488d0da6060000lea   rcx,
   62 fffff880`03a36e5a e821040000      call    communicationDrivce!DbgPrint (fffff880`03a37280)
//这边好像是调用ori_pslp原始函数
   63 fffff880`03a36e5f 488b0532540000mov   rax,qword ptr
   63 fffff880`03a36e66 4889442428      mov   qword ptr ,rax
   63 fffff880`03a36e6b 448b442450      mov   r8d,dword ptr

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

adobase 发表于 2021-4-6 15:12:49

已解决。windbg 断点 跟 代理函数看到 jmp的地址 是 原函数地址的汇编指令并不是 地址

Tesla.Angela 发表于 2021-4-7 05:15:17

使用14字节HOOK之前,需要确定前14字节没有CALL、JMP等指令。

我的WIN7虚拟机的NtUserCallTwoParam的函数头是这样子的:lkd> u win32k!NtUserCallTwoParam
win32k!NtUserCallTwoParam:
fffff960`002364d4 48895c2408      mov   qword ptr ,rbx
fffff960`002364d9 4889742410      mov   qword ptr ,rsi
fffff960`002364de 57            push    rdi
fffff960`002364df 4883ec20      sub   rsp,20h
fffff960`002364e3 488bf1          mov   rsi,rcx理论上说使用14字节HOOK是没问题的。

adobase 发表于 2021-4-7 20:19:33

Tesla.Angela 发表于 2021-4-7 05:15
使用14字节HOOK之前,需要确定前14字节没有CALL、JMP等指令。

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

嗯 感觉这个6字节的更精炼 感谢提供的教程 让新手少跑歪路很赞。
页: [1]
查看完整版本: win7 shadowssdt hook NtUserCallTwoParam 蓝屏