首页
论坛
课程
招聘
[原创]一份简单的内核通用HOOK 带使用例子(带简单SSDT恢复)~
2013-6-24 14:06 17062

[原创]一份简单的内核通用HOOK 带使用例子(带简单SSDT恢复)~

2013-6-24 14:06
17062
sources文件说明(新手向):

TARGETNAME = ******//此处填写要生成的驱动的名字.不包含".sys"字样
DRIVERTYPE = FS
TARGETTYPE = DRIVER
SOURCES    = xde.c hook.c ***.c//填写你的C文件

文件解析:

第一部分:
xde.c
xde.h
xdetbl.c
这三个是xde汇编引擎的

第二部分:
hook.h
hook.c
通用HOOK的定义及实现

定义了结构体:HookYou

结构如下:
typedef struct _HookYou
{
  char  JmpCode[20];//跳转用,直接call
  char  OldCode[20];//恢复hook用.保存原本的代码
  ULONG  HookLen;    //恢复hook用.保存代码长度
  ULONG  IsDobeHook; //是否多重HOOK
  PULONG  RealHookStartAddress;//真正的HOOK首地址

}HookYou,*PHookYou;

定义并实现了函数:

/*判断系统版本*/
NTSTATUS WindIsVer(OSVERSIONINFOW os);

/********************************************/
/*HookFunAddress为被HOOK函数地址                    */
/*FakFunAddress被HOOK函数的跳转地址                    */
/*传入一个HookYou类型结构体的指针.该结构体将保存HOOK的数据          */
/*************************************************/
NTSTATUS HookThis(IN ULONG HookFunAddress,IN ULONG FakFunAddress,OUT PHookYou HookFun);

/*************************************************************/
/* 建议在使用HookYou之前调用此例程将其初始化                 */
/* 值得注意的是.该函数并不是创建结构体的函数.而仅仅是初始化  */
/*************************************************************/
NTSTATUS InitHookYou(PHookYou HookFun);

/********************************************************/
/* 卸载Hook,传入HookYou结构体的指针,HookFunAddress可为NULL              */
/* 但如果HookFun.RealHookStartAddress为NULL,则必须指定HookFunAddress    */
/************************************************************/
NTSTATUS UNHookForHookYou(IN PHookYou HookFun,IN ULONG HookFunAddress);

/**************************************/
/* 传入TRUE则解锁CR0 否则加锁                          */
/***********************************/
NTSTATUS CR0Lock(ULONG ui);

用法很简单.具体实现请看代码~

inline.h
inline.c
是个例子,这里HOOK了NTOpenProcess函数.处理函数则只是简单的输出了打开方和被打开方

压缩包中提供的sources文件并不能直接用.请自己编辑下
编辑为如下内容即可直接使用了
TARGETNAME = test_driver
DRIVERTYPE = FS
TARGETTYPE = DRIVER
SOURCES    = xde.c hook.c inline.c

其中有一小段是恢复SSDT的NtOpenProcess
灰常简单...会被笑.不过还是发了.毕竟对PE不熟悉..另求个师父

知道写的不好.另外其中对多重HOOK的判定似乎不生效.发出来1是共享,2是希望大神给挑挑错

2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (25)
雪    币: 215
活跃值: 活跃值 (248)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lhglhg 活跃值 1 2013-6-24 14:24
2
0
支持呀.附件在哪里?
雪    币: 42
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pecado 活跃值 2013-6-25 10:44
3
0
下来看看
雪    币: 255
活跃值: 活跃值 (18)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
AioliaSky 活跃值 1 2013-6-25 11:17
4
0
路过,支持一下...
雪    币: 85
活跃值: 活跃值 (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wodexinren 活跃值 2013-6-25 14:12
5
0
顶起,支持一下
雪    币: 5
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 活跃值 2013-6-25 18:10
6
0
万一hook位置有相对跳转……秒蓝……
雪    币: 190
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
JustMe 活跃值 2013-6-25 23:17
7
0
顶一个。
雪    币: 819
活跃值: 活跃值 (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zyicai 活跃值 2013-6-26 09:09
8
0
顶一个...
雪    币: 209
活跃值: 活跃值 (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
遗失灵魂 活跃值 2013-6-26 10:29
9
0
就是多重hook问题嘛.最后我说了的..不知道原因就是不成功..所以求解答呢还在~
雪    币: 5
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 活跃值 2013-6-26 17:55
10
0
没必要判断……
两个方法
1,在无论hook什么函数前……先恢复一遍
2反正发现call jmp push ret
之类的东西,转化成绝对地址
然后hook这个绝对地址……(相当与hook掉他的处理函数)
……
第一种稳定些
雪    币: 209
活跃值: 活跃值 (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
遗失灵魂 活跃值 2013-6-26 19:16
11
0
产品发布的话 这两种都不可取..

现在问题是..我代码中有判断E8 E9 但是不生效.很奇怪
雪    币: 5
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 活跃值 2013-6-26 20:03
12
0
第一种谁说不可取
卡巴的hook就是这样做的……直接覆盖掉以前钩子……
所以很多窗体保护不能与卡巴共存
360的hook也是的……如果你和他共用一个位置
他会先恢复掉你的钩子
第二种处理得好同样没有问题,看你怎么做,其实比第一种还要好一些,可以和其他钩子和谐共存
雪    币: 47
活跃值: 活跃值 (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lhwqqq 活跃值 2013-6-26 20:23
13
0
我喜欢第一种~~~  嘿嘿
雪    币: 8
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
赵建新 活跃值 2013-6-26 23:32
14
0
终于有能看懂的帖子了。很棒!
雪    币: 35
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
网络盗宝 活跃值 2013-6-27 14:28
15
0
哈哈!会蓝屏么?
雪    币: 209
活跃值: 活跃值 (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
遗失灵魂 活跃值 2013-6-28 09:51
16
0
有判断E8 E9 但是不生效...求问啥原因呢..能否帮忙改下
雪    币: 5
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 活跃值 2013-6-28 17:45
17
0
我手头现在没有调试环境……没有办法帮你调试
没有看源码,但是我可以给你大概分析以下

可以改变函数流程的指令太多了
有短跳 可以 push ret 甚至可以jnz jz
单独判断e9 e8是不够的

而且你的处理也是有问题的……简单的向后退推5字节hook很有可能造成指令屑……
这些都是会产生蓝屏的原因
当然也有可能是一些低级错误……这个我就不讲了……自查吧
雪    币: 209
活跃值: 活跃值 (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
遗失灵魂 活跃值 2013-6-28 17:53
18
0
额 是这样
我一开始的想法是扫描前8字节 存在e8 e9即在该处使用汇编引擎汇编一下.得到指令长度后.向后推
但是现在判断E8 E9都不成功
PS:目前只考虑e8 e9的情况因为只是在学习的过程
雪    币: 5
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 活跃值 2013-6-28 19:11
19
0
不成功是误判,还是发现不了(没有效果),还是蓝屏?
雪    币: 209
活跃值: 活跃值 (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
遗失灵魂 活跃值 2013-6-28 19:39
20
0
条件不成立.所以没走到对应的代码里面

条件就是

        if (((char*)HookFunAddress)[0] == 0xe8 || ((char*)HookFunAddress)[0] == 0xe9)
        {
                HookFun->IsDobeHook = TRUE;
        }else
        {
                KdPrint(("HookFunAddress :0x%x",((char*)HookFunAddress)[0]));
        }

雪    币: 406
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DuoLaMMeng 活跃值 2013-6-29 20:52
21
0
架构挺好的,我顺便试了一下,还行
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xmagic 活跃值 2013-6-30 14:19
22
0
坚决支持下,谢谢楼主分享!
雪    币: 100
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lxmls 活跃值 2013-7-1 05:14
23
0
mark!!!!!!!!
雪    币: 209
活跃值: 活跃值 (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
遗失灵魂 活跃值 2013-7-8 16:46
24
0
- -某人居然又问.我自顶一下
雪    币: 62
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
稻天 活跃值 2013-7-8 18:17
25
0
有个很重要的东西,你忘记了,你的HookFun()没有实现,因此,也没有实现关于HookFun()执行完调用HookFun()的内容
游客
登录 | 注册 方可回帖
返回