📄 u_libpcap.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 + -