[开源]Delphi下WinPCap开发基础 一个简单的HttpSniffer

Delphi开发WinPcap程序一直是个门槛,这个代码之前在netexpert发过,但是问“如何用Delphi写网络协议分析?”、“Delphi怎么发送ARP包”这类问题的人还是大有人在。Delphi不能开发Sniffer?不能进行底层数据包收发?跨过这条门槛,一切易如反掌。

 

一直在考虑是否要把这几个代码拿出来,因为有些程序危害还比较大(比如ARP冲突攻击、SYN Flood那几个),留着也是留着还是拿出来开源得了。另外,虽然网上有个转换过的WinPcap头文件,但怎么用怎么不顺手。这里是通过Dev-C++写了一个DLL,通过调用这个DLL操作WinPcap库(代码都在里面,很简单)。

 

这是第一个程序,代码量很小,算是Sniffer的基础,源码见文章末尾。过两天把另外的几个也整理出来...

欢迎随便转载,希望能普及Delphi WinPcap开发
原文发表在:http://www.netexpert.cn/thread-20671-1-1.html

这次是Sniffer的,下一篇打算发布SYN Flood的(伪造数据包)。代码中有些地方注释不全,不过可以先到这里下载之前的版本:http://www.netexpert.cn/thread-20673-1-1.html


一个简单的Sniffer例子程序,抓取TCP 80端口的数据包,并过滤出POST和GET消息,如图:

 

打开网卡、设置过滤器,以及HTTP数据包处理部分的代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 抓包和数据包处理过程
{********************************************
 *
 *  打开网卡并设置过滤器,只要HTTP数据
 *
 ********************************************
}
procedure TForm1.btn_OpenAdapterClick(Sender: TObject);
var
  DeviceName: String;
  iRet: Integer;
begin
  
if ComboBoxAdapterName.Text = '' then Exit;
  DeviceName :
= ComboBoxAdapterName.Text;

  
{ 打开网卡设备 }
  
if ( -1 = OpenAdapter(PChar(DeviceName), 100) ) then
  
begin
    Self.Caption :
= StrPas(GetPCapError());
    Exit;
  
end;

  
{ 设置过滤器,只要 TCP 80 端口的 (语法请参见libpcap或tcpdump的文档) }
  iRet :
= SetFilter('tcp port 80');
  
if (iRet <> 0then
  
begin
    
{ 可能是过滤器语法错误 }
    Self.Caption :
= Format('SetFilter Error = %d', [iRet]);
  
end;

  btn_OpenAdapter.Enabled :
= False;
  ComboBoxDevice.Enabled :
= False;

  
{ 开始抓包 }
  PacketLoop();
end;


{********************************************
 *
 *  数据包处理:从网卡上读一个数据包并分析
 *
 ********************************************
}
procedure TForm1.ProcessPacket();
var
  iRet: Integer;
  pkt_hdr: PPCap_pkthdr;
  pkt_data: PByte;
  len, tcplen: Cardinal;
  httpdata: PChar;
begin
  
{ 读取数据包 }
  iRet :
= ReadPacket(@pkt_hdr, @pkt_data);
  
{ 长度大于0表成功 }
  
if (iRet > 0then
    
begin
      len :
= pkt_hdr^.PacketLength;   // 数据包长度
      tcplen :
= (PTCPPacket(pkt_data)^.TCPhdr.LenRes and $F0) div 4// TCP长度
      
{ 计算负载大小 }
      len :
= len - (14+20+tcplen);
      
if len > 0 then
      
begin
        
{ 取得HTTP数据包内容 }
        httpdata :
= PChar(Cardinal(pkt_data)+14+20+tcplen);
        httpdata[len] :
= #0;        // 修正行尾
        
        
{ 检查字符串 GET }
        
if CheckBox_ShowGET.Checked then      // 过滤GET
        
if (httpdata[0= 'G')
          
and (httpdata[1= 'E')
          
and (httpdata[2= 'T')
          
and (httpdata[3= ' 'then
        
begin
          Memo1.Lines.Add(Format(
'[%s] Packet Size: %d', [FormatDateTime('h:mm:ss', time_t2DateTime(pkt_hdr^.DateTime)), pkt_hdr^.SliceLength]));
          Memo1.Lines.Add(StrPas(httpdata));
        
end;

        
{ POST }
        
if (httpdata[0= 'P')
          
and (httpdata[1= 'O')
          
and (httpdata[2= 'S')
          
and (httpdata[3= 'T'then
        
begin
          Memo1.Lines.Add(Format(
'[%s] Packet Size: %d', [FormatDateTime('h:mm:ss', time_t2DateTime(pkt_hdr^.DateTime)), pkt_hdr^.SliceLength]));
          Memo1.Lines.Add(StrPas(httpdata));

          
{ 检查是不是一个包就发完所有数据 }
          
if (pkt_hdr^.SliceLength >= 1514then
          
begin
            
// 继续读入下一个包
            ProcessPacket();
          
end;
          Memo1.Lines.Add(
'.'#13#10);
        
end;
      
end;
    
end;
end;

procedure TForm1.PacketLoop();
begin
  fRunning :
= True;

  
{ 循环抓取数据包并分析 }
  
while (fRunning) do
  
begin
    ProcessPacket();

    Application.ProcessMessages;
  
end;
end;

 


 程序用途,捕获HTTP的GET和POST消息,用于截获URL的访问以及表单的提交(比如只监听POST消息,可以抓到论坛登陆的帐号和密码)。例如抓到的输出如下:

ContractedBlock.gif ExpandedBlockStart.gif 一个典型的POST
[13:28:49] Packet Size: 919
POST 
/chklogin.do HTTP/1.1
Accept: image
/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Referer: ht tp:
//ww w.webgame.com.cn/
Accept
-Language: zh-cn
User
-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; CIBA; TheWorld)
Content
-Type: application/x-www-form-urlencoded
UA
-CPU: x86
Accept
-Encoding: gzip, deflate
Host: passport.webgame.com.cn
Content
-Length: 145
Connection: Keep
-Alive
Cache
-Control: no-cache
Cookie: __utma
=257446157.4392135229605150700.1219543473.1219543473.1219543473.1; __utmz=257446157.1219543473.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

username
=abcdefg&password=123456&method=login&login_md5=e10adc3949ba59abbe56e057f20f883e&method=login_pw&gameType=&forward=&image.x=58&image.y=14
.


第二行:POST /chklogin.do HTTP/1.1 可以看到,这里在验证登陆信息
一般用户名和密码都在Cookie中,找到Cookie这行:
Cookie: __utma=257446157.4392135229605150700.1219543473.1219543473.1219543473.1; __utmz=257446157.1219543473.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
username=abcdefg&password=123456&method=login&login_md5=e10adc3949ba59abbe56e057f20f883e&method=login_pw&gameType=&forward=&image.x=58&image.y=14
.
看到了,在 username=abcdefg&password=123456 这里清清楚楚的写着刚才提交的用户名是abcdefg,密码为123456(当然是我随便输的)。自己试试一下效果吧。

 

源码(Source)httpSniffer_src.rar
Linux版的源码(使用libpcap):httpSniffer_src4Linux.rar

可执行程序:httpSniffer_bin.rar

转载于:https://www.cnblogs.com/bits/archive/2009/03/15/Delphi-winpcap_httpsniffer.html

WinPcap一个开源网络抓包库,它可以让开发者在Windows平台上对网络数据包进行捕获和分析。如果你想要开发一个简单的防火墙软件,可以使用WinPcap来捕获网络流量,并通过过滤规则控制网络访问。 下面是一个简单WinPcap防火墙软件的实现思路: 1. 使用WinPcap捕获所有进出网络接口的数据包。 2. 对捕获到的数据包进行解析,获取源IP地址、目的IP地址、源端口和目的端口等信息。 3. 根据设定的过滤规则判断是否允许该数据包通过。过滤规则可以包括: - 黑名单:禁止某些IP地址或端口的访问。 - 白名单:只允许某些IP地址或端口的访问。 - 协议过滤:只允许某些协议的访问,如TCP、UDP等。 4. 如果该数据包不符合过滤规则,则丢弃该数据包,否则将其转发给目标设备。 下面是一个简单的代码示例,用于捕获所有进出网络接口的数据包并输出源IP地址和目的IP地址: ```c++ #include <pcap.h> #include <iostream> using namespace std; void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { struct tm* ltime; char timestr[16]; time_t local_tv_sec; local_tv_sec = header->ts.tv_sec; ltime = localtime(&local_tv_sec); strftime(timestr, sizeof timestr, "%H:%M:%S", ltime); printf("%s,%.6d len:%d IP %d.%d.%d.%d -> %d.%d.%d.%d\n", timestr, header->ts.tv_usec, header->len, pkt_data[26], pkt_data[27], pkt_data[28], pkt_data[29], pkt_data[30], pkt_data[31], pkt_data[32], pkt_data[33]); } int main(int argc, char **argv) { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *handle; struct bpf_program fp; char filter_exp[] = ""; // 过滤规则 bpf_u_int32 net; bpf_u_int32 mask; // 打开网络设备并设置过滤规则 handle = pcap_open_live("eth0", BUFSIZ, 1, 1000, errbuf); pcap_compile(handle, &fp, filter_exp, 0, net); pcap_setfilter(handle, &fp); // 捕获数据包并输出源IP地址和目的IP地址 pcap_loop(handle, -1, packet_handler, NULL); pcap_close(handle); return 0; } ``` 需要注意的是,过滤规则的语法和具体实现方式可能因不同的需求而有所不同。此外,开发防火墙软件需要具备一定的网络安全基础和知识,以确保软件的正确性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值