⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cap_main.pas

📁 网络数据包捕获 能捕获网络和本机交换的数据包
💻 PAS
字号:
unit cap_main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  cap_ip, StdCtrls, ExtCtrls, Grids, ComCtrls, Buttons, Menus;

type
  Tmy_data=record
    buf:array of char;
end;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    StringGrid1: TStringGrid;
    Splitter1: TSplitter;
    Edit2: TEdit;
    Label1: TLabel;
    Panel1: TPanel;
    Memo1: TMemo;
    Splitter2: TSplitter;
    Memo2: TMemo;
    BitBtn5: TBitBtn;
    Label2: TLabel;
    Edit1: TEdit;
    ComboBox1: TComboBox;
    Label7: TLabel;
    ComboBox2: TComboBox;
    Label8: TLabel;
    BitBtn6: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure cap_ip1Cap(ip, proto, sourceIP, destIP, SourcePort,
      DestPort: String; header: PChar; header_size: Integer; data: PChar;
      data_size: Integer);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    function check_filter(proto, sourceIP, destIP, SourcePort,DestPort: String;data: PChar;data_size: Integer):boolean;
  end;

var
  Form1: TForm1;
  buf_list:array of Tmy_data;
  filter_str:string;
  cap_ip1:Tcap_ip;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  with StringGrid1.Rows[0] do
   begin
    Add('协议类型');
    Add('源地址');
    Add('源端口');
    Add('目的地址');
    Add('目的端口');
    Add('数据大小');
    Add('数据内容');
   end;
  setlength(buf_list,strtoint(edit2.text));
  cap_ip1:=Tcap_ip.Create(self);
  cap_ip1.OnCap:=cap_ip1Cap;
end;

function TForm1.check_filter(proto, sourceIP, destIP, SourcePort,DestPort: String;data: PChar;data_size: Integer):boolean;
var
    i:integer;
    temp_str:string;
begin
 result:=true;
 if filter_str='' then
  begin
   result:=false;
   exit;
  end;
 if (filter_str='排除协议'+proto) then exit;
 if (filter_str='排除源地址'+sourceIP) then exit;
 if (filter_str='排除源端口'+SourcePort) then exit;
 if (filter_str='排除目的地址'+destIP) then exit;
 if (filter_str='排除目的端口'+DestPort) then exit;

 if (ComboBox2.text='包含') and (ComboBox1.Text<>'内容') then
   begin
     if (filter_str='包含协议'+proto) then begin result:=false;exit;end;
     if (filter_str='包含源地址'+sourceIP) then begin result:=false;exit;end;
     if (filter_str='包含源端口'+SourcePort) then begin result:=false;exit;end;
     if (filter_str='包含目的地址'+destIP) then begin result:=false;exit;end;
     if (filter_str='包含目的端口'+DestPort) then begin result:=false;exit;end;
     result:=true;exit;
   end;

 if (filter_str<>'包含内容') then
   begin
    result:=false;exit;
   end;
  setlength(buf_list[StringGrid1.RowCount-2].buf,data_size);
  copymemory(buf_list[StringGrid1.RowCount-2].buf,data,data_size);
  temp_str:='';
  for i:=0 to data_size-1 do
    temp_str:=temp_str+buf_list[StringGrid1.RowCount-2].buf[i];
    temp_str:=AnsiLowerCase(temp_str);

  if (filter_str='包含内容') then
    begin
     if pos(AnsiLowerCase(edit1.text),temp_str)>0 then
      begin
       result:=false; exit;
      end else
      begin
       result:=true; exit;
      end;
    end else
   if (filter_str='排除内容') then
     begin
      if pos(AnsiLowerCase(edit1.text),temp_str)>0 then
       begin
        result:=true; exit;
       end else
       begin
        result:=false; exit;
       end;
    end;
 result:=false;
end;

procedure TForm1.cap_ip1Cap(ip, proto, sourceIP, destIP, SourcePort,
  DestPort: String; header: PChar; header_size: Integer; data: PChar;
  data_size: Integer);
begin
 if check_filter(proto,sourceIP, destIP, SourcePort,DestPort, data,data_size) then exit;
  with StringGrid1 do
   begin
    Cells[0,StringGrid1.RowCount-1]:=proto;
    Cells[1,StringGrid1.RowCount-1]:=sourceIP;
    Cells[2,StringGrid1.RowCount-1]:=SourcePort;
    Cells[3,StringGrid1.RowCount-1]:=destIP;
    Cells[4,StringGrid1.RowCount-1]:=DestPort;
    Cells[5,StringGrid1.RowCount-1]:=inttostr(data_size);
    Cells[6,StringGrid1.RowCount-1]:=data;
   end;
   setlength(buf_list[StringGrid1.RowCount-2].buf,data_size);
   copymemory(buf_list[StringGrid1.RowCount-2].buf,data,data_size);
 if (StringGrid1.RowCount>strtoint(edit2.text)) then
    StringGrid1.RowCount:=2
   else
   begin
    StringGrid1.RowCount:=StringGrid1.RowCount+1;
    StringGrid1.Rows[StringGrid1.RowCount].Clear;
   end;

 stringgrid1.toprow:=StringGrid1.RowCount- StringGrid1.VisibleRowCount;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  cap_ip1.StartCap;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 cap_ip1.pause;
 if cap_ip1.Fpause then
  BitBtn2.Caption:='继续捕捉'
  else
  BitBtn2.Caption:='暂停捕捉';
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
cap_ip1.StopCap;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
var text_str,hex_str,all_str:string;
    i:integer;
    no: Integer;
begin
  memo1.lines.Clear;
  memo2.lines.Clear;
  text_str:='';hex_str:='';all_str:='';
  i:=0;
  while i<= high(buf_list[stringgrid1.Selection.Top-1].buf) do
   begin
     no:=ord(buf_list[stringgrid1.Selection.Top-1].buf[i]);
     hex_str:=hex_str+format('%0.2x',[no])+' ';
     if no<20 then
      begin
        text_str:=text_str+'.';
        all_str:=all_str+'.';
      end else
      begin
        text_str:=text_str+buf_list[stringgrid1.Selection.Top-1].buf[i];
        all_str:=all_str+buf_list[stringgrid1.Selection.Top-1].buf[i];
      end;

     if ((i mod 8)=7) then
      begin
       memo1.lines.add(hex_str+'  |  '+text_str);
       text_str:='';hex_str:='';
      end;
     inc(i);
   end;
 if hex_str<>'' then
   memo1.lines.add(hex_str+format('%'+inttostr(24-length(hex_str))+'s',[' '])+'  |  '+text_str);

  memo2.lines.Add(all_str);
end;


procedure TForm1.BitBtn5Click(Sender: TObject);
begin
 StringGrid1.RowCount:=2;
 StringGrid1.Rows[1].Clear;
end;

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
 filter_str:='';
 if (ComboBox2.text='') or (ComboBox1.Text='') or (edit1.Text='') then
   showmessage('内容不全!') else
  if  ComboBox1.Text='内容' then
    filter_str:=self.ComboBox2.text+self.ComboBox1.Text
   else
     filter_str:=self.ComboBox2.text+self.ComboBox1.Text+AnsiUpperCase(edit1.Text);

end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  cap_ip1.Free;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -