[原创] Ring3挂钩实现网址过滤、重定向——《另类挂钩-RING3数据包监视》应用...

转一份本地备份,原帖发在看雪的:http://bbs.pediy.com/showthread.php?t=100847

 

这份代码演示了如何根据黑名单过滤指定URL(可以实现简单的网页防火墙),并且演示了一种最容易实现的页面劫持方法(重定向)。当然,使用这个方法钓鱼是绝对禁止的,出了任何问题都与本人无关

 

实现原理:
1. 网址的黑名单过滤最简单,如果不需要模式匹配的话可以直接 Pos() 查找Buffer中是否包含指定字符串,有则直接返回失败(例如0xC0000001),让系统不发送这个请求包。
2. 页面劫持就是指将一个网站(或页面)的访问重定向到我们指定的网址上,这个电信以前干得比较多,他们是通过DNS实现的。这里通过修改服务器的返回数据,替换成 HTTP/1.1 301 来欺骗浏览器,比直接修改GET报文更方便,而且可以跨站。

 

都在原来代码的基础上修改而来,完整工程见文章末尾,下面是新增的处理部分:

   //  过滤参数
  Block_Filter 
=   ' google.com ' ;             //  阻止所有对 google.com 的请求
  
//  重定向参数
  URL_Filter 
=   ' bbs.pediy.com ' ;            //  要重定向的URL (小写)
  Redirect_String: AnsiString 
=             //  重定向字符串(使用 HTTP  301 )
      
' HTTP/1.1 301 Moved Permanently ' # 13 # 10 ' Location:  '   +
      
' http://www.baidu.com/search/error.html '   +
      #
0 ;

in   function  NewNtDeviceIoControlFile():
    
case  IoControlCode  of
      AFD_SEND:
        
if  ( LookupSendPacket(Buffer, Len) )  then
        
begin
          
//  输出包内容
          OutputDebugString(PChar(Format(
' [HTTP Send] Handle = %0.8X, Length = %d ' , [FileHandle, Len])));
          OutputDebugString(PChar(Format(
' %s ' , [StrPas(Buffer)])));
          tmpStr :
=  LowerCase(String(StrPas(Buffer)));

        
{   网址过滤实现   }
          
if  (Pos(Block_Filter, tmpStr)  >   0 then
          
begin
            OutputDebugString(PChar(Format(
' >>> "%s" was blocked. ' , [Block_Filter])));
            Result :
=  $C0000001;       //  返回失败让系统丢掉这个包
          
end ;

        
{   重定向实现   }
          
//  查找发送的数据中是否包含 URL_Filter 中的字符串
          
if  (Pos(URL_Filter, tmpStr)  >   0 then
          
begin
            
//  匹配到 URL_Filter,将Handle加入 SessionList
            tmpStr :
=  IntToHex(FileHandle,  8 );
            
if  (SessionList.IndexOf(tmpStr)  =   - 1 then    //  如果没有这个Handle
              SessionList.Add(tmpStr);
          
end ;
        
end ;
      AFD_RECV:
        
if  ( LookupRecvPacket(Buffer, Len) )  then
        
begin
          
//  输出包内容
          OutputDebugString(PChar(Format(
' [HTTP Recv] Handle = %0.8X, Length = %d ' , [FileHandle, Len])));
          OutputDebugString(PChar(Format(
' %s ' , [StrPas(Buffer)])));

        
{   重定向实现   }
          
//  在SessionList查找Handle,找到则进行重定向
          tmpStr :
=  IntToHex(FileHandle,  8 );
          Index :
=  SessionList.IndexOf(tmpStr);
          
if  (Index  >=   0 then
          
begin
            SessionList.Delete(Index);
            
//  修改缓冲区内容为重定向字符串
            
if  (Len  >=  DWORD(Length(Redirect_String)))  then
              CopyMemory(Buffer, @Redirect_String[
1 ], Length(Redirect_String));
            OutputDebugString(PChar(Format(
' >>> Redirect "%s" to a new page. ' , [URL_Filter])));
          
end ;
        
end ;
    
end ;

 

为了方便实现,利用了 TStringList.IndefOf() 查找Socket句柄,考虑效率的话建议自己实现查询算法。

注入dll到浏览器后就能看到效果,这段代码会阻止所有对 google.com 的访问,并且将看雪论坛的请求全部重定向到百度的错误页面上

 

完整工程源码r3_Hook_NtDeviceIoControl_Redirect301_src.rar

转载于:https://www.cnblogs.com/bits/archive/2009/11/08/Ring3_Hook-NtDeviceIoControlFile_Redirect_301.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ring0、Ring1、Ring2和Ring3是指x86架构中的特权级别,也被称为特权环或特权层。这些特权级别用于控制操作系统和应用程序对计算机硬件和资源的访问权限。 在x86架构中,系统中的所有指令和操作都被分为特权指令和非特权指令。特权指令需要在更高的特权级别下执行,而非特权指令可以在较低的特权级别下执行。 以下是对每个特权级别的简要说明: 1. Ring0(内核模式):也称为内核模式或特权级0,它具有最高的特权级别。在Ring0中,操作系统内核运行,并且可以直接访问和控制计算机的所有硬件资源,如内存、CPU和设备等。只有在Ring0中才能执行一些敏感的操作和特权指令。 2. Ring1(驱动程序模式):也称为驱动程序模式或特权级1,它具有比Ring0低的特权级别。在Ring1中,驱动程序可以运行,并且可以执行一些受限制的操作,如对硬件设备的直接访问。Ring1通常用于操作系统的设备驱动程序。 3. Ring2(自定义模式):也称为自定义模式或特权级2,它具有比Ring1低的特权级别。在Ring2中,可以执行一些较为受限制的操作,但通常不被广泛使用。 4. Ring3(用户模式):也称为用户模式或特权级3,它具有最低的特权级别。在Ring3中,运行着用户应用程序,如浏览器、办公软件等。在这个特权级别下,应用程序只能访问受限的资源,并且无法直接访问硬件资源。 特权级别的设计使得操作系统可以有效地控制和保护系统资源,防止恶意应用程序或用户对系统进行未授权的访问和操作。通过限制应用程序的特权级别,可以增强系统的安全性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值