本人新手一枚,望各位大牛勿喷,也希望得到大家的指点,共同进步。
不是什么新鲜、高级的东西,但对于像我一样的新手应该有点帮助。先说说数字的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解题方法汇总!