转载请保留原作者信息,谢谢。
需要的专业知识:
一: 精通OSI参考模型,精通网络五层:物理层,数据链路层,网络层,传
输层,应用层。精通每一层的协议,数据报格式。精通网络拓扑结构,
第一层,第二层,第三层的网络互联,数据的转发和路由等。
二: 精通C语言程式设计,UNIX/LINUX程式设计,网络程式设计。熟悉
UNIX/LINUX系统操作,熟悉著名服务的基本配置,特性及使用的端口
号。熟悉经典网络命令的使用,如:netstat,ping,traceroute,
netcat,arp等。
三: 精通标准SQL语言,熟悉流行的数据库使用,如:Oracle,Mysql等。
掌控数据库和WEB语言的结合使用。
我写到此处,假设您是完全理解局域网的。但是还是引用一段LionD8的文字吧:现在我们就用实例来模拟一下局域网传输的全过程。现在有一台电脑A(IP:192.168.85.1 MAC:AA-AA-AA-AA-AA-AA),另一台电脑B(IP:192.168.85.100 MAC:BB-BB-BB-BB-BB-BB)现在用A去 ping B。看见 Reply from 192.168.85.100: bytes=32 time<10ms TTL=32 这样的信息。然后在运行中输入arp -a,会看见 192.168.8.100 BB-BB-BB-BB-BB-BB dynamic这样的信息。那就是arp高速缓存中IP地址和MAC地址的一个映射关系,在以太网中,数据传递靠的是MAC,而并不是IP地址。其实在这背后就隐藏着arp的秘密。您一定会问,网络上这么多电脑,A是怎 么找到B的?那么我们就来分析一下细节。首先A并不知道B在哪里,那么A首先就会发一个广播的ARP请求,即目的MAC为FF-FF-FF-FF-FF-FF,目的IP为B的192.168.85.100,再带上自己的源IP,和源 MAC。那么一个网段上的任何电脑都会接收到来自A的ARP请求,由于每台电脑都有自己唯一的MAC和IP,那么他会分析目的IP即 192.168.85.100是不是自己的IP?假如不是,网卡会自动丢弃数据包。假如B接收到了,经过分析,目的IP是自己的,于是更新自己的ARP高速缓存,记录下A的IP和MAC。然后B就会回应A一个ARP应答,就是把A的源IP,源MAC变成现在目的IP,和目的MAC,再带上自己的源IP,源 MAC,发送给A。当A机接收到ARP应答后,更新自 己的ARP高速缓存,即把arp应答中的B机的源IP,源MAC的映射关系记录在高速缓存中。那么现在A机中有B的MAC和IP,B机中也有A的MAC和IP。arp请求和应答过程就结束了。由于arp高速缓存是会定时自动更新的,在没有静态绑定的情况下,IP和MAC的映射关系会随时间流逝自动消失。在以后的通信中,A在和B通信时,会首先 察看arp高速缓存中有没有B的IP和MAC的映射关系,假如有,就直接取得MAC地址,假如没有就再发一次ARP请求的广播,B再应答即重复上面动作。
电脑在接收到ARP应答的时候,不管有没有发出ARP请求,都会更新自己的高速缓存。
还记得前面说过的交换式局域网吗,为了能够在这样的局域网里进行sniffer,我们不
得不进行ARP欺骗。
现在假设有这样一个局域网,不管是交换机或是路由做交换设备都能够。我们自己的机
器的IP是192.168.1.7,交换设备的内部IP是192.168.1.1,也就是网关的地址。更有一台
IP是192.168.1.100的机器,就是victim啦,我们想sniffer,就要让victim机器的任何
数据报经过我们的机器192.168.1.7来转发,那么我们就能够用前面写过的sniffer程式截
获信息了。
我们给交换设备发一个ARP应答,只要把ARP数据报的发送端IP字段填成victim的IP
即可(这个字段原本应该是本机的IP:192.168.1.7)。
本程式只能在Linux上面运行,使用了SOCK_PACKET,但是现在应该用:
#include <sys/socket.h>
#include <netpacket/packet.h>
#include <net/ethernet.h>
packet_socket = socket(PF_PACKET, SOCK_RAW, protocol);
来代替比较好。
24-43是完整的ARP数据报结构定义,这是我们自己定义的。但是根据RFC826的定义,
必须要如此定义。
43行加了18个字节的0,这是为了把数据报长度填充到以太网数据需要的最小长度:46字节。
假如您看不懂这个程式,那您应该先想办法达到我上面说明的专业需要的第一项。
1 /* writed by kf701
2 * 2005-4-12
3 * hefei
4 * kf_701@21cn.com
5 */
6 #include<sys/socket.h>
7 #include<netinet/in.h>
8 #include<arpa/inet.h>
9 #include<sys/types.h>
10 /* #include<linux/if_ether.h> */
11
12 #include<stdio.h>
13 #include<stdlib.h>
14 #include<string.h>
15 #include<ctype.h>
16
17 /* ETH_P_ARP=0x0806,defined in linux/if_ether.h */
18 #define SWITCH_IP "192.168.1.1"
19 #define VICTIM_IP "192.168.1.100"
20 #define LOCAL_HW "00:30:1B:36:69:ED"
21 #define SWITCH_IP "00:0A:EB:DB:FF:24"
22 #define DEVICE "eth0"
23
24 struct ether_header{
25 unsigned char ether_dhost[6]; /* destination eth addr */
26 unsigned char ether_shost[6]; /* source ether addr */
27 unsigned short ether_type; /* packet type ID field */
28 };
29 struct arp_header{
30 unsigned short int ar_hrd; /* Format of hardware address. */
31 unsigned short int ar_pro; /* Format of protocol address. */
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




