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;
}
已经跳到 代理函数里边了 但是原始函数跳的时候就执行出错检查地址 \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
看半天也看不明白 地址到底是跳到哪里了。
困惑。。 已解决。windbg 断点 跟 代理函数看到 jmp的地址 是 原函数地址的汇编指令并不是 地址 使用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是没问题的。 Tesla.Angela 发表于 2021-4-7 05:15
使用14字节HOOK之前,需要确定前14字节没有CALL、JMP等指令。
我的WIN7虚拟机的NtUserCallTwoParam的函数 ...
嗯 感觉这个6字节的更精炼 感谢提供的教程 让新手少跑歪路很赞。
页:
[1]