内网的ARP病毒(攻击)近两年来都是网吧很烦恼的事情,网管们现在都在使用双绑来缓解这一问题,做双绑时需要网关的MAC地址,网关可能是一台电脑,也有可能是一部路由器或者猫, 有此时候要查看它的MAC 地址并不是很方便, 一些网吧平台软件开发商在推的产品中便加入了"探测"网关MAC的功能, 如下图:
我们今天想分析一下这个功能的实现原理和方法, 稍后会写出完整的代码.
首先我们尝试一下自己通过DOS 窗口中的命令,来感觉一下ARP 的另一个参数 -g
先ping 一下网关的IP,确保是通畅的,并且这个的过程也助于让网关的返回的数据信号缓存在地址表中
再用 arp -g 即可得到相应的MAC地址了.
有兴趣你可以尝试一下,是否可以正确得到其他机器的MAC 地址,操作是相同的.
给网吧写一个工具,就不能光调DOS命令, 这次我用的仍然是delphi 7 ,在窗体上放两个文本输入框,两个按钮即可以了.有关ARP方面的操作指令, 我们可以调用微软的API 来实现.
SendARP( )是Microsoft Platform SDK中提供用来获得目标主机的MAC地址的函数,SendARPSendARP的函数原型如下:
DWORD SendARP(
IPAddr DestIP, // 目标IP地址
IPAddr SrcIP, // 源IP地址
PULONG pMacAddr, // 返回MAC地址指针
PULONG PhyAddrLen // 返回MAC地址长度
);
这个函数的返回值为错误代码
31 说明对方没有开机,我们的函数检测不到它,
1784 说明的给函数的最后一个参数的值是0,或你的给的值与你给的缓存区大小不符合。
通过它我们可以很简单的实现MAC地址探测.
Function sendarp(ipaddr:ulong;
temp:dword;
ulmacaddr:pointer;
ulmacaddrleng:pointer) : DWord; StdCall; External 'Iphlpapi.dll' Name 'SendARP';
procedure TForm1.Button1Click(Sender: TObject);
var
myip:ulong;
mymac:array[0..5] of byte;
mymaclength:ulong;
r:integer;
begin
myip:=inet_addr(PChar(Edit1.Text));
mymaclength:=length(mymac);
r:=sendarp(myip,0,@mymac,@mymaclength);
label1.caption:='errorcode:'+inttostr(r);
Edit2.Text:=format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',[mymac[0],mymac[1],mymac[2],mymac[3],mymac[4],mymac[5]]);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
下面运行后的效果:
很多网吧平台软件都附有这项功能, 现在我们自己模仿一下也不难,开发重在找准需求、思路清晰,代码编写并不是难度。其实我们在网吧的日常管理还有很多可以扩展的地方,需求也是多样的。比如你发现有某个IP 活动异常,要通过IP 查出是那一台电脑,就此需求也可以去自己动手做出一个工具来。
本文来源:未知 作者:佚名