系统服务挂钩(HOOK) -1

Windows Hook经验总结之一:API Hook方法汇总 HOOK的目的是用我们自己的代码取代一些函数的代码以改变程序的行为。 静态HOOK:在进程运行前挂钩,采用用户级进程即可完成。比如:有些程序会在启动时需要原光盘,如果我们修改获取驱动类型的函数则可以从硬盘启动。 动态HOOK:挂钩系统进程(如服务)时要动态挂钩 本文介绍常见的hook方法和实现机制。 阅读详情

不仅Win32 API可以挂钩,系统服务也可以挂钩。开发者为了捕获各种事件,可以挂钩文件创建函数CreateFile,注册表访问函数RegCreateKey。使用挂钩可以改变操作系统的行为,只要适当地改变挂钩的数据结构和上下文,足够引起新的行为。例如,通过挂钩NtCreateFile系统服务,可以保护敏感文件不被打开,尽管NTFS为文件提供了用户级的安全,但这些安全措施却不能用在FAT分区上。

 

系统服务就是由操作系统提供的一组函数,类似上层开发的Win32 API。

       不仅Win32 API可以挂钩,系统服务也可以挂钩。开发者为了捕获各种事件,可以挂钩文件创建函数CreateFile,注册表访问函数RegCreateKey。使用挂钩可以改变操作系统的行为,只要适当地改变挂钩的数据结构和上下文,足够引起新的行为。例如,通过挂钩NtCreateFile系统服务,可以保护敏感文件不被打开,尽管NTFS为文件提供了用户级的安全,但这些安全措施却不能用在FAT分区上。

Kernel-Level Hooking

系统级挂钩要用驱动程序实现,此方法的缺点就是,需要确定传递给内核函数的参数,但多数情况下这些服务都是未公开的。所以,这类挂钩更难实现,但可以产生更好的效果。

User-Level Hooking

用户级的挂钩的优点是这些函数通常都是公开的,可以知道所需的参数。这类挂钩只能局限于用户模式而不能扩展到内核模式。

<!--[if !supportEmptyParas]--> <!--[endif]-->

下面主要要讨论Kernel-Level Hooking

       这方面的知识可以阅读《Undocmented Windows 2000 Secrets》,在我的BLOG上可以下载由Kendiv大牛翻译的中文版,这是我看过关于挂钩系统服务最详细的书了。另外还有一本《Undocmented Windows NT》,其中第6章专门讲述这方面知识,后者可以作为补充教材,本书同样在我的BLOG上提供下载。除了这两本书以外,网上还有一些零星的文章介绍这个,比如《剖析Windows服务调用机制》等,很容易在网上搜索得到 。如果你要彻底掌握这些知识,建议把上面提到的书籍文章通通看一看。

      我这里主要把重点提一下,以及自已学习过程中理解的东东,和理解后写出来的源码。不少文章有代码片段,但很多像我一样,刚刚接解内核开发,连DDK都没安装,看过那些代码片段总觉得太空洞。《Undocmented Windows 2000 Secrets》虽然提供代码(w2k_spy),但过于复杂,不利于初学者。  

       关于驱动程序如果编译安装,请参考有关资料。如果想要速学,建议看《Undocmented Windows 2000 Secrets》第三章。接下来,假设你已经懂得如何编译安装驱动,以及挂钩系统服务的基本知识了。

<!--[if !supportEmptyParas]--> <!--[endif]-->

系统服务是如何被调用的?

系统服务的用户接口是以包装函数的形式提供的,这些包装函数都在NTDLL.dll中。这些包装函数使用INT 2E指令来切换到内核模式并执行所需的系统服务:每一种系统服务都用一个service ID的标识,包装函数将所需的系统服务的service ID送入EAX寄存器,将指向堆栈帧的指针送入EDX寄存器,然后发出INT 2E指令。INT 2E的处理程序将参数从用户模式的堆栈拷贝到内核模式的堆栈,这个由ntosknrl.exe提供的INT 2E处理程序内部被称为KiSystemService()。其中有一个系统服务分派表,表中的每一个表项都包含service ID和其对应的函数地址。每个函数的代码都位于内核之中。

挂钩系统服务最简单的方法就是修改系统服务分派表中的函数指针,使之指向由开发者插入的某个函数。要做到这点只能通过内核驱动,因为这个系统服务分派表是受操作系统保护的,这表所在的页属性被设置成只有内核程序才能读写,用户级的应用程序不能读写这些内存单元。


如何访问系统服务分派表?

在2000/XP中默认存在两个系统服务分派表(SDT),它们对应了两类不同的系统服务。这两个分别是:KeServiceDescriptorTable和KeServiceDescriptorTableShadow,NT下只有前面那个。KeServiceDescriptorTable定义了在ntoskrln.exe中实现的系统服务,通常在kernel32.dll和advapi32.dll中提供的函数接口均是使用KeServiceDescriptorTable。同时存在的还有win32k.sys中实现的winuser和GDI函数,它们是属于另一类系统服务调用,与之相对应的分派表是KeServiceDescriptorTableShadow,它提供了内核模式的USER和GDI的服务。由服务KeAddSystEmServiceTable添加的服务会被同时复制到上面两个分派表中。

系统服务分派表的数据结构(SDT)

typedef struct _SERVICE_DESCRIPTOR_TABLE       // SDT

{

    SYSTEM_SERVICE_TABLE         ntoskrnl ;           // ntoskrnl.exe (Nativate API)

         SYSTEM_SERVICE_TABLE         win32k ;             // win32k.sys (gdi/user support)

         SYSTEM_SERVICE_TABLE         table3 ;              // not used

         SYSTEM_SERVICE_TABLE         table4 ;              // not used

} SERVICE_DESCRIPTOR_TABLE ;

<!--[if !supportEmptyParas]--> <!--[endif]-->

typedef NTSTATUS (NTAPI *NTPROC)() ;

typedef NTPROC *PNTPROC ;

typedef struct _SYSTEM_SERVICE_TABLE // SSD

{

         PNTPROC ServiceTable ;            // array of entry points

         PULONG         CounterTable ;              // array of usage counters . be NULL

         ULONG         ServiceLimit ;               // number of table entries

         UCHAR*         ArgumentTable ;  // array of bytes counts

<!--[if !supportEmptyParas]--> <!--[endif]-->

} SYSTEM_SERVICE_TABLE

<!--[if !supportEmptyParas]--> <!--[endif]-->

访问KeServiceDescriptorTable很简单,因为它由ntoskrnl.exe公开导出。

加上 extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable; 这行就可以直接访问这个数据结构。但KeServiceDescriptorTableShadow没有导出(NT下没有此表),而且2000和XP下,它的位置不一样。以后我们要挂钩的都是ntoskrnl.exe导出的函数,所以不用访问KeServiceDescriptorTableShadow。  

       KeServiceDescriptorTabe只有第1个成员 ntoskrnl 有用到,其它3个成员全部为NULL 。KeServiceDescriptorTabeShadow前面2个成员都用到,它们的ntoskrnl成员都是相同的,差别在后者多了一个有效的win32k成员,也就是win32k.sys的系统服务分派表。在2000下 ,KeServiceDescriptorTableShadow=KeServiceDescriptorTable+0xE0;

在XP下,KeServiceDescriptorTableShadow=KeServiceDescriptorTable-0x40。

       

如何得到要挂钩服务的ID?

       Ntosknrl.exe的服务都保存在SYSTEM_SERVICE_TABLE.ServiceTable中,该成员是个线性数组,每个项保存一个服务的地址指针,只要把这个地址换成我们提供的函数地址指针就OK了。我们怎么知道要挂钩那个服务在数组中的ID(索引)呢?

ULONG ServiceIdFromFn (PVOID pfnHandler)

{

         PUCHAR         pbHandler = (PUCHAR) pfnHandler ;      

         ULONG ulService = * ((PULONG)(pbHandler + 1));               

         return ulService;

}

由这个服务函数的地址可以直接转化成ID ,如 ServiceIdFromFn( ZwCreateFile )就是返回 ZwCreateFile 的ID。而且,从这个ID我们就可以判断这个服务是由ntosknrl.exe,还是win32k.sys提供的。看ID二进制的 13,14位,如果全为0表示由ntosknrl.exe提供,如果13位为1,14位为0表示由win32k.sys提供。

<!--[if !supportEmptyParas]--> <!--[endif]-->

例子:

理论看得再多,还不如读一下代码!有的时候我更喜欢直接看代码。

我提供的代码再简洁不过,没有多余的代码,一切都只为了实现 ZwCreateFile 的挂钩。我的ZwCreateFile只是把文件名称打印出来,然后直接调用真正的ZwCreateFile 。如果你不熟悉驱动安装,又想检验一下实践的成果,可以:

<!--[if !supportLists]-->1. <!--[endif]-->把hooksys.sys文件复制到 c:/windows/system32/drivers 下

<!--[if !supportLists]-->2. <!--[endif]-->在命令提示符下,执行w2k_load c:/windows/system32/drivers/hooksys.sys安装

<!--[if !supportLists]-->3. <!--[endif]-->运行dbgview.exe ,我的BLOG上有提供下载。

<!--[if !supportLists]-->4. <!--[endif]-->在命令提示符下,执行net start hooksys 启动驱动

<!--[if !supportLists]-->5. <!--[endif]-->通过dbgview.exe 观察文件的创建情况

<!--[if !supportLists]-->6. <!--[endif]-->在命令提示符下,执行net stop hooksys 停止驱动

<!--[if !supportLists]-->7. <!--[endif]-->删除 hooksys.sys

<!--[if !supportEmptyParas]--> <!--[endif]-->

本代码在 XP sp2 下执行通过。例子下载

 
【C++ Hook钩子技术(下)——抓取企鹅消息】Detour Hook框架实战,抓取Tencent企鹅消息,挂钩函数,解析数据一步到位! 光学不练假把式,当我们接触一个新知识的时候并非会认为这个知识很有用。只有当我们实际使用后才知道Hook是有多好“玩”,本期将带领各位进行Detour Hook框架的实战,抓取QQ消息并对抓取数据进行解析,注意这里是抓取本地消息并非获取他人的消息。博客仅供学习,不能用于其他商业和非法用途。另外,本期代码涉及到隐私内容,并不会完全公布代码,仅分享部分重要代码,再次申明本内容仅供学习! 阅读详情

相关推荐

Hook API(挂钩API)技术

Hook API,简单说,就是给API函数挂钩,将本应该调用的API函数拦截,使其转而调用我们自己的函数。这里,我主要介绍如何利用IAT挂钩来实现API拦截。 在我们启动目标程序时,操作系统负责为目标程序创建虚拟地址空间,并将这个可执行模块(就是目标程序)加载到地址空间中去,接下来,系统会将目标程序所需要的DLL文件映射到地址空间。我们将需要映射到地址空间的目标程序及所需DLL统称为模块(Mod

Ginvar的专栏 2783

Hook技术(五)如何Hook系统中任意服务

获取服务&amp;注册 ServiceManager.getService() public static IBinder getService(String name) { try { IBinder service = sCache.get(name); //先从缓存中查看 if (service != null) { ...

我叫王菜鸟 6576

HOOK钩子技术1 inline HOOK内联钩子

内联钩子改变函数的第一条指令,通过跳板跳到伪造的函数上。 函数在使用过程中有时候要执行本身已经挂钩的函数,这样就需要先解钩。

Catch me if you can 4685

必备绝技——hook大法(中)

 【文章标题】: 必备绝技——hook大法( 中 )【文章作者】: LvG【作者邮箱】: LvG2008@gmail.com【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!--------------------------------------------------------------------------------【详细过程】  这次主要说说核心层的hook。包

1678

Windows内核新手上路1——挂钩SSDT

Windows内核新手上路1——挂钩SSDT         这个系列记录学习我学习windows内核的点点滴滴,高手请直接无视。         文章核心内容:挂钩SSDT中函数列NtOpenProcess,NtDuplicateObject,NtCreateThread,NtOpenThread,NtWriteVirtualMemory,过滤进程操作来保护目标进程空间。SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表把ring3的Win32 AP

gimbow的专栏 2179

Windows下利用HOOK和进程挂起实现的桌面锁屏

Windows下利用HOOK和进程挂起实现的桌面锁屏

Windows程序设计学习笔记——hook和服务

本节先对上次介绍的远程线程注入做了些补充,然后再介绍了Windows的Hook技术,接着分别演示了如何创建和使用局部和全局钩子,最后介绍了Windows服务,分了两大步骤来完成一个服务的编写

weixin_48088263的博客 1098

Linux下用SquareLine Studio开发LVGL界面:从安装到实战的完整避坑指南

本文提供了一份在Linux系统下使用SquareLine Studio开发LVGL图形界面的完整实战指南。内容涵盖从SDL库安装、SquareLine Studio环境配置、界面可视化设计,到工程导出、源码编译及常见错误排查的全流程。重点解析了如何将设计界面无缝集成到Linux开发流程中,并针对嵌入式设备移植提供了关键步骤,旨在帮助开发者高效避坑,快速上手LVGL界面开发。

egg99的博客 905

4.2 Inline Hook 挂钩技术

InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、开发等领域。本章将重点讲解Hook是如何实现的,并手动封装实现自己的Hook挂钩模板。

微软技术分享 5498

Camunda流程引擎 Modeler (二)

Camunda Modeler是Camunda官方提供的建模器: 独立安装的建模器([windows、linux、mac]

1311

科大讯飞(1): 环形6麦语音唤醒—驱动板上的接口

介绍环形麦阵列驱动板上的接口,及其疑问

bing_feilong的博客 1175

MFC挂钩函数 Hook

挂钩 挂钩是系统消息处理机制中的一点,应用程序可以在挂钩上安装子程序以监视系统中的消息流(消息通信),并且在消息抵达目标窗口过程window procedure之前处理某些类型的消息。(Notes:相当于消息响应函数的前处理 但早与消息抵达响应函数之前) 1、挂钩概述 挂钩是一个应用程序可以截获诸如消息、鼠标动作和键盘输入等事件的机制。拦截特定类型事件的函数称为挂钩过程。挂钩过程可以对接收到的每个...

HayPinF的博客 693

热膨胀系数(CTE)的不同处理方法对于封装翘曲仿真的影响

随着技术的不断发展,芯片封装的集成度越来越高,尺寸也越来越大,随之而来的封装翘曲问题也越来越引起关注。影响芯片封装翘曲最主要的原因就是封装中不同材料热膨胀系数(CTE)的失配性,因此在进行封装翘曲仿真的过程中,如何使用材料的CTE值就变得尤为重要,会对仿真精度产生较大的影响。本文将对比不同CTE的处理方法给仿真结果带来的影响。

wangyubo1的博客 6855

挂钩(HOOK)

5.5 挂钩(HOOK) 5.5.1 为什么引入挂钩 在Apache1.3版本中,对HTTP 请求的处理包括若干个固定阶段,比如地址转换阶段、身份确认阶段、身份认证阶段、权限确认阶段、MIME类型识别阶段等等,这也意味着Apache1.3 中的挂钩数目是有限的,固定的。这个反映在模块结构中就是针对每个HOOK都对应一个函数指针。比如如果需要检查用户的身份是否合法则只需要调用 ap_check_

zjl410091917的专栏 3408

树莓派5外接RTX显卡:从PCIe到驱动的完整踩坑指南

在ARM架构与GPU加速的交汇点,树莓派5凭借其PCIe接口为DIY爱好者打开了外接独立显卡的大门。然而,PCIe x1的带宽限制、供电差异以及NVIDIA驱动在ARM Linux上的兼容性,使得这一组合成为一场高强度的系统底层排错训练。从理解PCIe总线原理、驱动加载机制到CUDA环境配置,每一步都充满挑战。本文以工程实践视角,梳理外接RTX显卡的完整流程、常见故障与性能瓶颈,并探讨其在边缘计算、AI推理等场景下的真实价值,帮助你理性评估这一实验性方案的可行性与替代路径。

chubaisheng8627的博客 351

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

HOOK挂钩技术

文章目录1.Address Hook1.1.PE的IAT1.2.PE的EAT1.3.PE的user32.dll的回调函数表1.4.IDT1.5.SSDT和ShadowSSDT1.6.C++类的虚函数表2.Inline Hook3.Hook位置 1.Address Hook 地址hook顾名思义,就是将原函数地址直接替换成hook函数地址 1.1.PE的IAT 因为IAT具体指某个PE模块的IAT,所以他的作用范围只针对被Hook的模块,且必须在以静态链接的方式调用API时才会被Hook,在使用LoadLib

醉等佳人归 1056

基于Python的房地产评估数据抓取与分析 —— 房价走势与市场报告

在房地产行业中,了解和分析房产价格的变化趋势、各个地区的房价差异以及市场评价报告,可以帮助投资者、购房者以及政策制定者做出更加明智的决策。本文介绍了如何使用Python爬虫技术抓取房地产平台上的房产评估报告、价格走势等数据,并对抓取的数据进行分析。通过这些技术,您可以自动化抓取房地产平台的数据,分析房价走势,获取市场报告,为房地产投资决策提供数据支持。假设我们要从链家网抓取某个房产的价格、房产描述以及历史成交价格,首先需要获取目标房产页面的URL,并发送HTTP请求。伪装为常见浏览器,避免被识别为爬虫。

2201_76125261的博客 846

挂钩 NtResumeThread 实现全局Hook

zhouzhenster@gmail.comzhouzhen[E.S.T]挂钩一直是Hack 编程中永恒的主题,基本高级的Rootkit 程序多多少少都会使用Hook 技术。似乎Hook 都被讲烂了,不论是Ring3 的还是Ring0 的网上都有例子。Ring0 的毋庸置疑当然是全局的了,这里说说ring3 的全局hook。Ring 3 有Ring 3 的优

1747

uniapp - HBuilder提示adb: failed to install X Failure [INSTALL_ARSE_FAILED_NOT_APK:X(安装HBuilder调试基座失败)

安装HBuilderX调试基座失败,uniapp APP运行到手机adb: failed to install,Uniapp提示adb,uniapp ios 真机调试报错 uniapp安卓调试,Uniapp安装不了基座,手动安装基座,正在安装手机端HBuilder调试基座,点击运行到手机报错信息:基座无法正常安装,Uniapp-安装HBuilder调试基座失败解决方案,解决 HBuilderX 安卓基座安装失败的问题,显示adb报错,UniApp苹果真机运行调试(自定义基座,版本更新后/没有基座打开失败)如

🏆 前端领域优质创作者 8061

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Hook之EasyHook(1)

开源项目easy hook的流程介绍与重构

2401_86176947的博客 1070

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HOOK(钩子,挂钩)

HOOK(钩子,挂钩)是一种实现Windows平台下类似于中断的机制。HOOK机制允许应用程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达目标窗口之前将其捕获,从而得到对消息的控制权,进而可以对该消息进行处理或修改,加入我们所需的功能。钩子按使用范围分,可分为线程钩子和系统钩子,其中,系统钩子具有相当大的功能,几乎可以实现对所有Windows消息的拦截、处理和监控。这项技术涉及到两个重要的API, 一个是SetWindowsHookEx,安装钩子; 另一个是U

baidu_16370559的博客 1452

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

4.1 应用层Hook挂钩原理分析

InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、等领域。本章将重点讲解Hook是如何实现的,并手动封装实现自己的Hook挂钩模板。

微软技术分享 1万+
上一篇: 用VC编写小型号黑客程序
下一篇: 木马免杀花指令的写法
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值