-
-
分享一个任意点hook的inlinehook库(同时支持用户和内核)
-
发表于:
2018-4-10 22:44
20684
-
分享一个任意点hook的inlinehook库(同时支持用户和内核)
由于本人水平有限,错误之处难免,请大家不吝指正哈!
#include <windows.h>
#include <stdio.h>
#include "InlineHook.h"
#include <tchar.h>
void Func1()
{
MessageBox(0, _T("原始函数"), _T("提示"), MB_OK);
}
void _stdcall HookedProc(HookContex* hookContex)
{
TCHAR szHookBuff[MAX_PATH] = { 0 };
_stprintf_s(szHookBuff, _countof(szHookBuff),
_T("当执行的hook点的时候各个寄存器的值:\n\
Eax = 0x%08X\n\
Ecx = 0x%08X\n\
Edx = 0x%08X\n\
Ebx = 0x%08X\n\
Esi = 0x%08X\n\
Edi = 0x%08X\n\
Ebp = 0x%08X\n\
Esp = 0x%08X\n\
EFlags = 0x%08X\n,你可以直接在这个函数中修改寄存器并在执行原来的地址的时候,寄存器将会是你修改的值\n"),
hookContex->uEax,
hookContex->uEcx,
hookContex->uEdx,
hookContex->uEbx,
hookContex->uEsi,
hookContex->uEdi,
hookContex->uEbp,
hookContex->uEsp,
hookContex->uEflags
);
MessageBox(0, szHookBuff, _T("提示"), MB_OK);
}
int main()
{
InlineHookSt inlineSt;
InitInlineHook(&inlineSt, Func1, HookedProc);
InstallInlineHook(&inlineSt);
//测试安装hook的效果
Func1();
//卸载钩子的执行效果
UninstallInlineHook(&inlineSt);
Func1();
return 0;
}
void _stdcall HookedKeStackAttachProcess(HookContex* hookContex)
{
KdPrint(("eax:%08X\n", hookContex->uEax));
}
//对KeStackAttachProcess挂钩防止进程挂靠
UNICODE_STRING funcName;
RtlInitUnicodeString(&funcName, L"KeStackAttachProcess");
PVOID pKeStackAttachProcessAddr = MmGetSystemRoutineAddress(&funcName);
InitInlineHook(&g_InlineKeStackAttachProcess, pKeStackAttachProcessAddr, HookedKeStackAttachProcess);
InstallInlineHook(&g_InlineKeStackAttachProcess);
- 可以执行任意点InlineHook
- 使用方便,让InlineHook成为享受,特别是从函数中间开始hook
- 在hook的过程中可以很方便的做到对每个寄存器进行过滤
- 同时支持内核和用户
- 标题中说的任意点hook其实有点夸大,其实需要满足一个要求,就是hook点开始往下数6个字节,必须还在一个函数就好了
- 取之看雪还之看雪,之前一直在看雪上索取,感觉应该贡献一点
- 方便大家做hook,所以接口参数我尽可能做的精简,让大家做hook感觉很简单
- 寄存器中有esp和ebp,并且hook的地点由你自己来定,可以直接通过esp或者ebp找到参数修改或者拦截掉
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-4-16 19:03
被又出bug了编辑
,原因: