探索NDIS HOOK新的实现方法(2)

记一次hook mac地址实现伪装硬件码 1. 前言 好久没写文章了,工作比较忙,不过我还是对技术比较热爱,即使它不能给我带来利益,保持初心。 工作期间遇到一个问题,连接vpn的软件是校验机器硬件码,不是公司电脑不让使用vpn软件,上下班已经让我搞得筋疲力尽了,我不想每天背个电脑回家,这还怎么让我在家愉快的加班? 2. 分析 首先,我能想到硬件码当然是mac地址,为了验证我自己的想法,我需要将mac地址设置成与公司电脑mac地址相同的地址。 这里windows 上有简单的修改mac地址的方法,通过修改注册表,简单来说就是给注册表增加选项,让 阅读详情
探索NDIS HOOK新的实现方法(2)  
          ---INLINE HOOK实现NDIS HOOK

前面讲述了如何通过获取NDIS_PROTOCOL_BLOCK来实现NDIS HOOK,这里讲述第二种方法,那就是inline hook方法。说起inline hook,也不是什么新鲜玩意,无非是在一个函数的首部嵌入一个jmp机器指令,在该函数执行有效代码前就跳到我们的代理函数,在我们的代理函数里做了必要的处理以后,再跳回原来的函数,接着执行原函数的指令。

      既然tcpip.sys是标准的NDIS协议驱动,那么收包函数显然应该是在tcpip.sys内部实现的,我们直接找到这两个收包函数,然后对其inline hook不就可以了吗?经过逆向分析,我找到了这两个函数,本人安装了两个XP系统,其中一个导出了这两个函数,另一个系统却没导出,所以我们仍然需要用特征码搜索这两个函数,这两个函数声明如下:

NDIS_STATUS  
ARPRcv (NDIS_HANDLE BindContext,
        NDIS_HANDLE MacContext,
        UCHAR* HeadBuffer,
        ULONG HeadSize,
        UCHAR* Buffer,
        ULONG BufferSize,
        ULONG PacketSize);

INT
ARPRcvPacket (NDIS_HANDLE BindContext,
              PNDIS_PACKET Packet);


搜索这两个函数地址的代码如下:




//以下全局变量保存两个函数的地址
void* ARPRcv=NULL;  
void* ARPRcvPacket=NULL;

void SearchProtocolRoutine()
{


//以下分别为两个收包函数的特征码
UCHAR ARPRcvBytes[] ={0x8b,0xff,0x55,0x8b,0xec,0x56,0x8b,0x75,0x08,0x33};
UCHAR   ARPRcvPacketBytes[]={0x8b,0xff,0x55,0x8b,0xec,0x51,0x53,0x56,0x57,0x8b};
    
  
//获取tcpip.sys模块的基地址,该函数在前一节已经提供给大家
char* base=FindModule("tcpip.sys");
    
while(ARPRcv==NULL||ARPRcvPacket==NULL)
{
   if(ARPRcv==NULL&&
    RtlCompareMemory(ARPRcvBytes,base,10)==10)
  
   {
    ARPRcv=base;
   }

   else  if(ARPRcvPacket==NULL&&
    RtlCompareMemory(ARPRcvPacketBytes,base,10)==10)
   {
    
        ARPRcvPacket=base;
  
   }
  
   base++;

}


}

     各种编译器所编译的函数,前几个指令都是几乎一样的,用来建立堆栈帧,这些指令叫函数的序言。
在win2000上是三字节
push  ebp
mov   ebp, esp

到了winxp以及后续系统上,则变成了五字节
mov     edi, edi
push    ebp
mov     ebp, esp

而一个近跳转指令刚好是五字节,在xp上刚好覆盖了函数的序言,所以在XP上挂钩也相对容易一点,这里着重说明如何对ARPRcv进行挂钩,我们在ARPRcv内部插入一个jmp指令,将跳到ARPRcvProx函数,该函数是个裸函数,函数实现如下:

_declspec(naked) ARPRcvProx()//跳板函数
{
    _asm
{
   mov  edi, edi
   push ebp
   mov  ebp ,esp

   //七个参数开始压栈
   push  [ebp+20h]
   push  [ebp+1ch]
   push  [ebp+18h]
   push  [ebp+14h]
   push  [ebp+10h]
   push  [ebp+0ch]
   push  [ebp+8]
    
   call  NewARPRcv  //调用NewARPRcv函数
  

   cmp   eax,0x10003   //判断函数返回值是否NDIS_STATUS_NOT_ACCEPTED
  

   jz    end           //如果是NDIS_STATUS_NOT_ACCEPTED,直接结束本函数
                          //而不跳回到ARPRcv函数
                        
  
   mov  eax,ARPRcv     //如果返回的不是NDIS_STATUS_NOT_ACCEPTED,将会
                           //执行到这条指令,该指令将 ARPRcv函数的地址装入eax
  
   add  eax,5          //将ARPRcv地址值加上5,存入eax,表示即将跳转的//地址
   jmp  eax             //开始跳回ARPRcv体内

end:  
   pop  ebp
   retn 1ch

  
}
    
}

在该函数内部,又调用了NewARPRcv函数,原型和ARPRcv保持一致,也必须由我们自己实现:

NDIS_STATUS  
NewARPRcv(
    IN NDIS_HANDLE  ProtocolBindingContext,
    IN NDIS_HANDLE  MacReceiveContext,
    IN PVOID        HeaderBuffer,
    IN UINT         HeaderBufferSize,
    IN PVOID        LookAheadBuffer,
    IN UINT         LookaheadBufferSize,
    IN UINT         PacketSize
    )
{

   /*

     在这里加入你的判断逻辑代码,是否拦截该数据
如果要拦截,则返回  NDIS_STATUS_NOT_ACCEPTED
否则返回NDIS_STATUS_SUCCESS,把数据交给ARPRcv处理

*/
   return NDIS_STATUS_SUCCESS;
}

    同样的原理,我们在ARPRcvPacket里面插入jmp指令,将跳转到ARPRcvPacketProx裸函数,该函数实现如下:
_declspec(naked) ARPRcvPacketProx()
{
  
_asm
{
   mov  edi, edi
   push ebp
   mov  ebp ,esp

      //两个参数开始压栈
   push [ebp+0ch]
   push [ebp+8]

   call NewARPRcvPacket//调用NewARPRcvPacket  
  
   cmp  eax,0         //如果返回0则表示拒绝该数据包
   jz   end          //直接返回本函数
  
    mov eax ,ARPRcvPacket
    add eax ,5
    jmp eax         //跳回ARPRcvPacket函数第六个字节
  
end: pop ebp
     retn 8
      



}
}

在该函数内部,将会调用NewARPRcvPacket,函数实现如下:
INT  
NewARPRcvPacket(NDIS_HANDLE  BindContext,
      PNDIS_PACKET  ndisPacket)
{
  
  /*
    在这里加入你的判断逻辑,是否拦截该数据,如果要拦截,则返回0,

否则返回非0
*/

   DbgPrint("RcvPacket");
   return 1;


}


   请仔细阅读以上代码的注释,接下来,我们还必须提供一个函数实现安装和卸载挂钩功能

void PatchARPRcv(BOOLEAN isPatch)//isPatch为TRUE表示安装挂钩,为FALSE表示卸载挂钩。
{


/*即将用以下五个字节覆盖ARPRcv函数前五个字节  
  这5个字节就是jmp XXXX指令的机器码,因为跳转的相对地址还需要
  进一步计算,所以暂时用零填充

*/

   UCHAR patchBytes[5]={0xe9,0x00,0x00,0x00,0x00};
  

  
  //即将用以下五个字节覆盖ARPRcvPacket函数前五个字节
  UCHAR patchBytes2[5]={0xe9,0x00,0x00,0x00,0x00};
  
  //保存原始函数的前五个字节,方便以后恢复挂钩
  UCHAR restoreBytes[5]={0x8b,0xff,0x55,0x8b,0xec};

  
   /*  
    以下两行代码计算跳转的偏移量
    */
  
  int offset=(char*)ARPRcvProx-(char*)ARPRcv-5;
  int offset2=(char*)ARPRcvPacketProx-(char*)ARPRcvPacket-5;

  
   //修正patchBytes和patchBytes2中的相对地址
   memcpy(patchBytes+1,&offset,4);
   memcpy(patchBytes2+1,&offset2,4);
  
  
  
   if(isPatch)
{
      DisableWriteProtect();//禁止写保护
      
   memcpy(ARPRcv,patchBytes,5);
      memcpy(ARPRcvPacket,patchBytes2,5);
    
      EnableWriteProtect(); //开启写保护
}

  else
  {
  
     DisableWriteProtect();  
  
  memcpy(ARPRcv,restoreBytes,5);
     memcpy(ARPRcvPacket,restoreBytes,5);
    
  EnableWriteProtect();
  
    
  }

}
因为ARPRcv和ARPRcvPacket函数处于只读页,所以必须先禁用写保护才能向其中插入代码,禁用写保护和开启写保护代码如下:


void
DisableWriteProtect()
{

      _asm{                  
            cli      
            mov  eax, cr0      
            and  eax, 0FFFEFFFFh
            mov  cr0, eax      
            
           }  

}

void
EnableWriteProtect()
{

      _asm{              
            
          mov  eax, cr0  
          or   eax, not 0FFFEFFFFh    
          mov  cr0, eax  
          sti
           }
}


注意这些代码暂时只适用XP系统,在win2000和win2003上都需要少许改动。  
NDIS HOOK及MINIPORT HOOK的实现 [0x00]    网上有很多讨论关于NDIS HOOK的文章,但大多只讲了WIN7之前的HOOK NDIS_OPEN_BLOCK下的例程,至于WIN7下怎么 HOOK以及如何做MINIPORT-HOOK,网络上则鲜有提及.根据前阵子的相关分析,我把NDIS HOOK总结一下 阅读详情

相关推荐

Frida Hook Windows NDIS用户态API伪造MAC地址实战

MAC地址是网络设备的唯一物理标识,其修改行为在操作系统中受严格管控;Windows通过NDIS网络驱动接口规范,在内核与用户态之间构建了多层校验机制。绕过注册表或UI层的简单修改极易被NDIS中间层驱动识别为异常操作,触发安全告警。Frida凭借用户态动态注入与函数级Hook能力,可精准劫持ndis.dll导出函数(如NdisOpenAdapter),在驱动加载前篡改内存中的NDIS_OPEN_PARAMETERS结构体,实现合法、隐蔽、无需重启的MAC伪装。该技术广泛应用于红队渗透、802.1X准入绕过

weixin_33743703的博客 680

windows网络防火墙开发二三事

<br />网络防火墙开发二三事<br />- haoxg - <br /><br />花了近一个月的时间研究 Windows 平台下的网络防火墙相关技术,并实现了一个简单的防火墙。<br />在独自摸索的过程中,由于以往的开发经历从未涉及此领域,所以碰到了不少困难,也走了些弯路。<br />现此项目暂告一段,遂将相关心得整理成文。文章以归纳总结为主,没有创新性技术,高手免看。 <br /><br />◎ 防火墙的数据包拦截方式小结 <br /><br />网络防火墙都是基于数据包的拦截技术之上的。在 Wi

TANG_XIAO_BIN的专栏 6342

易语言-增强HOOOK类 虚化全局网卡MAC HOOK硬盘序列号

增强HOOOK类 虚化全局网卡MAC HOOK硬盘序列号

Windows下的个人防火墙-网络数据包拦截技术概览

Windows下的个人防火墙-网络数据包拦截技术概览随着网络安全问题日益严重,网络安全产品也被人们重视起来。防火墙作为最早出现的网络安全产品和使用量最大的安全产品,也受到用户和研发机构的青睐。从防火墙的应用角度来看基本上可以分为两种:网络级的防火墙和个人防火墙。Windows操作系统作为使用最为广泛的PC操作系统,因此在Windows操作系统下开发的个人防火墙产品数不胜数。国外比较著名的有AtGu

welkint的专栏 3547

【信号与系统实战解析】—— 拉普拉斯变换在电路分析中的关键应用

本文深入解析了拉普拉斯变换在电路分析中的关键应用。通过将时域微分方程转换为复频域的代数方程,系统化处理初始条件,并利用零极点图分析电路稳定性与频率响应。文章以RLC串联电路为例,详细演示了s域建模、性质运用及综合分析方法,为工程师提供了分析动态电路的强大工具与清晰视角。

weixin_29093017的博客 176

使用pdfBox实现pdf转图片出现中文方块乱码 简单修改源码解决

参考文章 问题排查:使用pdfbox将pdf转image时STSong-Light字体中文乱码 pdfbox版本是2.0 日志中打印出类似这样的日志(例:Using fallback XXX for CID-keyed font STSong-Light),就说明系统没有安装STSong-Light字体,pdfbox使用XXX字体来替代了。如果出现方块,就说明没有这种字体,并且替代字体也没有,日志也有相应的其他提示。 正常操作就是安装缺失的 STSong-Light 字体,但是在网上搜到的都是 STSong

aji_csdn的博客 5267

Windows Filter-Hook Driver 防火墙

基于win2000 Fileter-Hook Driver的防火墙开发   Filter-Hook Driver是在微软的Windows 2000 DDK中被引入进来。但实际上它并不是一个新的网络驱动类,它只是一个IP过滤功能的驱动。    事实上Filter-Hook Driver不是一个网络驱动类,它是属于核心驱模型。在这个Filter-HookDriver中我们只实现了

dot_star的专栏 2750

IBM AC922 8335-GTW 安装linux,CentOS,ubuntu,RHEL各种坑

AC922

u011970286的专栏 901

探索NDIS HOOK新的实现方法(1)

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

aiyun1234的博客 127

【毕设】基于LoRa的物联网控制器:从原理图到PCB的完整硬件设计指南

本文提供了一份完整的基于LoRa的物联网控制器硬件设计指南,涵盖从系统框图、原理图设计到PCB布局布线的全流程。详细讲解了电源电路、单片机最小系统、信号接口以及LoRa无线模块等核心模块的设计要点与抗干扰技巧,并分享了实用的调试心得,旨在帮助电子、物联网专业学生顺利完成毕业设计,掌握低功耗远距离物联网节点的硬件开发实践。

weixin_42126677的博客 307

KEIL5编译报错L6200E:__stdout重定义问题分析与解决

本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。

uran的专栏 957

NDIS HOOK 防火墙实现关键技术

到网络安全不能不提到防火墙。目前国内防火墙多数是采用 TDI 技术, NDIS 可以算是较先进的技术了(如果您认为不是的话, 只能说明我落伍了, 呵呵) 网上缺少 NDIS 防火墙实现的技术细节说明.  经过2天的查找资料和分析已有的源代码再加上以前 NDIS 编程的基础很快对该技术有了初步的了解。该技术细节分析只涉及到怎样 Hook 到 Ndis.sys 中导出的内核函数。至于在 Hook

1148

俄罗斯方块 C++控制台版

一、创建方块 wstring tetromino[7]; tetromino[0].append(L"..X...X...X...X."); // Tetronimos 4x4 tetromino[1].append(L"..X..XX...X....."); tetromino[2].append(L".....XX..XX....."); tetromino[3].append(L"..X..XX..X......"); tetromino...

一只大鸽子的博客 1625

探索NDIS HOOK新的实现方法

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

jia_xiaoxin的专栏 794

Transformer-LSTM预测 | 基于Transformer-LSTM的多变量单步时间序列预测(Matlab)

Transformer-LSTM预测 | 基于Transformer-LSTM的多变量单步时间序列预测(Matlab)

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 192

Deep SHAP 深度学习模型的可解释性分析

Deep SHAP 算法是一种用于解释深度学习模型的技术, 该算法通过将每个特征的重要性与输出值相关联来进行解释。本博客对深度学习的模型可解释性进行了分析。

cnjs1994的博客 5121

NDIS WIN7 64 WINXP hook网络发包收包

转: 网上有很多讨论关于NDIS HOOK的文章,但大多只讲了WIN7之前的HOOK NDIS_OPEN_BLOCK下的例程,至于WIN7下怎么 HOOK以及如何做MINIPORT-HOOK,网络上则鲜有提及.根据前阵子的相关分析,我把NDIS HOOK总结一下,网上有一些讨论 NDIS HOOK的文章,请读者先阅读那些文章对NDIS HOOK有个基本了解. [0x01...

ace0580的博客 272

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 机器狗”病毒驱动部分逆向分析注释(C代码)
下一篇: 探索NDIS HOOK新的实现方法(1)
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值