ARP欺骗是用处很大的一个技术,我们的路由器整天在欺骗我们的PC,没有这个欺骗我们就不能上网。
先稍微说下我们每天经历的ARP欺骗,比如早上开路由器开PC,我们上Google,PC在发送IP包之前(假设Google的IP为173.194.72.94,当然事先要先通过DNS服务器获取Google的IP,这个不多谈)要先这个IP包装配为以太网帧,所以PC必须要知道Google服务器端MAC,才能填充好以太网帧。要想知道Google的MAC地址,我们的PC就要发送ARP广播请求,跟你一个局域网里的所有以太网设备都能收到这个请求,你希望有人告诉自己与173.194.72.94匹配的MAC地址是多少,因为我们的PC跟Google的服务器不在一个局域网里,所以Google服务器没法收到你的ARP请求,但是如果这个局域网中有其他PC知道的话,它收到这个请求就会给你发送ARP应答告诉你,如果没人知道怎么办?只能靠骗了!这个骗子就是路由器,这也是它的一个职责。路由器用自己的MAC地址冒充Google服务器的MAC地址,给你发ARP应答糊弄你,你收到应答后喜得不行,然后把所有帧都发给了路由器。下面我们就看路由器时怎么欺骗你的。
路由器能捕捉到这个局域网里广播帧,假设路由器捕捉到的PC的ARP广播帧写成十六进制为:
[plain]
FFFFFFFFFFFFCE1A8206DA0708060001080006040001CE1A820C6B07C0A8127A000000000000C0A8127B00000B00482A00000D00000060FB5EFB61FB
按以太网帧结构把这个帧分解后为:
[cpp]
FFFFFFFFFFFF---目的MAC,因为是广播帧,所以MAC地址全为1
CE1A8206DA07---源MAC,这里就是你PC的MAC
0806—---帧类型(以太网帧都是这个数)
0001----硬件类型(以太网帧都是这个数)
0800----协议类型(以太网帧都是这个数)
06----硬件地址长度(以太网帧都是这个数)
04----协议地址长度(以太网帧都是这个数)
0001—---操作字段(0001为ARP请求,0002为ARP应答)
CE1A820C6B07---源mac,还是你的PC的MAC地址
C0A8127A-------源IP地址,就是你的PC的ip
000000000000---目的mac,因为不知道,所以把这6个字节胡乱填充一下就好
ADC2485E-------目的ip,就是Google的IP
00000B00482A00000D00000060FB5EFB61FB---这18个字节都是填充,就是为了凑够以太网帧最小长度60字节
然后路由器收到PC的ARP广播请求后就给你发送应答,这个应答帧为:
[plain]
CE1A8206DA07000A3501FA1708060001080006040002000A3501FA17ADC2485ECE1A8206DA07C0A8127A00000B00482A00000D00000060FB5EFB61FB
按照以太网帧格式拆分后为:
[cpp]
CE1A8206DA07---目的MAC,ARP应答不是广播帧,它直接把PC的MAC地址当成目的MAC
000A3501FA17---源MAC,这个是冒牌的,值本来该是Google服务器的MAC地址,但是这里路由器用自己的MAC来冒充
0806—---帧类型(以太网帧都是这个数)
0001----硬件类型(以太网帧都是这个数)
0800----协议类型(以太网帧都是这个数)
06----硬件地址长度(以太网帧都是这个数)
04----协议地址长度(以太网帧都是这个数)
0002—---操作字段(1为ARP请求,2为ARP应答)
000A3501FA17---源MAC
ADC2485E-------源IP地址,这个必须是ARP请求中的那个目的IP,也就是Google的IP。这个是重中之重,我的代码在这犯过错误,如果PC收到应答后检查这个IP发现与自己请求的目的IP不一样,心说,莫名其妙,我什么时候请求这个IP的MAC地址了?滚!它就会果断抛弃这个帧,然后继续请求,谁知道Google的MAC地址呀!!!
CE1A8206DA07---目的mac也就是PC的MAC地址
C0A8127A-------目的ip,就是PC的IP
00000B00482A00000D00000060FB5EFB61FB---这18个字节都是填充,为了凑够以太网帧最小长度60字节,这个应答完全照抄了请求的填充,这些数都无所谓。
PC在收到这个帧后,就真以为那个MAC地址是Google的,然后就把帧一股脑全发给路由器了。之后你就可以上Google了。