巧用ARP 探测网络中的黑客软件
装广播地址的ARP请求报文,另一个是接收回馈的ARP应答报文并做出分析。我们就分别用两个线程来实现。主线程负责发送,监听线程负责接收。
首先是创建以太网头部和ARP头部的结构:
typedef struct _et_header //以太网头部
以下是引用片段: { unsigned char eh_dst[6]; unsigned char eh_src[6]; unsigned short eh_type; }ET_HEADER; |
以下是引用片段: { unsigned short arp_hdr; unsigned short arp_pro; unsigned char arp_hln; unsigned char arp_pln; unsigned short arp_opt; unsigned char arp_sha[6]; unsigned long arp_spa; unsigned char arp_tha[6]; unsigned long arp_tpa; }ARP_HEADER; |
然后是发送ARP请求报文的主线程,取得所有适配器的名字。其中,"adapter_name"表示一个用于存放适配器名字的缓冲区,而这些适配器名字将以UNICODE编码方式存入此缓冲区中。UNICODE编码方式就是用一个字的空间(两个字节)来存放一个字符。这样,每个字符间自然会出现一个''。而两个适配器名字之间将会有一个字为''作为间隔。adapter_length:这个缓冲区的大小:
以下是引用片段: if(PacketGetAdapterNames((char*)adapter_name, &adapter_length)==FALSE) { printf("PacketGetAdapterNames error:%dn",GetLastError()); return 0; } |
打开适配器,此处我默认打开第一块适配器:
以下是引用片段: lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)adapter_list[0]); if (!lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE)) { printf("Unable to open the driver, Error Code : %lxn", GetLastError()); return 0; } |
以太网头部和ARP头部结构赋值,StrToMac函数是笔者自定义的字符串转换为Mac地址的函数:
StrToMac("00E06E41508F",s_Mac); //"00E06E41508F"是笔者测试程序所用的本地机的网卡地址,测试者应将其改为测试机网卡地址
memcpy(et_header.eh_src,s_Mac,6);
StrToMac("FFFFFFFFFFFE",d_Mac); //目的物理地址设置为FFFFFFFFFFFE。
memcpy(et_header.eh_dst,d_Mac,6);
et_header.eh_type=htons(0x0806); //类型为0x0806表示这是ARP包
arp_header.arp_hdr=htons(0x0001); //硬件地址类型以太网地址
arp_header.arp_pro=htons(0x0800); //协议地址类型为IP协议
arp_header.arp_hln=6; //硬件地址长度为6
arp_header.arp_pln=4; //协议地址长度为4
arp_header.arp_opt=htons(0x0001); //标识为ARP请求
arp_header.arp_spa=inet_addr("172.24.21.10"); //"172.24.21.10"是我测试程序所用的本地机的IP,测试者应将其改为测试机IP
memcpy(arp_header.arp_sha,et_header.eh_src,6);
arp_header.arp_tpa=inet_addr(argv[1]);
memcpy(arp_header.arp_tha,et_header.eh_dst,6);
发送数据包:
lpPacket=PacketAllocatePacket(); //给PACKET结构指针分配内存
PacketInitPacket(lpPacket,buffer,512); //初始化PACKET结构指针
PacketSetNumWrites(lpAdapter,5); //设置发送次数
PacketSendPacket(lpAdapter,lpPacket,TRUE);//发送ARP请求包
最后别忘了扫尾工作:
PacketFreePacket(lpPacket); //释放PACKET结构指针
PacketCloseAdapter(lpAdapter); //关闭适配器
最后是监听线程,设置接收数据包的系列参数:
PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_DIRECTED); //设置网卡为直接模式
PacketSetBuff(lpAdapter,1024); //设置网卡接收数据包的缓冲区大小
PacketSetReadTimeout(lpAdapter,2); //设置接收到一个包后的"休息"时间
接收数据包:
PacketReceivePacket(lpAdapter, lpPacket, TRUE); //接收数据包
对数据包进行分析,以得出结论:
char *buf;
bpf_hdr *lpBpfhdr;
ET_HEADER *lpEthdr;
in_addr addr={0};
buf=(char *)lpPacket->Buffer;
lpBpfhdr=(bpf_h
- 黑客实例讲解木马的分析方法! (01-16)
- 介绍几款黑客常用工具使用方法(01-23)
- ADSL用户如何防止路由器遭受黑客攻击(04-24)
- 抵御网页攻击 快速解决iFrame漏洞问题(05-26)
- 攻防技术 网络防火墙防范溢出策略(06-23)
- 简单方法查找黑客老巢(07-01)