IRP Hook

2023-12-17 02:58
文章标签 hook irp

本文主要是介绍IRP Hook,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

谈到irp拦截,基本上有三种方式

  • 在起点拦截
  • 在半路拦截
  • 在终点拦截

下面我们会详细分析这几种方式哪些是有效的,哪种是无效的。 要理解这几种拦截,我们需要看看irp地传送过程。
在这里插入图片描述

(注意并不是每种IRP都经过这些步骤,由于设备类型和IRP种类的不同某些步骤会改变或根本不存在。)

一、IRP创建。

由于IRP开始于某个实体调用I/O管理器函数创建它,可以使用下面任何一种函数创建IRP:

  • IoBuildAsynchronousFsdRequest 创建异步IRP(不需要等待其完成)。该函数和下一个函数仅适用于创建某些类型的IRP。
  • IoBuildSynchronousFsdRequest 创建同步IRP(需要等待其完成)
  • IoBuildDeviceIoControlRequest 创建一个同步IRP_MJ_DEVICE_CONTROL或IRP_MJ_INTERNAL_DEVICE_CONTROL请求。
  • IoAllocateIrp 创建上面三个函数不支持的其它种类的IRP。

由此我们知道,第一种起点拦截的办法就清楚了,那就是HOOK这几个IRP的创建函数。 由于函数有多个,并且此时irp虽然已经创建,但是还没有进程初始化,也就是说irp堆栈单元的内容还没有填充。因此起点拦截的办法是得不到有用信息的。这种办法无效

二、发往派遣例程

那么irp是什么时间初始化的呢?

创建完IRP后,你可以调用IoGetNextIrpStackLocation函数获得该IRP第一个堆栈单元的指针。然后初始化这个堆栈单元。

在初始化过程的最后,你需要填充MajorFunction代码。堆栈单元初始化完成后,就可以调用IoCallDriver函数把IRP发送到设备驱动程序了。

IoCallDriver是一个宏,它内部实现中调用了IofCallDriver. 因此,到这里便有了第二种拦截方法,即中途拦截。

三、派遣例程的作用

在派遣例程中完成irp。通常我们做的过滤驱动或者一些简单的驱动,都是这么完成的,直接在派遣例程中返回。不需要经过后面的步骤,派遣函数立即完成该IRP:

NTSTATUS  OnStubDispatch(  IN PDEVICE_OBJECT DeviceObject,IN PIRP           Irp)
{Irp->IoStatus.Status      = STATUS_SUCCESS;IoCompleteRequest (Irp, IO_NO_INCREMENT );return Irp->IoStatus.Status;
}

派遣例程把该IRP传递到处于同一堆栈的下层驱动程序 。 如果没处理,继续向下传, 如果中间FDO没有处理,最后传到最低层的硬件驱动上去,也就是我们所谓的PDO. 这个时候,I/O管理器就调用一次StartIo例程,硬件抽象层会通过硬件中断ISR,一个ISR最可能做的事就是调度DPC例程(推迟过程调用)。最后完成这个IRP , 并回到 I/O 管理器。

我们写驱动的时候,对感兴趣的irp,我们都会写派遣例程来进行处理。如果我们把派遣例程给替换了,便有了第三种的irp拦截。

  • 一种是写一个过滤驱动放在要拦截的驱动的上层,这是一种安全的办法。例如:
    如果我们想拦截系统的文件操作,就必须拦截I/O管理器发向文件系统驱动程序的IRP。而拦 截IRP最简单的方法莫过于创建一个上层过滤器设备对象并将之加入文件系统设备所在的设备堆栈中。具体方法如下:首先通过IoCreateDevice创 建自己的设备对象,然后调用IoGetDeviceObjectPointer来得到文件系统设备(Ntfs,Fastfat,Rdr或Mrxsmb, Cdfs)对象的指针,最后通过IoAttachDeviceToDeviceStack或者IoAttachDevice等函数,将自己的设备放到设备堆栈上成为一个过滤器。这是拦截IRP最常用也是最保险的方法。

  • 还有一种就是直接替换要拦截驱动对象的派遣例程函数表。它的方法更简单且更为直接。
    例如:如果我们想拦截系统的文件操作,它先通过ObReferenceObjectByName得到文件系统驱动对象的指针。然后将驱动对象中 MajorFunction数组中的打开,关闭,清除,设置文件信息,和写入调度例程入口地址改为我们驱动中相应钩子函数的入口地址来达到拦截IRP的目的。

总结:

1) 可用办法之一:hook IofCallDriver实现irp 拦截。
2) 可用办法之二:写一个过滤驱动,挂在你要hook其irp的那个驱动之上。
3) 可用办法之三:直接修改你要hook其irp的那个驱动的MajorFunction函数表。

例子参考:https://bbs.pediy.com/thread-60022.htm

这篇关于IRP Hook的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502848

相关文章

【hdu】Just a Hook(线段树区间修改)

线段树模板题,练的是懒惰标记。 懒惰标记,就是更新一段区间的时候,如果小区间被包含在了所需要更新的区间里面,那么直接对代表这个区间的数组元素赋值,之后做一个标记(表示这个区间的子区间都需要更新)但是不继续递归(这样可以节省很多的时候)。 116571152014-09-15 14:17:26Accepted1698796MS2380K1750 BG++KinderRiven #

react、vue 提供的 hook 函数对比

文章目录 useMemo vs computeduseEffect vs watch useMemo vs computed React 的useMemo 和 Vue3 的computed 分别用于优化性能和避免不必要的计算的两个概念。它们的目标相似,但实现方式和使用场景有所不同。它们都用于优化那些依赖于其他状态或属性,并且计算成本较高的表达式。以下是它们的主要区别: Rea

派遣函数 - IRP与派遣函数

派遣函数是Windows驱动程序中的重要概念。驱动程序的主要功能是负责处理IO请求,其中 大部分I/O请求是在派遣函数中处理的。         用户模式下所有对驱动程序的IO请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP 数据会被“派遣”到不同的派遣函数(Dispatch Function)中,这也派遣函数名字的由来。本章将针对IRP和派遣函数进行详细的介绍。

企业微信hook协议接口,聚合群聊客户管理工具开发

服务提供了丰富的API和SDK,可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互,可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作,通过接口可以实现自动回复、定时发送消息等功能,可以用来获取用户信息、添加或删除用户,发送文本消息、图片、文件、语音、视频等多种类型的消息,可以监听特定类型的消息,支持朋友圈

Android Hook ActivityThread mH 消息

背景: 今天面试被问到如何监听ActivityThread mH 类的消息,当时的想法是,mH 其实就是Handler, Android 没有提供获取到mH 的方法,就算我可以拿到mH 的 Looper, 最多也就可以在Looper 里面设置一个private Printer mLogging; ,当打印的时候就可以知道当前在分发mH 类的任何消息。 但是对方说,不希望在这里拦截,有没有其他方

linux内核hook技术之函数地址替换

前言     函数地址替换是一种更为简单、常见的hook方式,比如对security_ops、sys_call_table等结构中的函数进行替换,来完成自己的安全权限控制。     其中security_ops是LSM框架中所使用的,sys_call_table是系统调用表结构。当然了,这些结构目前在内核中都已经是只读数据结构了,如果想直接进行函数替换的话,首先就是考虑解决关闭写保护的问题。在

linux内核hook技术之跳转指令偏移值

前言     在另一篇博文中提到了指令覆盖和指令注入的hook方式,使用覆盖和注入方式完成内核函数hook,需要有很多的注意事项,而且容易被检测工具检测。这篇博文则聊一下如何通过替换跳转指令偏移值来完成内核函数的hook,这种hook技术也可以称为inline hook。     事先做个准备工作,手头正好有centos 6系列操作系统,还有一个热腾腾刚出锅的vmlinux。通过 gdb  v

linux内核hook技术之指令覆盖与注入

前言     说到hook,传统意义上,大家都会觉得跟注入和劫持挂钩。在linux内核中,也可以通过指令覆盖和注入的方式进行hook,来完成自己的业务逻辑,实现自己的功能需求。     一部分人喜欢称这种hook技术为inline hook。 如何hook     具体hook细节在以下编写的驱动例子程序中给出了,例子中标注了详细的注释,大家可对照着代码查看。     例子程序在cent

Android利用ptrace实现Hook API

以下内容选自《深入解析Android5.0系统》,京东,当当,亚马逊上有售。 Hook API的技术由来已久,在操作系统未能提供所需功能的情况下,利用HookAPI的手段来实现某种必需的功能也算是一种不得已的办法。 笔者了解Hook API技术最早是在十几年前,当时是在Windows平台下开发电子词典的光标取词功能。这项功能就是利用HookAPI的技术把系统的字符串输出函数替换成了电子词典中

Native开发与逆向第六篇 -字符串加密与hook

开发demo 写一个简单的字符串加密处理,将字符串字符转成ASCII十六进制值 std::string StrToHex(std::string str){unsigned char c;char buf[3];std::string result = "";std::stringstream ss;ss << str;while (ss.read((char *)(&c), sizeof(c