首页
社区
课程
招聘
[分享]新手的两份学习源码——数字的hook框架和重载内核
发表于: 2013-9-25 16:11 19997

[分享]新手的两份学习源码——数字的hook框架和重载内核

2013-9-25 16:11
19997
本人新手一枚,望各位大牛勿喷,也希望得到大家的指点,共同进步。

不是什么新鲜、高级的东西,但对于像我一样的新手应该有点帮助。先说说数字的hook框架,实现在hookport.sys里,XT内核钩子一扫便知,inline hook了KiFastCallEntry。这个hook点选得真好,即是进内核的必经之地,又能很方便地拿到SSDT、服务例程序号及地址,稍作修改就能让流程进入自己的地盘。不知道第一个选这个hook点的公司和牛人是谁,反正后来的腾讯百度都选了这个点,框架基本上也没区别。

精力有限,自己逆了hookport里的一部分,也实现了一部分。数字的实现里分了很多种情况,比如安全模式、各Windows版本,这里我只实现了XP上的一部分。

BOOL GetModuleInfo(char* lpModuleName, ULONG* pulImageBaseAddress, ULONG* pulImageSize);

获取模块信息用的是ZwQuerySystemInformation(SystemModuleInformation)

ULONG EATHook(ULONG ulImageBase, ANSI_STRING* lpastrExportName, ULONG ulHookFunc, ULONG* pulOrgFuncRVA);

Hook EAT和寻找导出函数/变量的地址用的是字符串的二分查找,对于KeServiceDescriptorTable这个著名导出变量也是调用这个函数获取的。为什么不直接extern呢,有什么蹊跷?

BOOL GetSSDTFunctions();
BOOL InitSSDTData();
BOOL AllocateSSDTMemory(DWORD dwServiceLimit);

这3个方法分别获取了原SSDT中的一些数据并生成了一张Proxy SSDT的表,hook KiFastCallEntry后将通过这张表决定是否hook系统调用。数字的实现里有先进自己的过滤例程再进系统例程和先进系统例程再进自己的过滤例程两种流程,我这里并没有这样做。

NTSTATUS HookKiFastCallEntry();
NTSTATUS FakeZwSetEvent(HANDLE EventHandle, PLONG PreviousState);

这是hook KiFastCallEntry的关键了,在HookKiFastCallEntry里先hook SSDT中的ZwSetEvent,再用一个自己定义的特殊的handle主动调用一次ZwSetEvent。由于ZwSetEvent也是要走KiFastCallEntry的,因此在这里可以定位到KiFastCallEntry中的hook点了,具体就是硬编码的匹配了。

_declspec(naked) VOID ProxyKiFastCallEntry();
_declspec(naked) VOID ProxyKiFastCallEntryVista();
DWORD FakeKiFastCallEntry(DWORD dwServiceNumber, DWORD dwServiceAddress, DWORD dwSDTBase);

两个Proxy方法是根据Windows版本被KiFastCallEntry中的hook点jmp进入的,但它们最终都会调用FakeKiFastCallEntry,这里就是整个框架的核心位置了。具体实现大家还是看源码吧。

重载内核也在看雪上耳闻目见很久了,一直没自己实践过,这次也尝试了下一并分享,因为有些源码还依赖于上面的hook KiFastCallEntry。依赖的这部分我在工程里建了个filter就叫MyHookPort。

重载内核主要有6步:
1、获取原内核模块的信息(NTSTATUS GetKernelModuleInfo(PSYSTEM_MODULE_INFORMATION pSysModInfo);)
2、获取内核文件的路径(这部分偷懒了,hard code了C:\)
3、分配内存空间,读取内核文件并按PE格式解析、进行内存对齐(NTSTATUS LoadPe(const CHAR* pFilePath, PBYTE* ImageBase, DWORD* ImageSize);)
4、修正重定位表(NTSTATUS FixBaseRelocation(PBYTE NewImageBase, PBYTE OldImageBase);)
5、修正新的SSDT(NTSTATUS FixSSDT(PBYTE NewImageBase, PBYTE OldImageBase, PSERVICE_DESCRIPTOR_TABLE* NewSSDT);)
6、Hook KiFastCallEntry,在其中用新的SSDT来调用系统例程

具体实现大家也还是看源码吧。

MyHookPort.rar

ReloadKernelDriver.rar

混迹论坛也不少日子了,大多时候都是看别人的帖子、mark、收藏,但“纸上谈来终觉浅”还是要自己动手实践才能出真知,希望很多像我一样的新手朋友也多动动手,多发发成果,也算是“取之于看雪,奉献于看雪”吧。另外,发现看雪里版主、大牛都不怎么回复帮助新手,不知道我能不能申请《编程技术》版主,一来帮助新手共同进步,二来也是对自己技术能力提高的敦促,不知道老大能不能看到……

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

上传的附件:
收藏
免费 5
支持
分享
最新回复 (25)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
能求带么。。。 什么东西看不懂。
2013-9-25 16:36
0
雪    币: 58
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
有源码,难度也不是很大,相互学习。
2013-9-26 10:31
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对网友再热情点  多发点好文  我支持你当斑竹
2013-9-26 10:55
0
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看雪新人需要这样的正能量! 好多bz就知道bs新人或者说这个那个技术好老之类的话几年前玩过接着打酱油过了, 好多新人都会支持你当斑竹的 希望bz提拔有像民意党选举投票机制, 当然最后"最终解释权归xxx所有"
2013-9-26 12:18
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
路过。来看看
2013-9-26 12:57
0
雪    币: 58
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
谢谢支持,能力有限,但我会努力的。
2013-9-26 15:05
0
雪    币: 58
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
嗯,所以希望能为新手技术能力的提高尽点绵薄之力。
2013-9-26 15:07
0
雪    币: 183
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
看雪这样的人不多了(至少现在)
2013-9-27 01:53
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持,楼主的观点 很好,谢谢分享知识。
2013-9-27 09:01
0
雪    币: 63
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
mark,支持楼主
2013-9-27 09:13
0
雪    币: 8599
活跃值: (5065)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
mark,支持楼主
2013-9-27 09:46
0
雪    币: 3330
活跃值: (1662)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
13
表示支持一个
2013-9-27 11:39
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持当bz
因为有热情
2013-9-27 12:34
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
楼主学java的吧。
2013-9-27 12:48
0
雪    币: 58
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
怎么说?
2013-9-27 13:17
0
雪    币: 43
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
留名备案
2013-9-27 14:59
0
雪    币: 437
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
楼主辛苦了
2013-9-27 17:11
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark
2013-9-27 21:39
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
支持楼主啊。
用这个能做一个串口监控的么?不占用串口的那种
2013-9-27 22:36
0
雪    币: 58
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
21
没仔细研究过,如果串口相关的例程经过KiFastCallEntry的话是可以的。
2013-9-28 09:13
0
雪    币: 246
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
有点深奥啊。。。木有什么看懂。。
2013-9-28 10:18
0
雪    币: 396
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
看的不是很明白啊,下下来好好研究啦
2013-9-28 17:39
0
雪    币: 124
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
支持一下
2013-9-28 23:17
0
雪    币: 261
活跃值: (537)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
代码还行  关键代码位置蓝屏 如何解决
2013-10-8 15:18
0
游客
登录 | 注册 方可回帖
返回
//