利用WinPcap技術捕獲資料包
阿新 • • 發佈:2019-01-06
5、主要原始碼
根據用 Windows 分組捕獲庫 WinPcap 提供功能首先要初始化兩個結構體,一個是介面卡的結構體 LpAdapter, 一個是存放接收到的資料包的結構體 RecvPacket。
使用 Packet.dll 動態連線庫編寫原始碼:
#define MAX__LINK__NAME__LENGTH 64
介面卡結構:
typedef struct__ADAPTER
{
HANDLE hFile;
TCHAR Symboliclink[MAX__LINK__NAME__LENGTH];
Int NumWrites;
} ADAPTER , *LPADAPTER;
說明:hFile 是一個指向該網路介面卡 Handle 的指標,通過它可以對網路介面卡進行操作。symboliclink 包含當前開啟的網路介面卡的名字。
資料包結構:
typedef struct _PACKET
{
HANDLE hEvent;
OVERLAPPED OverLapped;
PVOID Buffer;
UINT Length;
PVOID Next;
UINT ulBytesReceived;
BOOLEAN bloComplete; //控制接受包的開始和結束
資料包捕獲實現的步驟的主要原始碼:
1)要獲得介面卡列表。
#define Max__Num__Adapter 10 //獲得介面卡列表
char Adapterlist [Max__Num__Adapter[512]]
int i=0
char AdapterNames[512], *tempa,*templa;
ULONG AdapterLength=1024; } PACKET, *LPPACKET:
2)獲得系統中網路介面卡的名字。
PacketGetAdapterNames(AdapterNamea,&AdapterLength);
tempa=AdapterNamea;
templa=Adapternamea;
while ((*tempa!=’’)∣∣(*tempa-1!=’))
{
if (*tempa= =’’)
{
memcpy(AdapterList[i],temla,tempa-templa); //記憶體資料拷貝
templa=tempa+1;
i++
}
tempa++
}
3)從介面卡列表中選擇一個預設的 0 號介面卡。
LPADAPTER lpAdapter
lpAdapter = PacketOpenAdapter (AdapterList[0]);
if (!lpAdapter∣∣(lpAdapter->hFile==INVALID__HANDLE__VALUE))
{
dwErrorCode=GetLastError();
return FALSE;
}
4)將所選擇的介面卡 lpAdapter 設定為混雜模式。
PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)
5)設定 BPF 核心中包過濾的過濾器的代參政。利用這個函式右以完成對於原始資料包的初始的過濾處理,如根據其中埠號、IP 地址等。
PacketSetBpf(LpAdapter AdapterObject,structbpf_program*fp)
6)設定緩衝池為512K位元組。
PacketSetBuff(lpAdapter,512000);
7)分配一個數據包物件,並連線已分配的緩衝。
PacketInitPacket(lpPacket,(char*)bufferReceive,512000);
8)捕獲多個數據包。從網絡卡 lpAdapter 接收資料包,並將資料包放入 lpPacket所指向的資料包結構體中,若接收成功返回 TRUE,否則返回 FALSE。
PacketReceivePacket(lpAdapter,lpPacket,TRUE);
9)通過觸發回撥函式,把捕獲符合過濾器規則的資料包轉發給網路協議分析模組進行分析處理。
10) 結束接收資料包,釋放資料包物件。
if(lpPacket!=NULL
{
PacketFreePacket(lpPacket);
lpPacket=NULL;
}
11)關閉網絡卡裝置,將網絡卡恢復到正常接收狀態。
if(lpAdapter!=NULL
{
PacketCloseAdapter(lpAdapter);
lpAdapter=NULL;
}
根據用 Windows 分組捕獲庫 WinPcap 提供功能首先要初始化兩個結構體,一個是介面卡的結構體 LpAdapter, 一個是存放接收到的資料包的結構體 RecvPacket。
使用 Packet.dll 動態連線庫編寫原始碼:
#define MAX__LINK__NAME__LENGTH 64
介面卡結構:
typedef struct__ADAPTER
{
HANDLE hFile;
TCHAR Symboliclink[MAX__LINK__NAME__LENGTH];
Int NumWrites;
} ADAPTER , *LPADAPTER;
說明:hFile 是一個指向該網路介面卡 Handle 的指標,通過它可以對網路介面卡進行操作。symboliclink 包含當前開啟的網路介面卡的名字。
資料包結構:
typedef struct _PACKET
{
HANDLE hEvent;
OVERLAPPED OverLapped;
PVOID Buffer;
UINT Length;
PVOID Next;
UINT ulBytesReceived;
BOOLEAN bloComplete; //控制接受包的開始和結束
資料包捕獲實現的步驟的主要原始碼:
1)要獲得介面卡列表。
#define Max__Num__Adapter 10 //獲得介面卡列表
char Adapterlist [Max__Num__Adapter[512]]
int i=0
char AdapterNames[512], *tempa,*templa;
ULONG AdapterLength=1024; } PACKET, *LPPACKET:
2)獲得系統中網路介面卡的名字。
PacketGetAdapterNames(AdapterNamea,&AdapterLength);
tempa=AdapterNamea;
templa=Adapternamea;
while ((*tempa!=’’)∣∣(*tempa-1!=’))
{
if (*tempa= =’’)
{
memcpy(AdapterList[i],temla,tempa-templa); //記憶體資料拷貝
templa=tempa+1;
i++
}
tempa++
}
3)從介面卡列表中選擇一個預設的 0 號介面卡。
LPADAPTER lpAdapter
lpAdapter = PacketOpenAdapter (AdapterList[0]);
if (!lpAdapter∣∣(lpAdapter->hFile==INVALID__HANDLE__VALUE))
{
dwErrorCode=GetLastError();
return FALSE;
}
4)將所選擇的介面卡 lpAdapter 設定為混雜模式。
PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)
5)設定 BPF 核心中包過濾的過濾器的代參政。利用這個函式右以完成對於原始資料包的初始的過濾處理,如根據其中埠號、IP 地址等。
PacketSetBpf(LpAdapter AdapterObject,structbpf_program*fp)
6)設定緩衝池為512K位元組。
PacketSetBuff(lpAdapter,512000);
7)分配一個數據包物件,並連線已分配的緩衝。
PacketInitPacket(lpPacket,(char*)bufferReceive,512000);
8)捕獲多個數據包。從網絡卡 lpAdapter 接收資料包,並將資料包放入 lpPacket所指向的資料包結構體中,若接收成功返回 TRUE,否則返回 FALSE。
PacketReceivePacket(lpAdapter,lpPacket,TRUE);
9)通過觸發回撥函式,把捕獲符合過濾器規則的資料包轉發給網路協議分析模組進行分析處理。
10) 結束接收資料包,釋放資料包物件。
if(lpPacket!=NULL
{
PacketFreePacket(lpPacket);
lpPacket=NULL;
}
11)關閉網絡卡裝置,將網絡卡恢復到正常接收狀態。
if(lpAdapter!=NULL
{
PacketCloseAdapter(lpAdapter);
lpAdapter=NULL;
}