抓包工具源碼
1. npcap是什麼軟體
網路數據包抓包工具。
npcap是一個網路數據包抓包工具,是WinPcap的改進版;它支持NDIS 6技術、「只允許管理員Administrator」訪問Npcap、與WinPcap兼容或並存兩種模式;支持Windows平台的回環數據包採集和發送。
發展。
Npcap 項目是最初 2013 年由 Nmap 網路掃描器項目(創始人 Gordon Lyon)和北京大學羅楊博士發起,由 Google 公司的 Summer of Code 計劃贊助的一個開源項目,遵循 MIT 協議(與 WinPcap 一致)。
Npcap 基於 WinPcap 4.1.3 源碼基礎上開發,支持 32 位和 64 位架構,在 Windows Vista 以上版本的系統中,採用 NDIS 6 技術的 Npcap 能夠比原有的 WinPcap 數據包(NDIS 5)獲得更好的抓包性能,並且穩定性更好。
2. 抓包指的是什麼
抓包(packet capture)就是將網路傳輸發送與接收的數據包進行截獲、重發、編輯、轉存等操作,也用來檢查網路安全。此外,抓包也經常被用來進行數據截取等。
每一個在區域網(LAN)上的工作站都有其硬體地址,這些地址惟一地表示了網路上的機器(這一點與Internet地址系統比較相似)。當用戶發送一個數據包時,如果為廣播包,則可達到區域網中的所有機器,如果為單播包,則只能到達處於同一碰撞域中的機器。
在一般情況下,網路上所有的機器都可以「聽」到通過的流量,但對不屬於自己的數據包則不予響應。如果某個工作站的網路介面處於混雜模式,那麼它就可以捕獲網路上所有的數據包和幀。
(2)抓包工具源碼擴展閱讀:
抓包使用的工具:
抓包工具是攔截查看網路數據包內容的軟體。通過對抓獲的數據包進行分析,可以得到有用的信息。目前流行的抓包工具有很多,比較出名的有wireshark、sniffer、httpwatch、iptool等。
這些抓包工具功能各異,但基本原理相同。計算機通過向網路上傳和從網路下載一些數據包來實現數據在網路中的傳播。通常這些數據包會由發出或者接受的軟體自行處理,普通用戶並不過問,這些數據包一般也不會一直保存在用戶的計算機上。
抓包工具可以幫助人們將這些數據包保存下來,如果這些數據包是以明文形式進行傳送或者我們能夠知道其加密方法,那麼我們就可以分析出這些數據包的內容以及它們的用途。
目前抓包工具更多的用於網路安全,比如查找感染病毒的計算機。有時也用於獲取網頁的源代碼,以及了解攻擊者所用方法、追查攻擊者的ip地址等。
參考資料來源:網路-抓包
3. 易語言,ce 抓包工具 有了這三個能不能做cf掛, ce查找修改內存,抓包無視320 能不能
易語言應該不能改cf吧
4. 電腦是怎麼抓包的
抓包,就是通過軟體,檢測網卡所流通的數據。
數據並不是像水一樣不停的傳輸的,而是分成一個包一個包的,每個數據包都有包頭,包頭內記錄著發送方的ip 埠 接受方的ip 埠 以及數據包所使用的協議等等。
包頭之後,才是我們要傳輸的數據,分析軟體就會將數據包由10組成的二進制流翻譯為我們可以看懂的東西。
像sniffer這種強大的軟體,可以直接將圖片都顯示出來。網管必備,在他檢測下,他所在網路內的網路活動都可以被檢測到。
但是隨著保密意識的增加,很多網路活動都加密了。幾個月前的網路知道登陸是不用加密,如果我用檢測軟體檢測你的電腦,我抓包,就有可能抓到你的賬號密碼,現在不能了,已經加密了,我抓到也只是亂碼。
(4)抓包工具源碼擴展閱讀:
抓包工具
抓包工具是攔截查看網路數據包內容的軟體。通過對抓獲的數據包進行分析,可以得到有用的信息。
目前流行的抓包工具有很多,比較出名的有wireshark、sniffer。httpwatch、iptool等。這些抓包工具功能各異,但基本原理相同。
我們的計算機通過向網路上傳和從網路下載一些數據包來實現數據在網路中的傳播。通常這些數據包會由發出或者接受的軟體自行處理,普通用戶並不過問,這些數據包一般也不會一直保存在用戶的計算機上。
抓包工具可以幫助我們將這些數據包保存下來,如果這些數據包是以明文形式進行傳送或者我們能夠知道其加密方法,那麼我們就可以分析出這些數據包的內容以及它們的用途。
目前抓包工具更多的用於網路安全,比如查找感染病毒的計算機。有時也用於獲取網頁的源代碼,以及了解攻擊者所用方法、追查攻擊者的ip地址等。
5. C#.C/C++.net抓包抓網路協議包(WinPcap),該如何編寫,求源碼,求注釋,求指教!
您好,要添加一個預處理定義,你需要打開Project菜單,選擇Settings,然後選擇C/C++選項卡,在General類下,你必須在Preprocessor
Definitions下的文本框中添加定義。
要在一個VC++6.0工程中,添加一,個新的庫,你必須打開Project菜單,選擇Settings,然後選擇Link選項卡,然後把新庫的名字添加到Object/Library
moles下的文本框中
要向VC++6.0中添加一個新的庫所在的路徑,你必須打開Tool菜單,選擇Options,然後選擇Directories選項卡,在Show
directories下拉框中選擇Library
files,並且將新的路徑添加到Directories中去
要向VC++6.0中添加一個新的包含文件所在的路徑,你必須打開Tool菜單,選擇Options,然後選擇Directories選項卡,在Show
directories下拉框中選擇Include
files,並且將新的路徑添加到Directories中去
范常式序
我們一共了一些范常式序來顯示WinPcap API的用法。這些程序的源代碼,以及編譯運行這些代碼所需的所有文件,都可以在 Developer's
Pack找到。作為教程,在這里,我們提供了瀏覽器式的代碼:這樣,在每個函數和變數之間的跳轉會比較方便。更多完整的范常式序,請參閱 WinPcap
教程.
// NOTE: remember to include WPCAP and HAVE_REMOTE among
your preprocessor
definitions.
(工程->設置->c/c++->預處理程序定義
中添加WPCAP和HAVE_REMOTE)
如果連接有問題,把lib復制到工程目錄下用下面方法:
#pragma
comment(lib,"wpcap.lib")
#pragma comment(lib,"packet.lib")
6. java程序 求抓包程序源代碼!!
package com.daidai.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
Configuration conf=new Configuration().configure();
sessionFactory=conf.buildSessionFactory();
return sessionFactory;
}
public static void setSessionFactory(SessionFactory sessionFactory) {
HibernateUtil.sessionFactory = sessionFactory;
}
public static Session getSession(){
return sessionFactory.openSession();
}
}
package com.daidai.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
public class Util {
private static String Cellphone_Number;
private static String Cellphone_Number1;
private static String Cellphone_Number2;
private static String Fasten_Telephone;
private static String Fasten_Telephone2;
private static String name;
private static String remarks;
public static Sheet rs;
public Util(){}
static{
try{
Workbook rwb=Workbook.getWorkbook(new File("Book1.xls"));
rs=rwb.getSheet(0);
int count=rs.getColumns();
System.out.println(count);
int count1=rs.getRows();
System.out.println(count1);
//獲取第一行,第一列的值
//count1行
//count列
for(int i=0;i<count1;i++){
for(int j=0;j<count;j++){
Cell c00 = rs.getCell(j, i);
String strc00 = c00.getContents();
//獲取第一行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();
System.out.println(strc00);
System.out.println(strc10);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[]args){
Util u=new Util();
}
}
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class"
>com.mysql.jdbc.Driver</property>
<property name="connection.url"
>jdbc:mysql://127.0.0.1:3306/test</property>
<property name="connection.username"
>root</property>
<property name="connection.password"
>daidai</property>
<!-- SQL dialect 資料庫方言-->
<property name="dialect"
>org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping resource="User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.daidai.entity">
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" type="java.lang.String" length="15"/>
<property name="Cellphone_Number" type="java.lang.String" length="11"/>
<property name="Cellphone_Number1" type="java.lang.String" length="11"/>
<property name="Cellphone_Number2" type="java.lang.String" length="11"/>
<property name="Fasten_Telephone" type="java.lang.String" length="11"/>
<property name="Fasten_Telephone2" type="java.lang.String" length="11"/>
<property name="remarks" type="java.lang.String"/>
</class>
</hibernate-mapping>
package com.daidai..impl;
import com.daidai.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import com.daidai..UserDAO;
import com.daidai.entity.User;
public class UserDAOImpl implements UserDAO {
public Session session=null;
public void save(User user) {
try {
session=HibernateUtil.getSession();
session.getTransaction().begin();
session.save(user);
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
e.printStackTrace();
throw e;
}
}
}
package com.daidai.;
import com.daidai.entity.User;
public interface UserDAO {
public void save(User user);
}
7. 易語言怎麼在網頁的編輯框上寫文本,怎麼提取網頁源碼,我知道是F12但是不知道應該選哪個,哪位師傅願
如果是提取網頁源碼的話,其實是http讀文件這個命令啊。這個返回的就是網頁的位元組集,你用到文本命令就可以讀取到了。
其實易語言都是通過F12的抓包工具直接進行抓包的。例如QQ注冊,直接抓取提交的那個數據包就行了,你直接用程序模擬這個數據包格式就可以進行QQ注冊了。F12開發者工具這個哪個瀏覽器都有的,一般都是用httpwatch這個工具進行抓包的。如果是普通的瀏覽器裡面可能是英文的。建議你下載遨遊瀏覽器,內置的開發者工具是中文的,比較容易看。當然了。想要詳細的數據還是用httpwatch這個工具進行抓包。
自動填表也是可以的,不過不是在瀏覽器裡面填寫,一般都是用超文本瀏覽框,然後用精易模塊裡面的命令填寫超文本瀏覽框裡面的網頁表格。
8. 怎樣用C語言實現網路抓包
第一法則:站在巨人肩膀上 && 不要重復造輪子。
對於這種復雜的過程,第一選擇是使用現成的,節約時間,提升效率。
Wireshark(前稱Ethereal)是一個網路封包分析軟體。網路封包分析軟體的功能是擷取網路封包,並盡可能顯示出最為詳細的網路封包資料。Wireshark使用WinPCAP作為介面,直接與網卡進行數據報文交換。
網路封包分析軟體的功能可想像成 "電工技師使用電表來量測電流、電壓、電阻" 的工作 - 只是將場景移植到網路上,並將電線替換成網路線。在過去,網路封包分析軟體是非常昂貴,或是專門屬於營利用的軟體。Ethereal的出現改變了這一切。在GNUGPL通用許可證的保障范圍底下,使用者可以以免費的代價取得軟體與其源代碼,並擁有針對其源代碼修改及客制化的權利。Ethereal是目前全世界最廣泛的網路封包分析軟體之一。第二法則:學習 && 提升。
如果是單純的學習知識,可以直接嘗試寫一些具有部分功能的程序,過程會有點艱難,但非常有意義。學習網路編程,需要了解 開放系統互連參考模型的的七層每一層的意義以及現實當中實現的四層的網路協議。然後就可以知道抓包的包位於模型當中的傳輸層協議,包括UDP和TCP的協議。進一步要學習每種協議的格式,表頭,數據包等等。一句話,冰凍三尺非一日之寒。
Windows下的抓包及簡單的編程。
Windows2000在TCP/IP協議組件上做了很多改進,功能也有增強。比如在協議棧上的調整,增大了默認窗口大小,以及高延遲鏈接新演算法。同時在安全性上,可應用IPSec加強安全性,比NT下有不少的改進。
Microsoft TCP/IP 組件包含「核心協議」、「服務」及兩者之間的「介面」。傳輸驅動程序介面 (TDI) 與網路設備介面規范 (NDIS) 是公用的。 此外,還有許多用戶模型應用程序的更高級介面。最常用的介面是 Windows Sockets、遠程過程調用 (RPC) 和 NetBIOS。
Windows Sockets 是一個編程介面,它是在加州大學伯克利分校開發的套接字介面的基礎上定義的。它包括了一組擴展件,以充分利用 Microsoft Windows 消息驅動的特點。規范的 1.1 版是在 1993 年 1 月發行的,2.2.0 版在 1996 年 5 月發行。Windows 2000 支持 Winsock 2.2 版。在Winsock2中,支持多個傳輸協議的原始套接字,重疊I/O模型、服務質量控制等。
這里介紹Windows Sockets的一些關於原始套接字(Raw Socket)的編程。同Winsock1相比,最明顯的就是支持了Raw Socket套接字類型,通過原始套接字,我們可以更加自如地控制Windows下的多種協議,而且能夠對網路底層的傳輸機制進行控制。
1、創建一個原始套接字,並設置IP頭選項。
SOCKET sock;
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
或者:
s = WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
這里,我們設置了SOCK_RAW標志,表示我們聲明的是一個原始套接字類型。創建原始套接字後,IP頭就會包含在接收的數據中,如果我們設定 IP_HDRINCL 選項,那麼,就需要自己來構造IP頭。注意,如果設置IP_HDRINCL 選項,那麼必須具有 administrator許可權,要不就必須修改注冊表:
HKEY_LOCAL_
修改鍵:DisableRawSecurity(類型為DWORD),把值修改為 1。如果沒有,就添加。
BOOL blnFlag=TRUE;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag);
對於原始套接字在接收數據報的時候,要注意這么幾點:
a、如果接收的數據報中協議類型和定義的原始套接字匹配,那麼,接收的所有數據就拷貝到套接字中。
b、如果綁定了本地地址,那麼只有接收數據IP頭中對應的遠端地址匹配,接收的數據就拷貝到套接字中。
c、如果定義的是外部地址,比如使用connect(),那麼,只有接收數據IP頭中對應的源地址匹配,接收的數據就拷貝到套接字中。2、構造IP頭和TCP頭
這里,提供IP頭和TCP頭的結構:
// Standard TCP flags
#define URG 0x20
#define ACK 0x10
#define PSH 0x08
#define RST 0x04
#define SYN 0x02
#define FIN 0x01
typedef struct _iphdr //定義IP首部
{
unsigned char h_lenver; //4位首部長度+4位IP版本號
unsigned char tos; //8位服務類型TOS
unsigned short total_len; //16位總長度(位元組)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
typedef struct psd_hdr //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協議類型
unsigned short tcpl; //TCP長度
}PSD_HEADER;
typedef struct _tcphdr //定義TCP首部
{
USHORT th_sport; //16位源埠
USHORT th_dport; //16位目的埠
unsigned int th_seq; //32位序列號
unsigned int th_ack; //32位確認號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數據偏移量
}TCP_HEADER;
TCP偽首部並不是真正存在的,只是用於計算檢驗和。校驗和函數:
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
當需要自己填充IP頭部和TCP頭部的時候,就同時需要自己計算他們的檢驗和。
3、發送原始套接字數據報
填充這些頭部稍微麻煩點,發送就相對簡單多了。只需要使用sendto()就OK。
sendto(sock, (char*)&tcpHeader, sizeof(tcpHeader), 0, (sockaddr*)&addr_in,sizeof(addr_in));
下面是一個示常式序,可以作為SYN掃描的一部分。
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#define SOURCE_PORT 7234
#define MAX_RECEIVEBYTE 255
typedef struct ip_hdr //定義IP首部
{
unsigned char h_verlen; //4位首部長度,4位IP版本號
unsigned char tos; //8位服務類型TOS
unsigned short total_len; //16位總長度(位元組)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IPHEADER;
typedef struct tsd_hdr //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協議類型
unsigned short tcpl; //TCP長度
}PSDHEADER;
typedef struct tcp_hdr //定義TCP首部
{
USHORT th_sport; //16位源埠
USHORT th_dport; //16位目的埠
unsigned int th_seq; //32位序列號
unsigned int th_ack; //32位確認號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數據偏移量
}TCPHEADER;
//CheckSum:計算校驗和的子函數
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
void useage()
{
printf("****************************************** ");
printf("TCPPing ");
printf(" Written by Refdom ");
printf(" Email: [email protected] ");
printf("Useage: TCPPing.exe Target_ip Target_port ");
printf("******************************************* ");
}
int main(int argc, char* argv[])
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;
char szSendBuf[60]={0};
BOOL flag;
int rect,nTimeOver;
useage();
if (argc!= 3)
{ return false; }
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
printf("WSAStartup Error! ");
return false;
}
if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
printf("Socket Setup Error! ");
return false;
}
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error! ");
return false;
}
nTimeOver=1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
{
printf("setsockopt SO_SNDTIMEO error! ");
return false;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
//
//
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr("本地地址");
ipHeader.destIP=inet_addr(argv[1]);
//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[2]));
tcpHeader.th_sport=htons(SOURCE_PORT); //源埠號
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=0;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2; //修改這里來實現不同的標志位探測,2是SYN,1是FIN,16是ACK探測 等等
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;
psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
//計算校驗和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),
0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%d ",WSAGetLastError());
return false;
}
else
printf("send ok! ");
closesocket(sock);
WSACleanup();
return 0;
}
4、接收數據
和發送原始套接字數據相比,接收就比較麻煩了。因為在WIN我們不能用recv()來接收raw socket上的數據,這是因為,所有的IP包都是先遞交給系統核心,然後再傳輸到用戶程序,當發送一個raws socket包的時候(比如syn),核心並不知道,也沒有這個數據被發送或者連接建立的記錄,因此,當遠端主機回應的時候,系統核心就把這些包都全部丟掉,從而到不了應用程序上。所以,就不能簡單地使用接收函數來接收這些數據報。
要達到接收數據的目的,就必須採用嗅探,接收所有通過的數據包,然後進行篩選,留下符合我們需要的。可以再定義一個原始套接字,用來完成接收數據的任務,需要設置SIO_RCVALL,表示接收所有的數據。
SOCKET sniffersock;
sniffsock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0 ;
WSAIoctl(sniffersock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), NULL, 0, & lpcbBytesReturned, NULL, NULL);
創建一個用於接收數據的原始套接字,我們可以用接收函數來接收數據包了。然後在使用一個過濾函數達到篩選的目的,接收我們需要的數據包。
如果在XP以上的操作系統,微軟封殺了Raw Soccket,只能用wincpap之類的開發包了。
9. 抓包可以抓到瀏覽的網頁源代碼嗎
可以的,用httpwatch、fldder等工具都可以,還有瀏覽器自帶的Debug調試工具,都可以抓到訪問過後的網頁源碼。
10. 求winpcap編寫sniffer抓包程序源代碼
擦擦