恢复tcpip.sys的dispatch hook

Windows内核原理与实现之TDI(传输驱动程序接口) 文章摘录自《Windows内核原理与实现》一书。 我们植到,Winsock以网络协议为基础来访问网络,比如TCP/IP和IPX/SPX等,其相应的内核驱动程序为afd.sys。那么,像 afd.sys这样的网络 API 驱动程序在接收到针对特定协议的网络请求时,如何将请求转交给相应的协议驱动程序呢?它如何适应不同网络协议的实现差异呢? Windows 在网络 API驱动程序与协议驱动程序之间规定... 阅读详情
#define BASEADDRLEN 10
PBYTE MyGetNtosBaseAddress() 
{
    PSYSTEM_MODULE_INFORMATION  pSysModule;  

    ULONG        uReturn;
    ULONG        uCount;
    PCHAR        pBuffer = NULL;
    PCHAR        pName  = NULL;
    NTSTATUS    status;
    UINT        ui;

    CHAR        szBuffer[BASEADDRLEN];
    PCHAR        pBaseAddress;

    status = ZwQuerySystemInformation( 11, szBuffer, BASEADDRLEN, &uReturn );
    pBuffer = ( PCHAR )ExAllocatePool( NonPagedPool, uReturn );
    if ( pBuffer )
    {
        status = ZwQuerySystemInformation( 11, pBuffer, uReturn, &uReturn );
        if( status == STATUS_SUCCESS )
        {
            uCount = ( ULONG )*( ( ULONG * )pBuffer );
            pSysModule = ( PSYSTEM_MODULE_INFORMATION )( pBuffer + sizeof( ULONG ) );

            pBaseAddress = ( PCHAR )pSysModule->Base;
            ExFreePool( pBuffer );
            return (PBYTE)pBaseAddress;
        }

        ExFreePool( pBuffer );
    }

    return NULL;
}
PBYTE MyGetModuleBaseAddress( PCHAR pModuleName ) 
{
    PSYSTEM_MODULE_INFORMATION  pSysModule;  

    ULONG        uReturn;
    ULONG        uCount;
    PCHAR        pBuffer = NULL;
    PCHAR        pName  = NULL;
    NTSTATUS    status;
    UINT        ui;

    CHAR        szBuffer[BASEADDRLEN];
    PCHAR        pBaseAddress;

    status = ZwQuerySystemInformation( 11, szBuffer, BASEADDRLEN, &uReturn );
    pBuffer = ( PCHAR )ExAllocatePool( NonPagedPool, uReturn );
    if ( pBuffer )
    {
        status = ZwQuerySystemInformation( 11, pBuffer, uReturn, &uReturn );
        if( status == STATUS_SUCCESS )
        {
            uCount = ( ULONG )*( ( ULONG * )pBuffer );
            pSysModule = ( PSYSTEM_MODULE_INFORMATION )( pBuffer + sizeof( ULONG ) );

            for ( ui = 0; ui < uCount; ui++ )
            {
                pName = strrchr( pSysModule->ImageName, '//' );

                if ( !pName ) 
                {
                    pName = pSysModule->ImageName;
                }

                else {
                    pName++;
                }
                
//                KdPrint(( "pName=%s, pModuleName=%s", pName, pModuleName ));

                if( _stricmp( pName, pModuleName ) == 0 )
                {
                    pBaseAddress = ( PCHAR )pSysModule->Base;
                    ExFreePool( pBuffer );
                    return (PBYTE)pBaseAddress;
                }

                pSysModule ++;
            }
        }

        ExFreePool( pBuffer );
    }

    return NULL;
}
#define SearchDepth 0x300 


void RestoreTcpipIRP()
{
UNICODE_STRING DeviceName; 
PDRIVER_OBJECT DriverObject; 
NTSTATUS status; 
DWORD ret;
KIRQL OldIrql;
ULONG TempDisp ;
ULONG DirverEntry ;
ULONG i ;
ULONG TcpDispatch =0;
ULONG TcpDeviceControlDispatch =0 ;
ULONG TempAddr =0 ;
UNICODE_STRING TcpipDriverFileName ;
OBJECT_ATTRIBUTES oba ;
HANDLE hTcpipFile ;
IO_STATUS_BLOCK IoStatusBlock ;
HANDLE hTcpipSection ;
PVOID BaseAddress =NULL ;
SIZE_T nSize = 0 ;
ULONG Ppeheader ;
ULONG pEntryPoint ;
ULONG TcpipBase ;
ULONG ImageBase ;
RtlInitUnicodeString(&TcpipDriverFileName , L"//SystemRoot//System32//Drivers//Tcpip.sys") ;


RtlInitUnicodeString(&DeviceName,L"//Driver//Tcpip");

status = ObReferenceObjectByName( 
&DeviceName, 
OBJ_CASE_INSENSITIVE, 
NULL, 
0, 
*IoDriverObjectType, 
KernelMode, 
NULL, 
(PVOID*)&DriverObject); 

KDMSG(("Geth the tcpip driver object = %08x", DriverObject));


if (DriverObject) 
{
    TcpipBase = MyGetModuleBaseAddress("tcpip.sys");

    if (!TcpipBase)
    {
        KDMSG(("can't get the base address of the tcpip.sys /n"));
        return ;
    }

    InitializeObjectAttributes(&oba ,
        &TcpipDriverFileName,
        OBJ_CASE_INSENSITIVE,
        NULL,
        NULL
        );
    
    status = ZwCreateFile (&hTcpipFile ,
        FILE_EXECUTE | SYNCHRONIZE ,
        &oba,
        &IoStatusBlock,
        NULL,
        FILE_ATTRIBUTE_NORMAL ,
        FILE_SHARE_READ ,
        FILE_OPEN_IF,
        FILE_SYNCHRONOUS_IO_NONALERT,
        NULL,
        0
        );

    if (!NT_SUCCESS(status))
    {
        KDMSG(("Open the tcp ip file failed!/n"));

        return ;
    }
    InitializeObjectAttributes(&oba,
        NULL,
        OBJ_CASE_INSENSITIVE,
        NULL,
        NULL);

    status = ZwCreateSection (&hTcpipSection ,
        SECTION_ALL_ACCESS,
        &oba,
        NULL,
        PAGE_EXECUTE,
        0x1000000, 
        hTcpipFile );

    if (!NT_SUCCESS(status ))
    {
        KDMSG (("create the tcpip section failed!/n"));
        if (hTcpipFile)
            ZwClose(hTcpipFile);

        return ;
    }

    status = ZwMapViewOfSection(hTcpipSection,
        NtCurrentProcess(),
        &BaseAddress ,
        0,
        1000,
        NULL,
        &nSize,
        ViewShare ,
        MEM_TOP_DOWN,
        PAGE_READWRITE
        );
    
    if (!NT_SUCCESS(status))
    {
        KDMSG(("Map view the tcpip section failed!/n"));
        if (hTcpipSection)
            ZwClose(hTcpipSection);
        if (hTcpipFile)
            ZwClose(hTcpipFile);

        return ;
    }
    Ppeheader = *(ULONG*)((ULONG)BaseAddress+0x3c);
    pEntryPoint = *(ULONG*)((ULONG)BaseAddress+Ppeheader+0x28);
    DirverEntry = (ULONG)BaseAddress+pEntryPoint ;
    ImageBase = *(ULONG*)((ULONG)BaseAddress+Ppeheader+0x34);
    
    //DirverEntry = DriverObject->DriverInit ;
    
    if (DirverEntry)    
    {
        for (i = DirverEntry ; i < DirverEntry + SearchDepth ; i++)
        {
//            if (MmIsAddressValid((PVOID)i))
//            {
                if (*(BYTE*)i == 0x8d && *(BYTE*)(i+1) == 0x7e &&
                    *(BYTE*)(i+2) == 0x38 && *(BYTE*)(i+3) == 0xf3 &&
                    *(BYTE*)(i+4) == 0xab)
                {
//                    if (MmIsAddressValid((PVOID)(i-4)))
//                    {
                        if (MmIsAddressValid((PVOID)(*(ULONG*)(i-4) + TcpipBase - ImageBase)))
                        {
                            TcpDispatch = *(ULONG*)(i-4) + TcpipBase - ImageBase;
                            TempAddr = i;    
                            break ;
                        }
                        
/*                    }*/
    
                }
                
            }
            
        }
        
        //find code =8d 7e 38 f3 ab
        //lea edi,[esi+38h]
        //rep stosd

        if (TempAddr && TcpDispatch)
        {
            for (i = TempAddr ; i < TempAddr +0x30 ; i++)
            {
//                if (MmIsAddressValid((PVOID)i))
//                {
                    if (*(BYTE*)i == 0xc7 && *(BYTE*)(i+1) == 0x46 && *(BYTE*)(i+2) == 0x74)
                    {
                        if (MmIsAddressValid((PVOID)(*(ULONG*)(i+3) + TcpipBase - ImageBase)))
                        {
                            TcpDeviceControlDispatch = *(ULONG*)(i+3) + TcpipBase - ImageBase;
                            break;
                        }
                    }
/*                }*/
                
            }
            
        }
        if (TcpDispatch)
        {
            KeAcquireSpinLock(&SDTSpinLock , &OldIrql);
            WPOFF();
            for (i = 0 ; i <=IRP_MJ_MAXIMUM_FUNCTION ; i++)
            {
                DriverObject->MajorFunction = TcpDispatch ;
      
          
            }
            if (TcpDeviceControlDispatch)
    
        {
                
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = 
TcpDeviceControlDispatch ;

            }
            WPON();
      
      KeReleaseSpinLock(&SDTSpinLock , OldIrql);

        }
        
ObfDereferenceObject(DriverObject);
        
        
    }
    
ZwUnmapViewOfSection(NtCurrentProcess(),
        BaseAddress);
    if 
(hTcpipSection)
    {
        ZwClose(hTcpipSection);
    }
    if 
(hTcpipFile)
    {
        ZwClose(hTcpipFile);
    }
return 
;

}
Android之hook dispatchTouchEvent方法 无埋点操作,是通过gradle的Transform API在编译期扫描整个项目生成的class文件,再利用ASM API对class文件插入我们的埋点方法来实现的。 在各种事件方法里插桩埋点,基本上满足我们的大部分埋点需求,但是产品会有这样的需求,想看看用户在某个界面里哪些区域点击比较频繁,就需要知道用户点击的坐标。获取点击事件可以办到,还可以拿到点击事件里的View,但是无法获取点击的屏幕坐标。... 阅读详情

相关推荐

驱动级Hook拦截系统内核调用

驱动级Hook拦截系统内核调用,源码 驱动级Hook拦截系统内核调用,源码

Windows防火墙之NDIS HOOK和TDI HOOK

<br />1、TDI HOOK<br /> TDI Client利用TDI接口,向TDI Server发送IRP(I/O Request Packet)请求包,来获得TDI Server提供的服务。因此,可以利用分层驱动原理[5],在TDI Client和TDI Server驱动之间加一层过滤驱动-FilterDriver.sys。对于TCP/IP协议而言,在Windows网络协议体系结构中是由Tcpip.sys驱动实现的。Tcpip.sys创建了几个设备对象,/Device/RawIp,/Device/

深度技术安全 8550

服务器蓝屏(tcpip.sys)处理过程之一

服务器时常蓝屏,蓝屏提示tcpip.sys问题,文档里面写有本人解决这个问题的分析问题过程及解决办法

NDIS HOOK实现方法

转载探索NDIS HOOK新的实现方法(1) NDIS HOOK是专业级防火墙使用的一种拦截技术,NDIS HOOK的重点是如何获得特定协议对应NDIS_PROTOCOL_BLOCK指针,获得了该指针,接下来就可以替换该协议所注册的收发函数,而达到拦截网络数据的目的。 获 得NDIS_PROTOCOL_BLOCK指针的方法一般是用NdisRegisterProtocol注...

weixin_30417487的博客 248

2025年VSCode AI插件实战:如何用Devika+Continue+Tabby三件套10倍提升开发效率

本文详细介绍了2025年VSCode AI插件Devika、Continue和Tabby的三件套组合,如何通过智能开发工作流10倍提升开发效率。从项目架构生成到上下文感知辅助,再到本地化智能编码,这套方案实现了从需求分析到代码生成的全流程自动化,特别适合中大型项目开发。

weixin_26911099的博客 273

Win7系统提示找不到ntoskrnl.exe文件的解决办法

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个ntoskrnl.exe文件(挑选合适的版本文件)把它放入到程序或系统目录中,当我们执行某一个.exe程序时,相应的DLL文件就会被调用,因此将缺失的文件放回到原目录之后就能打开你的软件或游戏了.那么出现ntoskrnl.exe丢失要怎么解决?

file 2035

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 482

react dispatch_React系列二十一 Hook(二)高级使用

一. Hook高级使用 1.1. useReducer很多人看到useReducer的第一反应应该是redux的某个替代品,其实并不是。useReducer仅仅是useState的一种替代方案:在某些场景下,如果state的处理逻辑比较复杂,我们可以通过useReducer来对其进行拆分;或者这次修改的state需要依赖之前的state时,也可以使用;单独创建一个reducer/coun...

weixin_39622123的博客 3886

电子纸价签实战:基于SSD1680的墨水屏驱动开发与优化

本文详细介绍了基于SSD1680驱动芯片的电子纸价签开发实战,涵盖硬件连接、驱动框架搭建、核心流程解析及性能优化。重点剖析了初始化配置、波形文件加载、图像数据写入与刷新触发等关键步骤,并提供了功耗优化、显示效果提升及代码健壮性等实用避坑指南,帮助开发者高效实现稳定低功耗的墨水屏驱动。

weixin_28278377的博客 231

Simulink仿真状态空间中状态变量时域响应

起因 今天老师留了一道关于状态空间变量响应的题,于是想用simulink仿真,一开始使用state-space模块,但是发现它只能输出y,没办法显示状态变量的变化情况。然而状态变量之间的关系都可以表示为一阶微分方程组,因此我们考虑在Simulink中搭建微分方程组来求解这个问题。 微分方程组 x1˙=x2x2˙=−4x1−5x2+1(1)\dot{x_1}=x_2\\ \dot{x_2}=-4x_...

ZYunfei的博客 7469

服务器系统tcpip.sys,win7系统tcpip.sys文件引起蓝屏的解决方法

‍‍蓝屏是常见的电脑故障,而导致出现蓝屏的原因有非常多。最近有win7 64位旗舰版用户在开机时会出现蓝屏,根据屏幕上的错误描述应该是tcpip.sys文件引起的蓝屏现象,这该怎么解决呢?tcpip.sys文件是一个系统和网络相关的文件,该文件出现如果问题会引起蓝屏,下面由小编给大家介绍win7系统tcpip.sys文件引起蓝屏的解决方法。解决方法:1、通常tcpip.sys文件异常导致的蓝屏的停...

weixin_35823048的博客 5151

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5589

MYSQL 网络连接

assert(mp!= nullptr);#endif首先断言mp非空。为结构体动态分配内存,并将指针赋给。调用来初始化这个安全互斥锁,同时传入源文件名和行号。内部通常会:再调用初始化真正的原生互斥体。记录锁的创建位置、线程 ID 等信息,以便在死锁检测、锁定顺序检查或错误报告时提供调试信息。这种模式主要用于调试版本,帮助开发者发现互斥锁使用问题(如重复锁定、死锁、未释放等)。#else#endif直接调用初始化中的原生互斥体(例如或 Windows 的。

Piemon&Anokata的博客 497

YOLO11 改进、魔改|分组残差自注意力GRSA,通过分组残差优化 QKV 计算、指数空间映射优化位置偏差,在大幅降低自注意力模块参数和计算量的同时,增强特征关系与位置信息的表征能力

【摘要】研究人员提出GRSA(分组残差自注意力)机制,解决Transformer在图像超分辨率任务中效率与性能难以兼顾的问题。GRSA通过分组残差层减少自注意力参数冗余,同时采用指数空间相对位置偏差优化位置信息表征。实验表明,GRSA在降低50%参数量的同时保持模型性能,适用于目标检测和图像分割任务。在YOLO系列模型中集成GRSA可提升小目标检测精度,代码实现已开源,详细部署教程见相关视频与GitHub资源。该机制为轻量化Transformer模型提供了高效解决方案。

qq_64693987的博客 798

GameFramework框架详解之 框架总览

一.前言 目前市场上有很多优秀个开源框架,比如ET,GameFramework,DBFramework,StrangeIOC,Loxodon-Framework,KSFramework,xluaFramework等等。其中要说规范的话,不得不说GameFramework还是不错的,当然很多新手看到后会觉的有点复杂,写一个小小的功能,不得不套用一堆东西,继承一堆接口,感觉不知所措,不能随心所欲的去撸代码。其实这个框架就是为了约束新手的行为的,让我们面向接口编程,遵循“开闭”的设计原则来写代码,方便后期的扩

TxNet 2万+

网络编程(2)---TCP/IP协议

TCP/IP协议是Internet最基本的协议,Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。通俗而言,TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确的传输到目的地,而IP是给因特网的每一台联网设备规定一个地址。 TCP传输模式 IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---...

11onhook的博客 526

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

利用 TDI HOOK 实现任意端口复用

所谓tdi hook,我这里利用的是hook tcpip dispatch table的方法,实际上复用的原理很简单,关键是hook掉tdi_event_connect,之后从*AcceptIrp中取出conn obj,将其传递到自己定义的tdisend中就可以了。这里唯一蹩脚的地方是在处理TDI EVENT的时候,当进程启动后,它首先系统注册这些event handler,在有相应的网络事件发生

白日梦 4480

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

win10修复tcp驱动服务器,怎么解决tcpip.sys文件导致蓝屏|Win10的tcpip修复工具

由tcpip.sys文件引起的蓝屏错误,错误代码为:0x000000D1,表示硬件设备的驱动程序遇到了问题。引起错误的文件是tcpip.sys,那么应该是与网卡驱动有关。这篇文章是PE吧给大家带来的解决方法,希望对大家有帮助。方法/步骤:1、下载tcpip修复工具,由于是一个压缩文件,所以需要进行解压;3、tcpip修复工具分了32位和64位两个版本,大家可以根据自己的系统位数选择合适的版本使用;...

weixin_39712611的博客 6389

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

react-hooks

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

fk1012的博客 588

redux 多种触发dispatch方式

[原文链接]https://blog.bam.tech/developper-news/4-ways-to-dispatch-actions-with-redux redux 作为js app的主要的状态容器和react结合的非常多。架构设计上基于action的触发机制,通过dispatch对应的action来修改状态,而状态的修改由统一的reducer来处理(为什么叫reducer呢,因为每个...

邱凯翔 Edward 的个人博客 3万+

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

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

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

JIANG_RZJ的博客 520
上一篇: shellcode 之 JMP ESP 与 JMP EBX
下一篇: 安全配置cisco路由器
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值