Hook Dispatch 实时监控

jacob使用说明终极吐血版 NULL 博文链接:https://angkor.iteye.com/blog/411534 立即下载

作者:pker

/*++

Module Name:

    FSHook.c


Abstract:

    I  wanted  to  build a filter driver when I first  thought about doing such
    kind of things.  But then I found that it's not realistic 'cause it have to
    hook every filesystem driver to prevent from missing any IRPs. But we don't
    know  when  there's a new driver  coming.  When we install a virtual CD-ROM
    program, for instance,  it installs a driver to control the virtual CD-ROM.
    There  can be  viruses in the  image of the  disk,  so we have to hook that
    driver as well.

    Then a new idea,  which then I found that it's being used by most of the AV
    softs, comes out of my head. The driver's final goal is to inercept all the
    I/O behavior to disk A~Z, so we can use  ObReferenceObjectByXXX  to get the
    _FILE_OBJECT of  /??/X:/,  then   we   can   get   the   device  chain   by
    IoGetRelatedDeviceObject.  We are interested in the MajorFunction  field of
    the _DEVICE_OBJECT. We can hook the IRP_MJ_XXX we interest by replacing the
    entries of the dispatch routines with our own.


Environment:

    Kernel mode.


Copyright:

    Copyright (c) 2005, pker / CVC.GB

--*/

#include "fshook.h"


///////////////////////////////////////////////////////////////////////////////
//
//                             Global Variables
//
///////////////////////////////////////////////////////////////////////////////

// save hooked device objects and driver objects

PDEVICE_OBJECT g_pDevObjTab[MAX_DISK]={NULL};
PDRIVER_OBJECT g_pDrvObjTab[MAX_DISK]={NULL};

// entries of original dispatch routines of each hooked driver

PAV_DRIVER_DISPATCH_ROUTINE g_pOriginalDispatch[MAX_DISK];

// process ID of the AV scanner

ULONG g_ulPid;

// shared memory address (kernel mode)

PVOID g_pKrnlSBuffer=NULL;


///////////////////////////////////////////////////////////////////////////////
//
//                                 Functions
//
///////////////////////////////////////////////////////////////////////////////

ULONG
PAV_GetObjectTabIndex (
    IN ULONG *pObject,
    IN ULONG **pObjTab
)

/*++

Routine Discription:

    The routine searches the suitable object  (device object and driver object)
    and returns the index of the object in the global object table.

--*/

{
    ULONG i;

    for (i=0; i<MAX_DISK; i++)
    {
        if (pObjTab[i] == pObject)
        {
            return i;
        }
    }

    // object not found

    return (ULONG)-1;
}


NTSTATUS
PAV_DispatchRoutineHook (
    IN PDEVICE_OBJECT pDeviceObject,
    IN PIRP pIrp
)

/*++

Routine Discription:

    This is the hook of the IRPs.  When in DEBUG mode.  It  DbgPrint the driver
    name,  which is dealing with the I/O request, and the target filename, with
    which the I/O request is going to handle.

    The  main  function  of this procedure is to intercept all the I/O request,
    and wakeup the Ring3 virus scanning routine.

--*/

{
    ULONG i;
    HANDLE pid;
    PIO_STACK_LOCATION piosl;
#ifdef __PAV_MON_DEBUG__
    ANSI_STRING as;
#endif

    pid=PsGetCurrentProcessId ();

#ifdef __PAV_MON_DEBUG__
    // debug print the pid

    DbgPrint ("PavAP!PAV_DispatchRoutineHook: PsGetCurrentProcessId = %x/n",pid);

    // get the driver name which is dealing with the IRP

    RtlUnicodeStringToAnsiString (&as,&(pDeviceObject->DriverObject->DriverName),TRUE);
    DbgPrint ("PavAP!PAV_DispatchRoutineHook: Intercepted a I/O Request from Driver: %s/n",as.Buffer);
    RtlFreeAnsiString (&as);
#endif

    // determine where the I/O request came from

    i=PAV_GetObjectTabIndex ((ULONG *)pDeviceObject,(ULONG **)g_pDevObjTab);
    if (i == (ULONG)-1)
    {
        i--;
    }
#ifdef __PAV_MON_DEBUG__
    DbgPrint ("Target Filename: %c:",(CHAR)i+'A');
#endif

    // get the filename that the I/O request would effect

    piosl=IoGetCurrentIrpStackLocation (pIrp);
#ifdef __PAV_MON_DEBUG__
    if (piosl->FileObject != NULL)
    {
        RtlUnicodeStringToAnsiString (&as,&(piosl->FileObject->FileName),TRUE);
        DbgPrint ("%s/n",as.Buffer);
        RtlFreeAnsiString (&as);
    }
#endif

    // call original dispatch routine and returns

    i=PAV_GetObjectTabIndex ((ULONG *)pDeviceObject->DriverObject,(ULONG **)g_pDrvObjTab);
    if (i != (ULONG)-1)
    {
        switch (piosl->MajorFunction)
        {
            case IRP_MJ_CREATE:
#ifdef __PAV_MON_DEBUG__
                DbgPrint ("MajorFunction Code: IRP_MJ_CREATE/n/n");
#endif
                return g_pOriginalDispatch[i].pfnCreate (pDeviceObject,pIrp);

            case IRP_MJ_WRITE:
#ifdef __PAV_MON_DEBUG__
                DbgPrint ("MajorFunction Code: IRP_MJ_WRITE/n/n");
#endif
                return g_pOriginalDispatch[i].pfnWrite (pDeviceObject,pIrp);

            case IRP_MJ_CLOSE:
#ifdef __PAV_MON_DEBUG__
                DbgPrint ("MajorFunction Code: IRP_MJ_CLOSE/n/n");
#endif
                return g_pOriginalDispatch[i].pfnClose (pDeviceObject,pIrp);

            case IRP_MJ_CLEANUP:
#ifdef __PAV_MON_DEBUG__
                DbgPrint ("MajorFunction Code: IRP_MJ_CLEANUP/n/n");
#endif
                return g_pOriginalDispatch[i].pfnCleanup (pDeviceObject,pIrp);
        }
    }

    // no suitable driver object found, so complete this IRP

    return PAV_CompleteRequest (pIrp,STATUS_SUCCESS,0);
}


PDEVICE_OBJECT
PAV_GetDeviceObject (
    IN PUNICODE_STRING pusDeviceName
)

/*++

Routine Discription:

    Get the related device object according to the device name.

--*/

{
    NTSTATUS ns;
    HANDLE hFile;
    OBJECT_ATTRIBUTES oa;
    IO_STATUS_BLOCK iosb;
    PFILE_OBJECT pFileObject;
    PDEVICE_OBJECT pDeviceObject;

    // open the device

    InitializeObjectAttributes (&oa,pusDeviceName,OBJ_CASE_INSENSITIVE,NULL,NULL);
    ns=ZwCreateFile (&hFile,SYNCHRONIZE | FILE_ANY_ACCESS,&oa,&iosb,0,0,
                     FILE_SHARE_READ | FILE_SHARE_WRITE,FILE_OPEN,
                     FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
    if (!NT_SUCCESS(ns))
    {
        return NULL;
    }

    // reference the file object by the handle...

    ns=ObReferenceObjectByHandle (hFile,FILE_READ_DATA,NULL,KernelMode,&pFileObject,NULL);
    if (!NT_SUCCESS(ns))
    {
        ZwClose (hFile);
        return NULL;
    }

    // get related device object chain

    pDeviceObject=IoGetRelatedDeviceObject (pFileObject);

    // dereference file object and close the file (device)

    ObDereferenceObject (pFileObject);
    ZwClose (hFile);

    return pDeviceObject;
}


VOID
PAV_IrpHookInstall (
    VOID
)

/*++

Routine Discription:

    This function hooks IRPs of each disk device, from A~Z.

--*/

{
    ULONG i;
    NTSTATUS ns;
    PDEVICE_OBJECT fdo;
    UNICODE_STRING usDeviceName;
    WCHAR DeviceName[]=L"
//??//X://";

    // hook disk A~Z

    for (i=0; i<MAX_DISK; i++)
    {
        // get device object

        DeviceName[4]='A'+(WCHAR)i;
        RtlInitUnicodeString (&usDeviceName,DeviceName);
        fdo=PAV_GetDeviceObject (&usDeviceName);

        if (fdo == NULL)
        {
            continue;
        }

        // hook IRPs...

        g_pDevObjTab[i]=fdo;
        g_pDrvObjTab[i]=fdo->DriverObject;

        if (PAV_DispatchRoutineHook != g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CREATE])
        {
            g_pOriginalDispatch[i].pfnCreate=g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CREATE];
            g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CREATE]=PAV_DispatchRoutineHook;
        }

        if (PAV_DispatchRoutineHook != g_pDrvObjTab[i]->MajorFunction[IRP_MJ_WRITE])
        {
            g_pOriginalDispatch[i].pfnWrite=g_pDrvObjTab[i]->MajorFunction[IRP_MJ_WRITE];
            g_pDrvObjTab[i]->MajorFunction[IRP_MJ_WRITE]=PAV_DispatchRoutineHook;
        }

        if (PAV_DispatchRoutineHook != g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CLOSE])
        {
            g_pOriginalDispatch[i].pfnClose=g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CLOSE];
            g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CLOSE]=PAV_DispatchRoutineHook;
        }

        if (PAV_DispatchRoutineHook != g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CLEANUP])
        {
            g_pOriginalDispatch[i].pfnCleanup=g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CLEANUP];
            g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CLEANUP]=PAV_DispatchRoutineHook;
        }
    }
}


VOID
PAV_IrpHookRemove (
    VOID
)

/*++

Routine Discription:

    Removes  the  IRP  hooks and restore the original dispatch routines of each
    hooked device.

--*/

{
    ULONG i;

    // restore every hooked driver's dispatch routine entries

    for (i=0; i<MAX_DISK; i++)
    {
        if (g_pDrvObjTab[i] != NULL)
        {
            if (g_pOriginalDispatch[i].pfnCreate != NULL)
            {
                g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CREATE]=g_pOriginalDispatch[i].pfnCreate;
            }

            if (g_pOriginalDispatch[i].pfnWrite != NULL)
            {
                g_pDrvObjTab[i]->MajorFunction[IRP_MJ_WRITE]=g_pOriginalDispatch[i].pfnWrite;
            }

            if (g_pOriginalDispatch[i].pfnClose != NULL)
            {
                g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CLOSE]=g_pOriginalDispatch[i].pfnClose;
            }

            if (g_pOriginalDispatch[i].pfnCleanup != NULL)
            {
                g_pDrvObjTab[i]->MajorFunction[IRP_MJ_CLEANUP]=g_pOriginalDispatch[i].pfnCleanup;
            }
        }
    }
}

jacob资源包附有异常解决方法 Jacob 是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用 立即下载

相关推荐

S/4中的16种特殊库存类型

S/4中的16种特殊库存类型

yanzibing99的博客 1万+

Hook Dispatch 实时监控[zz]

作者:pker/*++Module Name:    FSHook.cAbstract:    I  wanted  to  build a filter driver when I first  thought about doing such    kind of things.  But then I found that its not realistic cause it have

LionD8' Blog 个人作品 www.360kdj.com 360KDJ股票实验室 5219

FPGA时序约束--实战篇(读懂Vivado时序报告)

本文将详细介绍如何读懂Vivado时序报告,包括报告的基本结构和如何分析报告。

mengzaishenqiu的博客 1万+

转载 jacob Dispatch not hooked to windows memory 异常处理

jacob常用异常处理 (2011-03-10 15:06:57) 转载 ▼ 标签: jacob 异常 comfail exception dispid open illegal state it 分类: JAVA com.jacob.com.ComFailException: Can’t map name to dispid: Open 这种异常是因为操作完成后,没有调用ComThread.R...

weixin_40389421的博客 6170

配置 SAP Web Dispatcher 的实战指南:打通 SAP Fiori、SAP Gateway 与前端系统的关键一跳

SAP Web Dispatcher 在 Fiori 架构中扮演关键角色,作为统一入口处理 HTTPS 请求、实现安全代理和流量分发。它将分散在不同系统的访问路径统一收口,解决浏览器同源策略限制,集中管理 HTTPS 终止和客户端信息传递。典型配置中,Web Dispatcher 监听 443 端口,根据路径将 OData 请求转发至 Gateway 系统,静态资源请求送至前端服务器。SSL 相关配置(如 PSE 文件)确保安全通信,而路由规则(wdisp/system_xx)决定请求转发目标。实施时需注意

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 105

C++多线程 task--std::promise和std::future

本文主要讲解C++11/14/17中所提供的应用于多线程编程中的Task机制。Task可由如下几部分取得而本文主要讲解std::promise和std::future相关的内容。std::promise和std::future通过一个数据管道进行交流,可以将std::promise看作生产者,std::future看作消费者,其两者形成如下的方式交互std::promise本身是一个模版类,通过std::promise可以像数据管道中设置value,异常和相应的通知信息。std::promise提供了如下接

qls315的博客 1819

Dispatch not hooked to windows memory word转PDF

qq_36236621的博客 1412

华为od 面试八股文_Python_02_含答案

华为od 面试八股文_Python_02_含答案

MISAYAONE的博客 4538

react-hooks

Hook是 React16.8 的新特性,Hook使你在无需修改组件结构的情况下复用状态逻辑。弥补了 functin Component 没有实例没有生命周期的问题,react项目基本上可以全部用 function Component 去实现了。

fk1012的博客 587

天地图下载带审图号(审图号: GS(2024)0650号)的 “行政区划” 数据(含shp文件下载地址)

在科研投稿论文过程中,多数期刊杂志要求我们制作涉及国界的图件,必须使用自然资源部地图技术审查中心发布的标准地图底图。如地理学报、地理科学等期刊的投稿指南中写到:非标准底图本刊不予发表!(如图1.1所示)如果一定要用,凡涉国界图件(国内部分地区、全国、世界部分地区、全球)必须使用自然资源部标准地图服务系统标准地图底图(http://bzdt.ch.mnr.gov.cn/)(如图1.1所示)或国家测绘局地理信息局标准地图底图(如图1.2所示),所用底图边界要完全无修改(包括南海诸岛位置)。

JData_Engineer的博客 2304

Allegro快速编辑丝印文字操作指导

选择setup-Application Mode-placement edit。Allegro支持丝印文字的编辑,下面介绍快速编辑丝印文字的两种方法如下。这个功能还支持拷贝粘贴,可以从其它地方拷贝过来,免去了书写的麻烦。出现text edit窗口,输入自己需要的文字,点击ok。鼠标移动到丝印文字位置,文字会被高亮起来。Allegro快速编辑丝印文字操作指导。点击丝印文字,丝印会被高亮起来。选择Text edit 命令。输入需要更改后的文字,如下。右击选择text edit。以编辑下方丝印文字为例。

weixin_54787054的博客 4193

React 系列 之基础一(组件篇)

React 简介 组件篇 1.组件定义 React 组件名称开头字母必须大写. const Hello = () => { return ( <div> <p>Hello world</p> </div> ) } const App = () => { return ( <div> <h1>Greetings</h1> <Hello

JIANG_RZJ的博客 520

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

分析Spring事务管理原理及应用

通过配置已经大体知道了spring事务管理实现的原理就是AOP,不难推测,spring会提供实现事务管理相关功能的切面,切点和通知相关的类,来完成对于事务相关功能的支持。我们以配置最简单的注解式配置为例,分析其实现方式。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java事务与Spring事务管理

在构建企业级Java应用时,维护数据完整性是至关重要的,而事务管理则是确保这一点的关键。Java平台通过JTS和JTA提供了事务服务,允许将操作包装在一个原子工作单元中,确保这些操作要么全部成功,要么在遇到错误时全部回滚。Spring框架通过提供编程式和声明式事务管理工具简化了这一过程。编程式事务需要在代码中显式管理事务,而声明式事务则通过配置或注解隐式管理,这有助于将事务逻辑从业务逻辑中解耦。Spring的事务管理支持ACID属性,提供了灵活的事务传播行为和隔离级别设置,以及明确的回滚规则。正确使用Spr

庄的博客 1212

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java Spring事务,事务的传播机制

比如:转账 2. 数据库执行事务 Spring对于事务的实现 (1) 编程式实现(和数据库是一样的) 手动开启事务 手动提交事务/手动回滚事务 (2) 声明式事务(利用自动开启事务和提交事务),推荐使用这种方式 通过注解来实现对事务的操作,必然要使用数据库MyBatis版本不匹配 如果引入了MyBatis的依赖,就需要配置数据库 引入MyBatis依赖之所以感觉“需要”配置数据库,是因为Spring Boot的自动配置机制被触发,它试图为你创建一个完整可用的MyBatis环境,而这个环境的基石——数据源(

的博客 1253

踩坑! spring事务,非事务方法与事务方法执行相互调用

写这篇文章的初衷呢就是最近遇到了一个spring事务的大坑.与其说是坑,还不如说是自己事务这块儿太薄弱导致的(自嘲下). 项目环境 sprinigboot 下面开始问题描述,发生的过程有点长,想直接看方案的直接跳过哦~;  最近在做项目中有个业务是每天定时更新xx的数据,某条记录更新中数据出错,不影响整体数据,只需记录下来并回滚当条记录所关联的表数据; 好啊,这个简单,接到任务后,楼主我三下...

西风一任秋的博客 5万+

万字长文!带你吃透Java事务及Spring Boot应用实战(上)

本文摘要:Java事务是数据库操作的基本执行单元,通过ACID特性(原子性、一致性、隔离性、持久性)确保数据一致性。文章详解了事务的核心概念,包括银行转账等典型应用场景,并介绍了JDBC事务管理方式,通过Connection对象手动控制事务提交与回滚。示例代码展示了如何在MySQL环境中实现多表操作的事务控制,强调事务对于保证数据完整性的重要性。

m0_73590302的博客 1362

Java 方法中循环调用具有事务的方法

本文简要介绍了Java 方法中循环调用具有事务的具体方法示例,虽然@Transactional是Spring中最常用和推荐的方式,但是本文还简要介绍了其他5种方法可以实现类似的功能。

m0_72958694的博客 2118

【Java】【Spring】【事务的使用】

【Java】【Spring】【事务的使用】

时光与简的博客 5409

java 事务回滚注解_Java Spring 事务回滚详解

这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下spring 事务回滚1、遇到的问题当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:public method() {Dao1.save(Person1);Dao1.save(Person2);Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数...

weixin_34761438的博客 2106

Spring事务的那些坑,这里都给你总结好了!

目录 一、Spring事务管理的几种方式: 1. 声明式 2. 编程式 二、Spring事务实现机制 三、Spring事务的那些坑 3.1 事务不生效 3.2 事务不回滚 3.3 事务超时不生效 四、 总结 1. Spring事务未生效 2. Spring事务回滚失效 3. Spring事务超时不准确或失效 Spring框架已是JAVA项目的标配,其中Spring事务管理也是最常用的一个功能,但如果不了解其实现原理,使用姿势不对,一不小心就可能掉坑里。 为了更透彻的说明...

程序员白楠楠的博客 1774

Spring - 事务与非事务方法相互调用 @Transactional 注解失效讲解

Spring - 事务与非事务方法相互调用 @Transactional 注解失效讲解

1933

Java Spring 事务管理深度指南

本文全面解析Java事务管理,从基础概念到Spring Boot实战应用。首先通过转账场景引入事务的必要性,详细讲解ACID四大特性(原子性、一致性、隔离性、持久性)。重点剖析Spring的声明式事务管理,包括@Transactional注解的使用方法和常见失效场景。深入讲解事务传播行为(如REQUIRED、REQUIRES_NEW)和隔离级别(读未提交、读已提交等),帮助开发者处理并发问题。最后总结事务失效的典型原因,如同类调用、异常处理不当等。全文涵盖事务核心知识点,适合Java开发者系统学习事务管理机

2301_79751930的博客 1451

Spring service本类中方法调用另一个方法事务不生效问题

[问题]       Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring AOP啊,事务管理真轻松啊,真轻松;事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务;轻量级,测试起来也简单,嘿!”。不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事。所以,我们“一直用它”。       不过,最近的一个项目里,却碰到了一个事务管理上的问题:有一个服务类,其一...

两个陌生人 1万+
上一篇: 显示EXE,DLL或PDB文件中指定函数的Parameter和local variables信息
下一篇: NDIS and TDI Hooking, Part II
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值