VC++實現資料包過濾(防火牆原理)

來源:互聯網
上載者:User

#include "stdafx.h"
#include "xpktfilter.h"
#include "xpktfilterDlg.h"
#include "./xpktfilterdlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma comment(lib,"iphlpapi.lib")

// CxpktfilterDlg 對話方塊

 

CxpktfilterDlg::CxpktfilterDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CxpktfilterDlg::IDD, pParent)
{
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CxpktfilterDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CxpktfilterDlg, CDialog)
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 //}}AFX_MSG_MAP
 ON_BN_CLICKED(IDOK, OnBnClickedOk)
 ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
 
END_MESSAGE_MAP()

// CxpktfilterDlg 訊息處理常式

BOOL CxpktfilterDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // 設定此對話方塊的表徵圖。當應用程式主視窗不是對話方塊時,架構將自動
 //  執行此操作
 SetIcon(m_hIcon, TRUE);   // 設定大表徵圖
 SetIcon(m_hIcon, FALSE);  // 設定小表徵圖

 ShowWindow(SW_MINIMIZE);

 // TODO: 在此添加額外的初始化代碼
 
 return TRUE;  // 除非設定了控制項的焦點,否則返回 TRUE
}

// 如果向對話方塊添加最小化按鈕,則需要下面的代碼
//  來繪製該表徵圖。對於使用文檔/視圖模型的 MFC 應用程式,
//  這將由架構自動完成。

void CxpktfilterDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // 用於繪製的裝置上下文

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // 使表徵圖在工作矩形中置中
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // 繪製表徵圖
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

//當使用者拖動已最小化的視窗時系統調用此函數取得游標顯示。
HCURSOR CxpktfilterDlg::OnQueryDragIcon()
{
 return static_cast<HCURSOR>(m_hIcon);
}

void CxpktfilterDlg::OnBnClickedOk()
{
 PfCreateInterface(0,
                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
                     FALSE,
                     TRUE,
                     &hInterface);

    // 綁定需要網路包過濾的IP地址
 
 BYTE localIp[]={127,0,0,1};
 /********************************************************************
 這裡可以用代碼實現自動獲得本機IP,由於時間關係,留下這個問題給讀者自己研究,
 不便之處請原諒。
 
 
 *********************************************************************/
    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
    // 現在我們開始過濾HTTP協議的的介面
   
    // 填充過濾包的規則結構
    PF_FILTER_DESCRIPTOR inFilter;
    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添這個值
    inFilter.dwRule = 0; //一直添這個值
    inFilter.pfatType = PF_IPV4; //用 ipV4 地址
    inFilter.SrcAddr = localIp; //設定本地IP地址
 
    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意來源連接埠
    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
    inFilter.DstAddr = 0; //任意目標地址
    inFilter.DstMask = 0;
    inFilter.wDstPort = FILTER_TCPUDP_PORT_ANY; //任意目標連接埠
    inFilter.wDstPortHighRange =FILTER_TCPUDP_PORT_ANY;
    inFilter.dwProtocol = FILTER_PROTO_TCP; // 過濾的協議,可選FILTER_PROTO_ICMP
    // 加入一個過濾介面
    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
}

void CxpktfilterDlg::OnBnClickedButton1()
{
PfRemoveFilterHandles(hInterface, 1, &fHandle);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.