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

📄 u_libpcap.pas

📁 漏洞扫描系列中HB Network Scanner 测试用练习代码
💻 PAS
字号:
unit u_LibpCap;
{网络层,传输层数据分析模块,DELPHI声明文件
作者:顾晓波
创建日期:2002-06-04
调用模块:netpcap.dll 网络层,传输层数据分析模块
}
interface

uses classes,Windows;

type
  Tpcap_timeval = record
    tv_Sec,            // Secs since 1/1/1970
    tv_uSec: Integer;     // microseconds
  end;

  Ppcap_pkthdr = ^Tpcap_pkthdr;
  Tpcap_pkthdr = record
    ts     : Tpcap_timeval;	// time stamp
    caplen : Longword;          // length of portion present
    len    : Longword;	        // length this packet (off wire)
  end;

  pcap_t = Pointer;
  pcap_dumper_t = Pointer;

  Tbpf_program = record
    bf_len : Cardinal;
    bpf_insn : Pointer;
  end;

  Pbpf_program = ^Tbpf_program;
  PCardinal = ^Cardinal;

  pcap_handler = procedure(parameter : pointer; const header : Ppcap_pkthdr; const pkt_data : Pchar); cdecl;

const
 PCAP_ERRBUF_SIZE     = 256;
 WTAP_MAX_PACKET_SIZE = 65535;

var
  errbuf : array[0..PCAP_ERRBUF_SIZE-1] of char;

var
  pcap_open_live     : function(device:pchar;snaplen : integer;promisc : integer; to_ms : integer; ebuf :pchar) : pcap_t; cdecl;
  pcap_open_offline  : function (fname : PChar; ebuf : PChar) : pointer; cdecl;
  pcap_dump_open     : function (p : pcap_t; fname : PChar) : pcap_dumper_t; cdecl;
  pcap_lookupdev     : function(errbuf : Pchar) : PChar; cdecl;
  pcap_dispatch      : Function(p : pcap_t;cnt : integer; callback : pcap_handler; user : Pointer) : Integer; cdecl;
  pcap_loop          : Function(p : pcap_t;cnt : integer; callback : pcap_handler; user : Pointer) : Integer; cdecl;
  pcap_dump          : procedure(user : PChar; h : Ppcap_pkthdr; sp : PChar); cdecl;
  pcap_next          : function (p : pcap_t; h : Ppcap_pkthdr) : PChar; cdecl;
  pcap_snapshot      : function (p : pcap_t) : integer; cdecl;
  pcap_is_swapped    : function (p : pcap_t) : Integer; cdecl;
  pcap_major_version : function(p : pcap_t) : Integer; cdecl;
  pcap_minor_version : function (p : pcap_t) : Integer; cdecl;
  pcap_fileno        : function(p : pcap_t) : Integer; cdecl;
  pcap_geterr        : function(p : pcap_t) : PChar;cdecl;
  pcap_close         : procedure (p : pcap_t); cdecl;
  pcap_dump_close    : procedure (p : pcap_dumper_t); cdecl;
  pcap_compile       : function(p : pcap_t; fp : Pbpf_program;buf : PChar; optimize : integer;mask : Cardinal) : integer; cdecl;
  pcap_setfilter     : function(p : pcap_t; fp : Pbpf_program) : Integer; cdecl;
  pcap_lookupnet     : function(device : PChar;netp : PCardinal; maskp : PCardinal;errBuf : PChar) : Integer;cdecl;
  
implementation

var
  FHandle: THandle;

function isLibpCapInstalled : Boolean;
begin
{$IFDEF MSWINDOWS}
  result := FHandle <> 0;
{$ENDIF}
{$IFDEF LINUX}
  result := FHandle <> nil;
{$ENDIF}
end;

{$IFDEF MSWINDOWS}
function getAdapters(p_Adapters : PChar) : TStrings;
var
  l_info : OSVERSIONINFO;
  l_NameList : Array [0..(1024*2)-1] of char;
  l_BufferLength : Longword;
  l_Adapters : String;
  i          : Integer;
begin
  result := TStringList.create;
  l_BufferLength := 1024;

  // on d閠ermine quelle est la version de windows utilis閑
  l_info.dwOSVersionInfoSize := Sizeof(OSVERSIONINFO);
  GetVersionEx(l_Info);

  if (l_info.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) then
  begin
    i :=0;
    // 95 ou 98 (8bits per character)
     while ((p_Adapters[i]<> #0) or (p_Adapters[i+1] <> #0)) do
     begin
       if (p_Adapters[i]= #0) and (p_Adapters[i+1] <> #0) then p_Adapters[i]:=',';
       inc(i);
     end;
     l_Adapters := p_Adapters;
  end
  else
  if (l_info.dwPlatformId = VER_PLATFORM_WIN32_NT) then
  begin
    // NT ou 2000 (16bits per character)
    i :=0;
    while ((Pwidechar(p_Adapters)[i] <> #0) or (PwideChar(p_Adapters)[i+1]<>#0)) do
    begin
       if (Pwidechar(p_Adapters)[i]=#0)and (PwideChar(p_Adapters)[i+1]<>#0) then
         PwideChar(p_Adapters)[i]:= WideChar(',');
       inc(i);
    end;

     l_Adapters := WideCharToString(PWideChar(p_Adapters)) ;
  end;
  result.commatext := l_Adapters;
end;
{$ENDIF}

{$IFDEF LINUX}
function getAdapters(p_Adapters : PChar) : TStrings;
var
  i          : Integer;
  l_Adapters : String;
begin
  i :=0;
  result := TStringList.create;
  while ((p_Adapters[i]<> #0) or (p_Adapters[i+1] <> #0)) do
  begin
    if (p_Adapters[i]= #0) and (p_Adapters[i+1] <> #0) then p_Adapters[i]:=',';
    inc(i);
  end;
  l_Adapters := p_Adapters;
  result.commatext := l_Adapters;
end;
{$ENDIF}

initialization
begin
{$IFDEF MSWINDOWS}

  FHandle := LoadLibrary('netpcap.dll');  {网络层,传输层数据分析模块}

  if FHandle <> 0 then
  begin
    @pcap_open_live := GetProcAddress(FHandle, 'pcap_open_live');
    @pcap_open_offline := GetProcAddress(FHandle, 'pcap_open_offline');
    @pcap_dump_open := GetProcAddress(FHandle, 'pcap_dump_open');
    @pcap_lookupdev := GetProcAddress(FHandle, 'pcap_lookupdev');
    @pcap_dispatch := GetProcAddress(FHandle, 'pcap_dispatch');
    @pcap_loop := GetProcAddress(FHandle, 'pcap_loop');
    @pcap_dump := GetProcAddress(FHandle, 'pcap_dump');
    @pcap_next := GetProcAddress(FHandle, 'pcap_next');
    @pcap_snapshot := GetProcAddress(FHandle, 'pcap_snapshot');
    @pcap_is_swapped := GetProcAddress(FHandle, 'pcap_is_swapped');
    @pcap_major_version := GetProcAddress(FHandle, 'pcap_major_version');
    @pcap_minor_version := GetProcAddress(FHandle, 'pcap_minor_version');
    @pcap_fileno := GetProcAddress(FHandle, 'pcap_fileno');
    @pcap_geterr := GetProcAddress(FHandle, 'pcap_geterr');
    @pcap_close := GetProcAddress(FHandle, 'pcap_close');
    @pcap_dump_close := GetProcAddress(FHandle, 'pcap_dump_close');
    @pcap_compile := GetProcAddress(FHandle, 'pcap_compile');
    @pcap_lookupnet := GetProcAddress(FHandle, 'pcap_lookupnet');
    @pcap_setfilter := GetProcAddress(FHandle, 'pcap_setfilter');
  end;
{$ENDIF}
{$IFDEF LINUX}
  FHandle := dlopen('netpcap.so.0',RTLD_NOW);
  if FHandle <> nil then
  begin
    @pcap_open_live := dlsym(FHandle, 'pcap_open_live');
    @pcap_open_offline := dlsym(FHandle, 'pcap_open_offline');
    @pcap_dump_open := dlsym(FHandle, 'pcap_dump_open');
    @pcap_lookupdev := dlsym(FHandle, 'pcap_lookupdev');
    @pcap_dispatch := dlsym(FHandle, 'pcap_dispatch');
    @pcap_loop := dlsym(FHandle, 'pcap_loop');
    @pcap_dump := dlsym(FHandle, 'pcap_dump');
    @pcap_next := dlsym(FHandle, 'pcap_next');
    @pcap_snapshot := dlsym(FHandle, 'pcap_snapshot');
    @pcap_is_swapped := dlsym(FHandle, 'pcap_is_swapped');
    @pcap_major_version := dlsym(FHandle, 'pcap_major_version');
    @pcap_minor_version := dlsym(FHandle, 'pcap_minor_version');
    @pcap_fileno := dlsym(FHandle, 'pcap_fileno');
    @pcap_geterr := dlsym(FHandle, 'pcap_geterr');
    @pcap_close := dlsym(FHandle, 'pcap_close');
    @pcap_dump_close := dlsym(FHandle, 'pcap_dump_close');
    @pcap_compile := dlsym(FHandle, 'pcap_compile');
    @pcap_lookupnet := dlsym(FHandle, 'pcap_lookupnet');
    @pcap_setfilter := dlsym(FHandle, 'pcap_setfilter');
  end;
{$ENDIF}
end;

finalization
begin
{$IFDEF MSWINDOWS}
  if FHandle <> 0 Then FreeLibrary(FHandle);
{$ENDIF}
{$IFDEF LINUX}
  if FHandle <> nil then dlclose(Fhandle);
{$ENDIF}
end;

end.



⌨️ 快捷键说明

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