Inline Hook
所属分类:钩子与API截获
开发工具:C/C++
文件大小:13899KB
下载次数:2
上传日期:2020-06-15 22:42:05
上 传 者:
FeJQ
说明: 一个Inline Hook插件,支持32位和64位
(An inline hook plug-in that supports 32-bit and 64 bit)
文件列表:
.vs (0, 2020-02-11)
.vs\Inline Hook (0, 2020-02-11)
.vs\Inline Hook\v16 (0, 2020-03-28)
.vs\Inline Hook\v16\.suo (45568, 2020-03-28)
.vs\Inline Hook\v16\Browse.VC.db (13406208, 2020-03-28)
.vs\Inline Hook\v16\ipch (0, 2020-02-11)
.vs\Inline Hook\v16\ipch\AutoPCH (0, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\1ae4de933d227c0a (0, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\1ae4de933d227c0a\MAIN.ipch (720896, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\3292762c63847d9e (0, 2020-02-19)
.vs\Inline Hook\v16\ipch\AutoPCH\3292762c63847d9e\LED64.ipch (786432, 2020-02-19)
.vs\Inline Hook\v16\ipch\AutoPCH\42063c8a8562b844 (0, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\42063c8a8562b844\LED64X64.ipch (16711680, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\594d2cbbeb504f1a (0, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\594d2cbbeb504f1a\INLINEHOOK.ipch (786432, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\98a91de96e9a368f (0, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\98a91de96e9a368f\KNHOOK.ipch (16711680, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\b34de07e5cdb4569 (0, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\b34de07e5cdb4569\INLINEHOOK.ipch (786432, 2020-02-20)
.vs\Inline Hook\v16\ipch\AutoPCH\ee29808f82cc9cc9 (0, 2020-02-22)
.vs\Inline Hook\v16\ipch\AutoPCH\ee29808f82cc9cc9\MAIN.ipch (720896, 2020-02-22)
Debug (0, 2020-04-02)
Debug\Inline Hook(0环) (0, 2020-04-02)
Debug\Inline Hook(0环)\InlineHook(0环).sys (9808, 2020-02-22)
Debug\Inline Hook(0环)\InlineHook.inf (2321, 2020-02-22)
Debug\Inline Hook(0环)\WdfCoinstaller01009.dll (1461992, 2018-08-09)
Debug\InlineHook(0环).cer (784, 2020-02-22)
Debug\InlineHook(0环).pdb (544768, 2020-02-22)
Debug\InlineHook(0环).sys (9808, 2020-02-22)
Debug\InlineHook.inf (2321, 2020-02-22)
Inline Hook.sln (2797, 2020-02-11)
Inline Hook (0, 2020-04-02)
Inline Hook\Debug (0, 2020-04-02)
Inline Hook\Debug\inf2catOutput.log (448, 2020-02-11)
Inline Hook\Debug\Inline Hook(0环).tlog (0, 2020-04-02)
Inline Hook\Debug\Inline Hook(0环).tlog\CL.command.1.tlog (1476, 2020-02-22)
Inline Hook\Debug\Inline Hook(0环).tlog\CL.read.1.tlog (6158, 2020-02-22)
Inline Hook\Debug\Inline Hook(0环).tlog\CL.write.1.tlog (350, 2020-02-22)
Inline Hook\Debug\Inline Hook(0环).tlog\Inline Hook(0环).lastbuildstate (230, 2020-02-22)
Inline Hook\Debug\Inline Hook(0环).tlog\link.command.1.tlog (2368, 2020-02-22)
... ...
# Inlinehook库的介绍
1. 支持用户和内核两种模式
2. 内核在hook时候挂起了其他cpu,降低挂钩高频函数蓝屏问题
3. 提供函数hook和寄存器hook两种方式
# 函数hook使用范例以hook NtOpenThread为例子:
``` stata
//第一步定义NtOpenThread函数指针类型
typedef NTSTATUS (*fpTypeNtOpenThread)(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL
);
//第二步定义一个inlinehook结构体
InlineHookFunctionSt g_inlineNtOpenThread = { 0 };
//第三步定义一个山寨函数
NTSTATUS FakeNtOpenThread(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
//直接调用旧的函数,在这里你可以进行过滤
fpTypeNtOpenThread pOldFunc = (fpTypeNtOpenThread)g_inlineNtOpenThread.pNewHookAddr;
return pOldFunc(ThreadHandle, DesiredAccess, ObjectAttributes, ClientId);
}
//第四步开始执行hook
PVOID pfnNtOpenThread = GetSSDTFuncAddrByName("NtOpenThread");
InitInlineHookFunction(&g_inlineNtOpenThread, pfnNtOpenThread, FakeNtOpenThread);
bInstallRet = InstallInlineHookFunction(&g_inlineNtOpenThread);
KdPrint(("NtOpenThread 安装结果:%d\n", bInstallRet));
//第五步当驱动退出的时候,卸载hook
UninstallInlineHookFunction(&g_inlineNtOpenThread);
```
# 寄存器过滤使用范例,以hook NtOpenThread为例子:
``` x86asm
//第一步先用ida查看NtOpenThread确定好我们要hook的位置,假设我们hook的位置是:0065FDA2,相对于函数开始地址偏移为:0x1B
PAGE:0065FD87 ; Exported entry 1113. NtOpenThread
PAGE:0065FD87
PAGE:0065FD87
PAGE:0065FD87 ; Attributes: bp-based frame
PAGE:0065FD87
PAGE:0065FD87 ; __stdcall NtOpenThread(x, x, x, x)
PAGE:0065FD87 public _NtOpenThread@16
PAGE:0065FD87 _NtOpenThread@16 proc near
PAGE:0065FD87
PAGE:0065FD87 PreviousMode= byte ptr -4
PAGE:0065FD87 arg_0= dword ptr 8
PAGE:0065FD87 arg_4= dword ptr 0Ch
PAGE:0065FD87 arg_8= dword ptr 10h
PAGE:0065FD87 arg_C= dword ptr 14h
PAGE:0065FD87
PAGE:0065FD87 mov edi, edi
PAGE:0065FD89 push ebp
PAGE:0065FD8A mov ebp, esp
PAGE:0065FD8C push ecx
PAGE:0065FD8D mov eax, large fs:124h
PAGE:0065FD93 mov al, [eax+13Ah]
PAGE:0065FD99 mov ecx, [ebp+arg_C]
PAGE:0065FD9C mov edx, [ebp+arg_8]
PAGE:0065FD9F mov [ebp+PreviousMode], al
PAGE:0065FDA2 push dword ptr [ebp+PreviousMode] ; PreviousMode
PAGE:0065FDA5 push dword ptr [ebp+PreviousMode] ; char
PAGE:0065FDA8 push [ebp+arg_4] ; int
PAGE:0065FDAB push [ebp+arg_0] ; int
PAGE:0065FDAE call _PsOpenThread@24 ; PsOpenThread(x,x,x,x,x,x)
PAGE:0065FDB3 leave
PAGE:0065FDB4 retn 10h
PAGE:0065FDB4 _NtOpenThread@16 endp
PAGE:0065FDB4
//第二步定义一个寄存器过滤结构体
InlineRegFilterHookSt g_inlineRegfilterSt = {0};
//第三步定义一个寄存器过滤函数
void _stdcall NtOpenThreadRegFilterReg(HookContex* hookContex)
{
//在这里做下简单的判断
if(hookContex->uEax == hookContex->uEbx)
{
//如果满足条件当程序运行到NtOpenThread+0x1B的地方会修改eax的值为1
hookContex->uEax=1;
}
}
//第四步执行过滤hook
PVOID pfnNtOpenThread = GetSSDTFuncAddrByName("NtOpenThread");
InitRegFilterInlineHook(&g_inlineRegfilterSt, (LVOID)((SIZE_T)pfnNtOpenThread+0X1b), NtOpenThreadRegFilterReg);
bInstallRet = InstallRegFilterInlineHook(&g_inlineRegfilterSt);
KdPrint(("NtOpenThread 寄存器过滤安装结果:%d\n", bInstallRet));
//第四步当程序退出时候卸载hook
UninstallRegFilterInlineHook(&g_inlineRegfilterSt);
```
近期下载者:
相关文件:
收藏者: