[原创]开源一个自己写的简易的windows内核hook框架
2022-12-6 17:47 5333
zydis.h
zydis.c
asmcode.h
asmcode.c
hook.h
hook.c
包含到你的项目中,然后在需要使用到本框架的地方 #include "hook.h"
即可使用本框架。如图,假设未被hook的代码如黄色图块显示。代码顺序为ABCDE,假设ABC三条指令加起来长度大于14字节,可以放下 ff 25 00 00 00 00 00 00 00 00 00 00 00 00
这个跳转。本框架会自动识别这三条代码的长度,然后将其替换为一个 ff25
jmp。其跳到自己申请的一块空间。跳转完成之后首先进行环境的保存,将所有寄存器保存到栈中。然后call一个C语言写的callback函数。可以在这个函数中进行相应的操作。如果这个函数的返回值是 FALSE
,则跳转回原函数处进行执行。如果为 TRUE
,则直接return,不再执行原函数。如果需要执行原函数,则重新POP所有之前保存的寄存器,然后执行 A B C
三条语句,最后通过一个 ff25
jmp跳到原函数中的下一行处执行(在此示例中是D处)。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
第一个参数是需要设置fast_prehandler的hook的编号。第二个参数是自行编写的prehandler的buffer地址,第三个参数是buffer的大小,第四个参数是buffer中 ff25
jmp的地址的偏移。自行编写的代码的格式如下
1 2 3 4 5 6 7 8 9 10 |
|
如果前面cmp判断不需要处理,那么就跳到 @重新运行原来的code,运行原始逻辑,然后跳回到原来位置
。否则通过 ff25
jmp重新跳到原来的hook函数的地址,重新执行原来的hook_handler。
思路如下。将这个短跳的跳转地址改为 jmp 到原函数里面的jx目标地址
代码的地址。最后在执行完 A B C
之后通过一个 EB
短跳跳到原来的 JMP D
处。
1 |
|
其中返回值为FALSE表示执行完本函数后继续执行原来的函数。如果为true则不再执行原始的函数,直接返回。 pcontext
是一个指向之前保存的寄存器的指针。其结构如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
在handler函数中可以通过读取这些寄存器来获取调用的信息,也可以通过修改这些寄存器达到修改调用方调用原函数时的调用参数的目的。
NtOpenProcess
进行hook的示例代码如下1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
运行结果如下
设置fast_prehandler的代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
运行结果如下
这里在fast_prehandler中判断了 rcx
是否等于1,如果不等于1就直接走原流程,因此没有打印出任何信息。我们把他改为 cmp rdx, 0x1000
再试一下
1 2 3 4 5 6 7 8 9 10 11 |
|
可以看到只有 rdx
为1000的时候才会进入到C语言编写的handler中。否则快速跳回到原流程中执行。
7X XX 或 E1 xx 或 E2 xx 或 E3 xx 或 EB xx
的一字节相对短跳0f 8x xx xx xx xx
的四字节相对跳转e8(e9) xx xx xx xx
的相对跳转指令test,lea,mov
等。https://github.com/oblique/insn_len
和 https://github.com/zyantific/zydis
两个项目作为依赖。看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~
最后于 2022-12-14 17:43 被smallzhong_编辑 ,原因: