您的位置:首页 > 其它

【WinPcap】自制抓包+分析+ARP攻击(三)

2015-04-23 08:10 113 查看


【WinPcap】自制抓包+分析+ARP攻击

扫描网内主机

继续接着昨天的来,今天就能搞定。



先来看一下对网内活动主机的扫描。我的大体思路是:对网段内所有IP发送ARP包,根据收到的响应来判断是否有活动主机,并作记录。这一点其实不难,仔细认真地遍历网段内主机IP,用一个线程额外接受ARPreply响应包,并做解析就可以了。我觉得难就难在网关的确定,子网掩码的确定,本机mac、IP的确定。只有知道了这三点,我们才能做到正确发包,正确收包,正确遍历本网段内的所有主机。

获取本机信息

本段内容位于ScanHostDlg.cpp

/*  在当初初始化适配器的指针中获取IP和netmask  */
pcap_addr *paddr = adp_info.usedDevs->addresses;
for (; paddr; paddr = paddr->next) {
if (paddr->addr->sa_family != AF_INET)   //只要IPV4
continue;
if (paddr->addr)
g_localip = ntohl(((struct sockaddr_in *)paddr->addr)->sin_addr.s_addr);
if (paddr->netmask)
g_netmask = ntohl(((struct sockaddr_in *)paddr->netmask)->sin_addr.s_addr);
}
在这里需要注意的是,主机可用有多个适配器,每个适配器可能包含多个IP协议和地址,所以在这里需要选中自己一直在用的适配器,遍历直到找到其中我们需要的IP信息和netmask信息。

获取网关信息

WSADATA wsadata;
char buff[20] = "find mac!";
unsigned long destIP = inet_addr("9.2.0.5");//利用非本网段IP

//提前开启接受线程
_beginthread(recvThread, 0, (void*)this);
WSAStartup(MAKEWORD(2, 2, ), &wsadata);
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
int err = GetLastError();
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
addr.sin_addr.S_un.S_addr = destIP;

sendto(sock, buff, strlen(buff), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
Sleep(2000);
这里就是所说的,用UPD查找网关信息和我本机的MAC地址(可能有其他更好的方法……我就挑了一种用,还得努力学习)。接下来就是对网内主机发ARP包,用另一个线程查看你是否有响应。(可以看源码,等会儿放上链接)。

自制包(ARP欺骗)



好吧,我交代,最初就是看上这个ARP欺骗才想做的,然后了解了之后就想多了解些协议,就做了这个小工具,这是我最初的动机。

知道ARP欺骗么?其实就是利用ARP的响应请求,绑定假的MAC和IP,一直发给被欺骗对象,直到它刷新自己的ARP缓存。这样一说是不是很简单啦?比如你要欺骗MAC为12-34-56-78-90-22,IP为192.168.1.100的家伙,告诉它你是网关(192.168.1.1)那么,你要做的无非就是在ARP数据报中的“发送硬件地址”设为你的MAC,“发送着IP”设为192.168.1.1,把操作码设为0x0002(响应),然后一直发给被欺骗对象。

对于上述问题,我相信你看到这里已经没问题了,剩下的就是鲁棒性和友好性了。交给你去完善吧!

感想

作为一个大三的学生,接触了编程一年了,我觉得应该敢想敢做,当然技术和知识依旧需要好好积累,加油。

源码

Pain is in your mind.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: