应用程序总是离不开系统内核所提供的服务,比如它要使用内存的时候,只要跟操作系统申请就行了,而不用自己操心哪里有空闲的内存空间等问题,实际上,这些问题是由操作系统的内核来代劳的。站在黑客的角度讲,如果能够控制内核,实际上就是控制了内核之上的各种应用程序

 

一.系统调用表

 
系统调用表又称系统服务表或者服务描述符表,是windows内核在进行各种系统操作所需的一个函数指针表 ,也就是说,这个表中存放的是提供系统服务的各种函数的地址。 
 

二.内存保护

 
现代的Windows操作系统通常将系统调用表所在内存页设为只读来提供保护。如果不能克服这个问题,实施内核钩子技术就是痴人说梦。 
 
内存描述符表(MDL)的作用是将虚拟内存映射成物理页。如果将系统调用表所在内存页的MDL的MDLFlags成员设为MDL_MAPPED_TO_SYSTEM_VA 并且该页面被锁定的话,那么就可以使用内核钩子技术了。以下代码将可以达此目的:  
 
#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDesc riptorTable;
PVOID* NewSystemCallTable;
PMDL pMyMDL = MmCreateMdl( NULL,
KeServiceDescriptorTable.ServiceTableBase,
KeServiceDescriptorTable.NumberOfServices * );
MmBuildMdlForNonPagedPool( pMyMDL );
pMyMDL->MdlFlags = pMyMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
NewSystemCallTable = MmMapLockedPages( pMyMDL, KernelMode );
 
系统调用表数据结构KeServiceDescriptorTable不仅含有ntdll.dll 的全部函数指针,还存有系统调用表的基地址和表的大小,当建立我们自己的内存描述符表的时候,这些信息是不可或缺的。利用MDL_MAPPED_TO_SYSTEM_VA 标志,我们可以建立一个不可页出(即不会被换到内存之外)的MDL ,这样我们就可以将其锁定,并把返回的地址用于我们自己的系统调用表,重要的是,这个系统调用表是可写的。  
 

三.定义钩子函数

 
内核钩子有三部分:
 
  • 要钩取的函数(目标函数)
  • 替代要钩取的函数的函数(钩子函数)
  • 系统调用表
 
当定义自己的钩子函数时,可以先到DDK 的头文件中找到所想要的函数的原型,然后,稍加修改就能把目标函数变成钩子函数了。  
 

四.内核函数系列

 
1.KiEtw系列:本系列内核函数用于系统内核,这些函数只能从内核的内部进行调用,常用的有:`KiUserCallbackDispatcher、KiRaiseUserExceptionDispatcher、KiUserApcDispatcher、KiUserExceptionDispatcher`等。
 
2.Csr系列:此系列函数用于客户机和服务器运行时,如果您想拦截客户机/服务器方面的操作,那么就需要对Csr系列内核函数做进一步的了解。常见的有:`CsrClientCallServer、CsrCaptureMessageBuffer、CsrConnectClientToServer和CrsNewThread`等。 
 
3.Ldr系列:本系列内核函数用于加载程序管理器,如果你打算拦截加载程序的话,那么请进一步考察这组以Ldr为前缀的函数,常用的有:`LdrInitializeThunk、LdrLockLoaderLock、LdrUnlockLoaderLock、LdrGetDllHandle、LdrGetProcedureAddress`等。   
 
4.Dbg系列:本系列内核函数用于调试管理,如果打算拦截调试操作的话,那么请进一步考察这组以Dbg为前缀的函数,常用的函数包括:、`DbgBreakPoint、DbgUserBreakPoint、DbgPrint和DbgUiConnectToDbg`等。
 
5.Etw系列:本系列内核函数用于追踪窗口事件,如果你打算拦截追踪之类的操作的话,那么请进一步考察这组以Etw为前缀的函数。常用的函数包括:`EtwTraceEvent、EtwEnableTrace、EtwGetTraceEnableLevel和EtwGetTraceEnableFlags`等。  
 
6.Rtl系列:本系列内核函数用于运行时库,以Rtl为前缀的函数可以完成多种操作,例如字符串、线程、资源、临界区、安全对象的初始化和使用,内存、进程异常和数据类型的处理,还用于完成定时器、堆、IPv4和IPv6方面的操作,以及压缩和解压缩等。   
 
7.Pfx系列:本系列内核函数用于ANSI字符串操作,如果你打算拦截ASNI串表方面的操作的话,就需要进一步了解这些函数。常用的包括:`PfxInitialize、PfxRemovePrefix、PfxInsertPrefix、PfxFindPrefix`等。
 
8.Zw系列:本系列内核函数用于文件和注册表方面的操作,比如文件操作、注册表操作、访问进程、事件操作、令牌操作、进程操作和端口操作等。 这里介绍的只是内核函数中的一部分,限于篇幅其他部分在此不作介绍。  

最新文章

  1. objccn-相机工作原理
  2. jmap命令(Java Memory Map)(转)
  3. IOS插件管理器: alcatraz
  4. PHP也20岁了
  5. 反射自动填充model
  6. 让sublime支持gbk常用编码
  7. 为MVC 添加下载权限
  8. gcc编译器对宽字符的识别
  9. 开源纯C#工控网关+组态软件(十)移植到.NET Core
  10. PCB铺铜
  11. echarts移动端中例子总结。
  12. 在VS Code中对Python进行单元测试
  13. windows中安装liunx虚拟机
  14. WEB服务器、应用程序服务器、HTTP服务器的区别
  15. JS post提交表单
  16. 初始 DQN 程序 所遇到的问题
  17. preprocessor设置调试宏
  18. 利用tensorflow训练简单的生成对抗网络GAN
  19. free函数使用时的注意事项。
  20. What Kind of Friends Are You? ZOJ - 3960(ZheJiang Province Contest)

热门文章

  1. 零基础学习Mahout之-----搭建单机环境
  2. PAT 天梯赛 L1-043 阅览室
  3. BZOJ【1625】宝石手镯
  4. .net开发工具集合
  5. MongoDB如何使用“”用户名和密码“”
  6. 浏览器的 16ms 渲染帧
  7. 開關(switch)規格中,SPDT, DPDT, 3PDT, 4PDT是什麼意思?
  8. 转:C#制作ORM映射学习笔记三 ORM映射实现
  9. JMeter进行http接口测试
  10. python 设计模式之MVC模式