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

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

2013-6-24 14:06
19050
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是希望大神给挑挑错

[课程]Android-CTF解题方法汇总!

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

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

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

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

条件就是

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

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