ARPRulePage.cpp
上传用户:zhuzhu0204
上传日期:2020-07-13
资源大小:13165k
文件大小:6k
开发平台:

Visual C++

  1. // ARPRulePage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "myfirewall.h"
  5. #include "ARPRulePage.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. int nThreadCounts = 0;
  12. int nMaxThreadCounts = 200;
  13. BOOL bIsARPRuleOpened = FALSE;
  14. ARPRule *pARPRuleList, *pARPRuleElem;
  15. DWORD WINAPI GetArpTableSubThread(LPVOID lpParam)
  16. {
  17. ULONG *p = (ULONG *)lpParam;
  18. ULONG ulIP = htonl(*p);
  19. // 发送ARP请求
  20. unsigned char arDestMac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  21. ULONG ulLen = 6;
  22. ULONG ulRet = ::SendARP(ulIP, 0, (ULONG *)arDestMac, &ulLen);
  23. if (ulRet == NO_ERROR)
  24. {
  25. ARPRule *pNew = new ARPRule;
  26. in_addr in;
  27. in.S_un.S_addr = ulIP;
  28. pNew->ucIP[0] = in.S_un.S_un_b.s_b1;
  29. pNew->ucIP[1] = in.S_un.S_un_b.s_b2;
  30. pNew->ucIP[2] = in.S_un.S_un_b.s_b3;
  31. pNew->ucIP[3] = in.S_un.S_un_b.s_b4;
  32. memcpy(pNew->ucMac, arDestMac, sizeof(arDestMac));
  33. pNew->pNext = NULL;
  34. /* if (pARPRuleList == NULL)
  35. {
  36. pARPRuleList = pNew;
  37. pARPRuleElem = pNew;
  38. else
  39. */ {
  40. pARPRuleElem->pNext = pNew;
  41. pARPRuleElem = pNew;
  42. }
  43. }
  44. nThreadCounts --;
  45. return ERROR_SUCCESS;
  46. }
  47. DWORD WINAPI GetArpTableThread(LPVOID lpParam)
  48. {
  49. CARPRulePage *pARPRulePage = (CARPRulePage *)lpParam;
  50. ULONG ulLocalIP; // 本机IP地址
  51. ULONG ulMask; // 子网掩码
  52. PIP_ADAPTER_INFO pAdapterInfo = NULL; // 适配器相关信息
  53. ULONG ulLen = 0;
  54. // 为适配器结构申请内存
  55. GetAdaptersInfo(pAdapterInfo, &ulLen);
  56. pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, ulLen);
  57. // 取得本机适配器结构信息
  58. if (GetAdaptersInfo(pAdapterInfo, &ulLen) == ERROR_SUCCESS)
  59. {
  60. if (pAdapterInfo != NULL)
  61. {
  62. ulLocalIP = inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
  63. ulMask    = inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
  64. }
  65. }
  66. ULONG ulStartIP = ntohl(ulLocalIP) & ntohl(ulMask); // 局域网起始IP
  67. ULONG ulEndIP   = ntohl(ulLocalIP) | (ntohl(ulMask) ^ 0xFFFFFFFF); // 局域网终止IP
  68. ULONG *pIP = new ULONG[ulEndIP - ulStartIP];
  69. for (ULONG i=ulStartIP; i<=ulEndIP; i++)
  70. {
  71. pIP[i-ulStartIP] = i;
  72. }
  73. // 保存本机IP地址和MAC到规则链表头节点处
  74. // IP地址
  75. in_addr in;
  76. in.S_un.S_addr = ulLocalIP;
  77. pARPRuleList->ucIP[0] = in.S_un.S_un_b.s_b1;
  78. pARPRuleList->ucIP[1] = in.S_un.S_un_b.s_b2;
  79. pARPRuleList->ucIP[2] = in.S_un.S_un_b.s_b3;
  80. pARPRuleList->ucIP[3] = in.S_un.S_un_b.s_b4;
  81. // MAC
  82. pARPRuleList->ucMac[0] = pAdapterInfo->Address[0];
  83. pARPRuleList->ucMac[1] = pAdapterInfo->Address[1];
  84. pARPRuleList->ucMac[2] = pAdapterInfo->Address[2];
  85. pARPRuleList->ucMac[3] = pAdapterInfo->Address[3];
  86. pARPRuleList->ucMac[4] = pAdapterInfo->Address[4];
  87. pARPRuleList->ucMac[5] = pAdapterInfo->Address[5];
  88. pARPRuleList->pNext = NULL;
  89. for (i=0; i<ulEndIP-ulStartIP; i++)
  90. {
  91. while (nThreadCounts > nMaxThreadCounts)
  92. {
  93. Sleep(10);
  94. }
  95. DWORD dwThreadId;
  96. if (CreateThread(NULL, 0, GetArpTableSubThread, &pIP[i], 0, &dwThreadId) != NULL)
  97. {
  98. nThreadCounts ++;
  99. }
  100. }
  101. // 确保所有的线程都已经结束
  102. while (nThreadCounts > 0);
  103. int nIndex = 0;
  104. for (ARPRule *p=pARPRuleList->pNext; p!=NULL; p=p->pNext)
  105. {
  106. CString strTemp;
  107. USES_CONVERSION;
  108. strTemp.Format(L"%d.%d.%d.%d", (p->ucIP[0]), (p->ucIP[1]), (p->ucIP[2]), (p->ucIP[3]));
  109. int nItem = pARPRulePage->m_ARPRuleList.InsertItem(nIndex, strTemp);
  110. UCHAR arDestMask[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  111. UCHAR *s = p->ucMac;
  112. strTemp.Format(L"%02X-%02X-%02X-%02X-%02X-%02X", s[0],s[1],s[2],s[3],s[4],s[5]);
  113. pARPRulePage->m_ARPRuleList.SetItemText(nItem, 1, strTemp);
  114. nIndex++;
  115. }
  116. // 将ARP规则应用到核心层
  117. PtSetARPRules(bIsARPRuleOpened);
  118. return ERROR_SUCCESS;
  119. }
  120. /////////////////////////////////////////////////////////////////////////////
  121. // CARPRulePage property page
  122. IMPLEMENT_DYNCREATE(CARPRulePage, CPropertyPage)
  123. CARPRulePage::CARPRulePage() : CPropertyPage(CARPRulePage::IDD)
  124. {
  125. //{{AFX_DATA_INIT(CARPRulePage)
  126. // NOTE: the ClassWizard will add member initialization here
  127. //}}AFX_DATA_INIT
  128. }
  129. CARPRulePage::~CARPRulePage()
  130. {
  131. }
  132. void CARPRulePage::DoDataExchange(CDataExchange* pDX)
  133. {
  134. CPropertyPage::DoDataExchange(pDX);
  135. //{{AFX_DATA_MAP(CARPRulePage)
  136. DDX_Control(pDX, IDC_ARP_RULE_LIST, m_ARPRuleList);
  137. //}}AFX_DATA_MAP
  138. }
  139. BEGIN_MESSAGE_MAP(CARPRulePage, CPropertyPage)
  140. //{{AFX_MSG_MAP(CARPRulePage)
  141. ON_BN_CLICKED(IDC_RADIO_OPEN, OnRadioOpen)
  142. ON_BN_CLICKED(IDC_RADIO_CLOSE, OnRadioClose)
  143. //}}AFX_MSG_MAP
  144. END_MESSAGE_MAP()
  145. /////////////////////////////////////////////////////////////////////////////
  146. // CARPRulePage message handlers
  147. BOOL CARPRulePage::OnInitDialog() 
  148. {
  149. CPropertyPage::OnInitDialog();
  150. // TODO: Add extra initialization here
  151. m_ARPRuleList.InsertColumn(0,L"IP地址",LVCFMT_LEFT,200,-1);
  152. m_ARPRuleList.InsertColumn(1,L"MAC地址", LVCFMT_LEFT, 200, -1);
  153. m_ARPRuleList.ModifyStyle(LVS_TYPEMASK,LVS_REPORT);
  154. m_ARPRuleList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  155. bIsARPRuleOpened = TRUE;
  156. CheckRadioButton(IDC_RADIO_CLOSE, IDC_RADIO_OPEN, IDC_RADIO_OPEN);
  157. pARPRuleList = new ARPRule;
  158. pARPRuleElem = pARPRuleList;
  159. DWORD dwThreadId;
  160. m_hThread = CreateThread(NULL, 0, GetArpTableThread, this, 0, &dwThreadId);
  161. return TRUE;  // return TRUE unless you set the focus to a control
  162.               // EXCEPTION: OCX Property Pages should return FALSE
  163. }
  164. void CARPRulePage::OnRadioOpen() 
  165. {
  166. // TODO: Add your control notification handler code here
  167. bIsARPRuleOpened = TRUE;
  168. PtSetARPRules(bIsARPRuleOpened);
  169. // 保存日志文件
  170. SaveLogFile("开启ARP攻击防范。");
  171. }
  172. void CARPRulePage::OnRadioClose() 
  173. {
  174. // TODO: Add your control notification handler code here
  175. bIsARPRuleOpened = FALSE;
  176. PtSetARPRules(bIsARPRuleOpened);
  177. // 保存日志文件
  178. SaveLogFile("关闭ARP攻击防范。");
  179. }