一个基于原始套接字的嗅探器
副标题#e#
嗅探器这个代码我去年的时候就已经写过了,这个学期并不长短常忙,顺手温习网络,就又实验着写了一遍。
其实在写嗅探器的时候,最主要的照旧要将网卡配置为稠浊模式。在此基本之上,对抓到的数据包举办阐明。
这个是我写出来的结果图,今朝只是利便于查察,连菜单都没添加:
左面的界面显示的是主机和主机之间的链接信息,而右面则是选中主机信息之间的数据交互环境。
我以为我这个嗅探器应该是个失败品,可能说,没可以或许真正的将网卡配置为稠浊模式。因为可以看到,上面的源地点全部都是当田主机地点,我在下载视频文件的时候,每秒几百kb的数据交互我的这个措施根基没响应。网页信息也都是发送的数据请求,基础抓不到吸收数据。对付这一点但愿好手能帮我指点一下。
利用原始套接字写嗅探器的流程:
1 利用socket建设基于IP协议的原始套接字。
2 获取当地IP地点。
3 将原始套接字绑定到当地IP地点上。
4 利用ioctlsocket函数配置套接字选项SIO_RCVALL,即接管所有数据。
5 无尽挪用recv函数。
#p#副标题#e#
为了利便界面化我将Sniffer的焦点代码封装到了一个类中,原本应该做成单件类的,可是懒得改了。
class CSniffer { public: static DWORD WINAPI SnifferThread(LPVOID lpData);//线程函数 public: CSniffer(HostArray * pOutPut);//结构函数,数据输出指针 ~CSniffer(void);//析构函数,认真终止线程 DWORD IsSucceed();//判定结构函数是否乐成,我代码中没用上,就是纯真的返回dwSucceed private://Method int IPHeadAnylasis(const char * pRecvBuf, const int nLen);//将IP数据存放到对应数据布局中。 unsigned short q_ntohs(const unsigned short nVal);//之前的遗留代码,没用上 const char * TypeTell(unsigned char type);//同上 unsigned short CheckSum(const void * pData, int size);//校验和函数,可以用一下,可是我没检讨 void AddToInfoVector(PPortArray pInfoVector, ip_hdr * pIp, int nLen);//添加新的端口信息 private://Data PHostArray pSnifferPool;//指向输出数据,全部的信息都存在其指向 HANDLE hThread;//线程句柄 DWORD dwSucceed;//标示参数 };
然后值得看一看的就是线程函数代码了,其余的没有太多需要先容的,这段代码其实就是从之前的节制台措施扒下来的,此刻单独放到一个函数中。
DWORD WINAPI CSniffer::SnifferThread(LPVOID lpData) { CSniffer * pSniffer = (CSniffer *)lpData; SOCKET hSnifferSock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); DWORD dwSetVal = 1; char szhostname[32]; char RecvBuff[65536]; hostent * phost; SOCKADDR_IN LocalIP; //先举办绑定,绑定前先获取当地地点 LocalIP.sin_family = AF_INET; LocalIP.sin_port = htons(0); gethostname(szhostname, 32); phost = gethostbyname(szhostname); memcpy(&LocalIP.sin_addr.S_un.S_addr, phost->h_addr_list[0], phost->h_length); //cout << "LocalIP" << inet_ntoa(LocalIP.sin_addr) << endl; if(SOCKET_ERROR == bind(hSnifferSock, (sockaddr *)&LocalIP, sizeof(sockaddr))) { ;//cout << "bind error" << endl; } //配置套接字选项 ioctlsocket(hSnifferSock, SIO_RCVALL, &dwSetVal); //cout << q_ntohs(0x3100) << endl; //std::vector<ConnectBetweenTwoHost> SnifferPool; while(1) { int nRecvLen = recv(hSnifferSock, RecvBuff, 65536, 0); if(nRecvLen != SOCKET_ERROR) { //cout << "Get Message" << endl; pSniffer->IPHeadAnylasis(RecvBuff, 65536); } else { continue;//cout << "Nothing Valid" << endl; } } return 0; }
感受这一套下来却是是没什么对象,不外我也是在措施跑出来之后,才调查到我的这个措施在数据抓包上面真心做的不怎么样。chrome欣赏器的数据请求能抓到,可是反馈返来的数据就完全抓不到了。
列表数据原本应该做个排序的,整个散列也不错,这样当数据量较量大的时候插入效率能高一点。而我这个就呵呵了。。。
值得一提的就是我这次两个列表全部利用的虚拟列表。利用之前还查察了我以前代码中关于ListCtrl的利用文档,这算是没白写。不外这里要增补的就是,利用虚拟列表前,需要配置ownerdata选项,也等于用户拥有数据,列表仅仅认真数据的显示,而不是把所有的数据都放到列表中。
对虚拟列表举办显示刷新的要领较量简朴,只要挪用SetItemCountEx就能实现刷新进程。
#p#分页标题#e#
别的我昨天在网上下载了一个嗅探器,这叫一个惨啊,各类弹网页,预计此刻电脑是出于中木马状态。厥后措施好不容易跑起来了,功效和我这个差不多,就是能判定出来网页请求信息资源的范例,仅仅是比我阐明的深入了一点,至于数据吸收,也是没找到。假如您知道哪有较量好的嗅探器,贫苦给发个链接,我进修下。
别的关于网卡稠浊模式配置貌似需要借助winpcap.dll的辅佐,有没有大神较量相识,给个进修链接往我看一下。