資源簡介
用 WinPCAP 監(jiān)聽并分析 FTP 協(xié)議并記錄 IP、用戶名、密碼和登陸是否 成功
代碼片段和文件信息
#define?_CRT_SECURE_NO_WARNINGS
#define?HAVE_REMOTE
#include?
#include?
#include?
#include?
#include?
#pragma?comment(lib?“Packet“)
#pragma?comment(lib?“wpcap“)
#pragma?comment(lib?“WS2_32“)
u_char?user[20];//用戶名
u_char?pass[20];//密碼
//TCP首部
typedef?struct?tcp_header
{
u_short?sport;//源程序的端口號
u_short?dsport;//目的程序的端口號
u_int?seq;//序列號?SN
u_int?ack_num;//確認號
u_char?ihl;?//Internet?頭部長度
u_char?frame;
u_short?wsize;//窗口大小
u_short?crc;?//check?sum
u_short?urg;
}tcp_header;
/*?IPv4?首部?*/
typedef?struct?ip_header?{
u_char?ver_ihl;?//?Version?(4?bits)?+Internet?header?length?(4?bits)
u_char?tos;?//?Type?of?service
u_short?tlen;?//?Total?length
u_short?identification;?//?Identification
u_short?flags_fo;?//?Flags?(3?bits)?+?Fragmentoffset?(13?bits)
u_char?ttl;?//?Time?to?live
u_char?proto;?//?Protocol
u_short?crc;?//?Header?checksum
u_char?saddr[4];?//?Source?address
u_char?daddr[4];?//?Destination?address
u_int?op_pad;?//?Option?+?Padding
}?ip_header;
//以太網的幀格式
typedef?struct?mac_header?{
u_char?dest_addr[6];
u_char?src_addr[6];
u_char?type[2];
}?mac_header;
/*?回調函數(shù)原型?*/
void?packet_handler(u_char?*param?const?struct?pcap_pkthdr?*header?const?u_char?*pkt_data);
int?main()
{
pcap_if_t?*alldevs;
pcap_if_t?*d;
int?inum;
int?i?=?0;
pcap_t?*adhandle;
char?errbuf[PCAP_ERRBUF_SIZE];
u_int?netmask;
/*
過濾的規(guī)則
*/
char?packet_filter[]?=?“port?21“;//ftp的端口是21
struct?bpf_program?fcode;
/*?獲得設備列表?*/
if?(pcap_findalldevs_ex(PCAP_SRC_IF_STRING?NULL?&alldevs?errbuf)?==?-1)
{
fprintf(stderr?“Error?in?pcap_findalldevs:?%s\n“?errbuf);
exit(1);
}
/*?打印列表?*/
for?(d?=?alldevs;?d;?d?=?d->next)
{
printf(“%d.?%s“?++i?d->name);
if?(d->description)
printf(“?(%s)\n“?d->description);
else
printf(“?(No?description?available)\n“);
}
if?(i?==?0)
{
printf(“\nNo?interfaces?found!?Make?sure?WinPcap?is?installed.\n“);
return?-1;
}
printf(“Enter?the?interface?number?(1-%d):“?i);
scanf(“%d“?&inum);
if?(inum?1?||?inum?>?i)
{
printf(“\nInterface?number?out?of?range.\n“);
/*?釋放設備列表?*/
pcap_freealldevs(alldevs);
return?-1;
}
/*?跳轉到已選設備?*/
for?(d?=?alldevs?i?=?0;?inext?i++);
/*?打開適配器?*/
if?((adhandle?=?pcap_open(d->name??//?設備名
65536?????//?要捕捉的數(shù)據包的部分?
???//?65535保證能捕獲到不同數(shù)據鏈路層上的每個數(shù)據包的全部內容
PCAP_OPENFLAG_NOCAPTURE_LOCAL?????????//?混雜模式
1000??????//?讀取超時時間
NULL??????//?遠程機器驗證
errbuf?????//?錯誤緩沖池
))?==?NULL)
{
fprintf(stderr?“\nUnable?to?open?the?adapter.?%s?is?not?supported?by?WinPcap\n“);
/*?釋放設備列表?*/
pcap_freealldevs(alldevs);
return?-1;
}
/*?檢查數(shù)據鏈路層,為了簡單,我們只考慮以太網?*/
if?(pcap_datalink(adhandle)?!=?DLT_EN10MB)
{
fprintf(stderr?“\nThis?program?works?only?on?Ethernet?networks.\n“);
/*?釋放設備列表?*/
pcap_freealldevs(alldevs);
return?-1;
}
if?(d->
評論
共有 條評論