首页
社区
课程
招聘
分享一个任意点hook的inlinehook库(同时支持用户和内核)
2018-4-10 22:44 19675

分享一个任意点hook的inlinehook库(同时支持用户和内核)

2018-4-10 22:44
19675

由于本人水平有限,错误之处难免,请大家不吝指正哈!

2018/4/16:更新了在hook时候挂起其他的cpu防止挂钩高频函数蓝屏问题
2018年/4/16:把代码放到github上,在readme上有详细的的使用方式说明:https://github.com/chinatiny/InlineHookLib.git

0x1 HOOK库有很多,这个有什么不同

  1. 可以执行任意点InlineHook
  2. 使用方便,让InlineHook成为享受,特别是从函数中间开始hook
  3. 在hook的过程中可以很方便的做到对每个寄存器进行过滤
  4. 同时支持内核和用户
  5. 标题中说的任意点hook其实有点夸大,其实需要满足一个要求,就是hook点开始往下数6个字节,必须还在一个函数就好了

0x2 为什么要发这篇帖子

  1. 取之看雪还之看雪,之前一直在看雪上索取,感觉应该贡献一点
  2. 方便大家做hook,所以接口参数我尽可能做的精简,让大家做hook感觉很简单

0x3 使用的流程

图片描述

0x4用户层HOOK例子

#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;
}

0x5 用户层的效果演示:

图片描述

0x6 内核层HOOK例子

        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);

0x7 内核层hook效果演示

图片描述

0x8 hook库只提供了对寄存器的过滤,如何对函数参数进行过滤?

  1. 寄存器中有esp和ebp,并且hook的地点由你自己来定,可以直接通过esp或者ebp找到参数修改或者拦截掉

0x9 代码直接在git上下载即可


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-4-16 19:03 被又出bug了编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (53)
雪    币: 871
活跃值: (627)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
八岛 1 2018-4-10 22:56
2
0
感谢分享
雪    币: 195
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shenmumu 2018-4-10 22:57
3
0
这个太棒了
雪    币: 22980
活跃值: (3347)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
KevinsBobo 8 2018-4-10 23:55
5
0
感谢分享
雪    币: 19875
活跃值: (3150)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
atompure 2018-4-11 06:11
6
0
谢谢分享!
雪    币: 119
活跃值: (298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
渗透 2018-4-11 07:31
7
0
雪    币: 504
活跃值: (3061)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wem 2018-4-11 07:33
8
0
谢谢分享
雪    币: 7073
活跃值: (1134)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
softCracker 2018-4-11 09:36
9
0
感谢分享
雪    币: 11379
活跃值: (4118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 2018-4-11 10:19
10
0
多谢楼主分享哟
雪    币: 6026
活跃值: (3940)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
pxhb 2 2018-4-11 13:29
11
0
感谢分享
雪    币: 8013
活跃值: (4187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs 2018-4-11 14:32
12
0
感谢楼主分享,学习
雪    币: 545
活跃值: (237)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
ggsuper 2018-4-11 16:29
13
0
感谢分享
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kakasasa 2018-4-11 16:55
14
0
感谢分享
雪    币: 75
活跃值: (558)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pccq 2018-4-11 17:09
15
0
感谢分享
雪    币: 1185
活跃值: (458)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
Ericky 6 2018-4-11 17:32
16
0
感谢分享
雪    币: 9168
活跃值: (2046)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PPTV 2018-4-11 23:03
17
0
好吧,和我写的差不多...
最后于 2018-4-11 23:18 被PPTV编辑 ,原因:
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
聖blue 2018-4-11 23:44
18
0
雪    币: 288
活跃值: (244)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
sjh_pediy 2018-4-12 07:52
19
0
感谢共享
雪    币: 768
活跃值: (425)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
FishSeeWater 11 2018-4-12 10:48
20
0
好工具~
雪    币: 267
活跃值: (729)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
WinDos2K 2018-4-12 11:43
21
0
我想修改寄存器参数或过滤,有没有好方法。
雪    币: 368
活跃值: (431)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
又出bug了 2 2018-4-12 14:36
22
0
WinDos2K 我想修改寄存器参数或过滤,有没有好方法。
抱歉哈,现在才看到,因为一直忙着简历求职的事情,过段时间我发个例子,到时候再通知下
---------------------------------
其实你这个问题,如果想修改寄存器,回调函数中有一个hookcontex,里面有各种寄存器直接直接修改就好了,修改完后再调用原来的函数时候寄存器就是你修改的值,我说了一大堆肯定是一个实例代码最好,你可以先自己研究下,过个两天我把手中的作品开源下,里面有详细的使用例子,抱歉哈!
雪    币: 244
活跃值: (163)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
airbus 2018-4-12 16:30
23
0
下载一份学习下
雪    币: 8013
活跃值: (4187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs 2018-4-12 20:26
24
0
期待楼主的例子,关注中
雪    币: 3649
活跃值: (3615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yaoguen 2018-4-12 21:28
25
0
要是能支持x64程序就完美了
游客
登录 | 注册 方可回帖
返回