|
在irp中hook shadowssdt 函数地址可以取到
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;
- }
复制代码
|
|