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

📄 packet32seh.pas

📁 漏洞扫描系列中HB Network Scanner 测试用练习代码
💻 PAS
字号:
unit Packet32seh;
{包捕获核心驱动接口,DELPHI声明文件
作者:顾晓波
创建日期:2002-06-04
调用模块:zzpcap.dll 包捕获核心驱动接口
}
{$ALIGN ON}

interface
uses windows,u_SysInfo;

const

//copied from Ndis.h
//the following constants are to be used to direct
//the underlying NIC driver to choose which type of
//packet can be delivered to the upper bound driver,
//that is, our snoop driver.
NDIS_PACKET_TYPE_DIRECTED =           $0001;
NDIS_PACKET_TYPE_MULTICAST =          $0002;
NDIS_PACKET_TYPE_ALL_MULTICAST =      $0004;
NDIS_PACKET_TYPE_BROADCAST =          $0008;
NDIS_PACKET_TYPE_SOURCE_ROUTING =     $0010;
NDIS_PACKET_TYPE_PROMISCUOUS =        $0020; //for snoop
NDIS_PACKET_TYPE_SMT =                $0040;
NDIS_PACKET_TYPE_MAC_FRAME =          $8000;
NDIS_PACKET_TYPE_FUNCTIONAL =         $4000;
NDIS_PACKET_TYPE_ALL_FUNCTIONAL =     $2000;
NDIS_PACKET_TYPE_GROUP =              $1000;
//

//working modes
MODE_CAPT = 0 ;
MODE_STAT = 1 ;

//ioctls
pBIOCSETBUFFERSIZE  = 9592 ;
pBIOCSETF = 9030 ;
pBIOCGSTATS  = 9031 ;
pBIOCSRTIMEOUT = 7416 ;
pBIOCSMODE  = 7412  ;
pBIOCSWRITEREP = 7413  ;
pBIOCSMINTOCOPY = 7414 ;
pBIOCSETOID = 2147483648  ;
pBIOCQUERYOID = 2147483652 ;
pATTACHPROCESS = 7117  ;
pDETACHPROCESS = 7118  ;
pBIOCEVNAME = 7415    ;
pBIOCSTIMEZONE = 7471 ;


DOSNAMEPREFIX  = 'Packet_'  ;
MAX_LINK_NAME_LENGTH  = 64 ;
NMAX_PACKET = 65535   ;


type
{ Jagad like to have DELPHI3/DELPHI4 defined for lisibility }
{ VER100 is automatically defined by Delphi3 compiler       }
{ VER120 is automatically defined by Delphi4 compiler       }
{$IFDEF VER100}
    {$DEFINE DELPHI3}
{$ELSE}
    {$DEFINE DELPHI4}
{$ENDIF}

{$IFDEF DELPHI3}
    USLONG = LongInt;
{$ELSE}
    USLONG = LongWord;
{$ENDIF}

_PACKET_OID_DATA = packed record
    Oid:        ULONG ;
    Length:     ULONG ;
    Data:       array[0..0] of UCHAR;
end;

PACKET_OID_DATA = _PACKET_OID_DATA ;
PPACKET_OID_DATA = ^PACKET_OID_DATA;

ADAPTER = packed record
  hFile:                THandle;
  szAdapterName:        array [0..MAX_LINK_NAME_LENGTH-1] of Char;
  SymbolicLink:         array [0..MAX_PATH-1] of Char;
  ReadTimeOut:          UINT;
  ReadEvent:            THandle;
  NumWrites:            Integer;

end;
LPADAPTER = ^ADAPTER;


PACKET = packed record
  hEvent:      THandle;
  xOverlapped: TOVERLAPPED;    // FPiette May 10, 1999
  Buffer:      PChar;
  Length:      USLONG;         // FPiette May 17, 1999
  ulBytesReceived: UINT         ;
  bIoComple:	  BOOLEAN;
end;
LPPACKET = ^PACKET;

//Network type structure

NetType = packed record
	 LinkType: UINT;
	 LinkSpeed: UINT;
end;
PNetType = ^NetType;
{
//some definitions from libpcap
#ifndef BPF_MAJOR_VERSION
}

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

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

Pbpf_program = ^Tbpf_program;
PCardinal = ^Cardinal;

bpf_insn = packed record
	code:  SHORT; {应该为 USHORT}
	jt:    UCHAR;
	jf:    UCHAR;
	k:     Integer;
end;

bpf_stat = packed record
	bs_recv: UINT;		(* number of packets received *)
	bs_drop: UINT;		(* number of packets dropped *)
end;

Pbpf_stat = ^bpf_stat;

bpf_hdr = packed record
        bh_tstamp:           Tpcap_timeval;	(* time stamp *)
        bh_caplen:           UINT;	(* length of captured portion *)
        bh_datalen:          UINT;	(* original length of packet *)
        bh_hdrlen:           SHORT;	(* 应该为 USHORT //length of bpf header (this struct
					   plus alignment padding) *)
end;

{#endif}

function isSehSnifferAvailable : boolean;

var
PacketSetMinToCopy:function (AdapterObject:LPADAPTER; nbytes:Integer): Boolean; stdcall;
PacketSetNumWrites:function ( AdapterObject:LPADAPTER; nwrites:Integer): Boolean; stdcall;
PacketSetMode:function ( AdapterObject:LPADAPTER; mode:Integer): Boolean; stdcall;
PacketSetMaxLookaheadsize:function  ( AdapterObject:LPADAPTER): Boolean; stdcall;
PacketSetReadTimeout:function ( AdapterObject:LPADAPTER; timeout:Integer): Boolean; stdcall;
PacketSetBpf:function ( AdapterObject:LPADAPTER; fp : Pbpf_program): Boolean; stdcall;
PacketGetStats:function ( AdapterObject:LPADAPTER ; s: Pbpf_stat): Boolean; stdcall;
PacketSetBuff:function ( AdapterObject:LPADAPTER ; dim:Integer): Boolean; stdcall;
PacketGetNetType:function  ( AdapterObject:LPADAPTER ; Ptype:PNetType): Boolean; stdcall;
PacketOpenAdapter : function( AdapterName:LPTSTR):LPADAPTER; stdcall;
PacketSendPacket:function ( AdapterObject:LPADAPTER ; pPacket:LPPACKET ; Sync:BOOLEAN): Boolean; stdcall;
PacketAllocatePacket : function: LPPACKET ; stdcall ;
PacketAllocateNPacket: function( n:UINT): LPPACKET  ; stdcall;
PacketInitPacket:procedure ( lpPacket:LPPACKET ;  Buffer:PChar ;  Length:UINT); stdcall;
PacketFreePacket:procedure ( lpPacket:LPPACKET); stdcall;
PacketResetAdapter:function ( AdapterObject:LPADAPTER): Boolean; stdcall;
PacketWaitPacket:function ( AdapterObject:LPADAPTER ; lpPacket:LPPACKET): Boolean; stdcall;
PacketReceiveNPacket:function ( AdapterObject:LPADAPTER ; headLPacket:LPPACKET ; n:UINT ; length:UINT ; buffer:PBYTE ; Sync:BOOLEAN): Boolean; stdcall;
PacketReceivePacket:function ( AdapterObject:LPADAPTER ;  lpPacket: LPPACKET;  Sync:BOOLEAN): Boolean; stdcall;
PacketCloseAdapter:procedure ( lpAdapter:LPADAPTER); stdcall;
PacketSetHwFilter:function ( AdapterObject:LPADAPTER ; Filter:ULONG): Boolean; stdcall;
PacketGetAdapterNames:function ( pStr:LPSTR ;  BufferSize:PULONG): Boolean; stdcall;
PacketGetNetInfo:function ( AdapterName:LPTSTR ;  netp:PULONG ;  maskp:PULONG): Boolean; stdcall;
PacketRequest:function (  AdapterObject:LPADAPTER ; PSet:BOOLEAN ;  OidData:PPACKET_OID_DATA): Boolean; stdcall;
PacketSetNextPacket:procedure ( lpPacket:LPPACKET ;  next:LPPACKET); stdcall;
PacketSetLengthBuffer:procedure ( lpPacket:LPPACKET ;  dim:UINT); stdcall;
PacketSetLengthPacket:procedure ( lpPacket:LPPACKET ;  numBytes:UINT); stdcall;
PacketGetNextPacket:function( lpPacket:LPPACKET):LPPACKET; stdcall;

implementation

var
  FHandle: THandle;


// tells if we can use seh Sniffer (dll present ?, 95/98/Me ?)
function isSehSnifferAvailable : boolean;
begin
  result := ((getPlatformId = VER_PLATFORM_WIN32_WINDOWS) and (FHandle <> 0));
end;


initialization
begin
  FHandle := LoadLibrary('zzpcap.dll');     {包捕获核心驱动接口}
  if FHandle <> 0 then
  begin

@PacketSetMinToCopy  := GetProcAddress(FHandle, 'PacketSetMinToCopy');
@PacketSetNumWrites := GetProcAddress(FHandle, 'PacketSetNumWrites');
@PacketSetMode   := GetProcAddress(FHandle, 'PacketSetMode');
@PacketSetMaxLookaheadsize := GetProcAddress(FHandle, 'PacketSetMaxLookaheadsize');
@PacketSetReadTimeout := GetProcAddress(FHandle, 'PacketSetReadTimeout');
@PacketSetBpf     := GetProcAddress(FHandle, 'PacketSetBpf');
@PacketGetStats   := GetProcAddress(FHandle, 'PacketGetStats');
@PacketSetBuff   := GetProcAddress(FHandle, 'PacketSetBuff');
@PacketGetNetType := GetProcAddress(FHandle, 'PacketGetNetType');
@PacketOpenAdapter  := GetProcAddress(FHandle, 'PacketOpenAdapter');
@PacketSendPacket    := GetProcAddress(FHandle, 'PacketSendPacket');
@PacketAllocatePacket  := GetProcAddress(FHandle, 'PacketAllocatePacket');
@PacketAllocateNPacket := GetProcAddress(FHandle, 'PacketAllocateNPacket');
@PacketInitPacket     := GetProcAddress(FHandle, 'PacketInitPacket');
@PacketFreePacket    := GetProcAddress(FHandle, 'PacketFreePacket');
@PacketResetAdapter  := GetProcAddress(FHandle, 'PacketResetAdapter');
@PacketWaitPacket    := GetProcAddress(FHandle, 'PacketWaitPacket');
@PacketReceiveNPacket := GetProcAddress(FHandle, 'PacketReceiveNPacket');
@PacketReceivePacket := GetProcAddress(FHandle, 'PacketReceivePacket');
@PacketCloseAdapter := GetProcAddress(FHandle, 'PacketCloseAdapter');
@PacketSetHwFilter := GetProcAddress(FHandle, 'PacketSetHwFilter');
@PacketGetAdapterNames := GetProcAddress(FHandle, 'PacketGetAdapterNames');
@PacketGetNetInfo := GetProcAddress(FHandle, 'PacketGetNetInfo');
@PacketRequest    := GetProcAddress(FHandle, 'PacketRequest');
@PacketSetNextPacket   := GetProcAddress(FHandle, 'PacketSetNextPacket');
@PacketSetLengthBuffer  := GetProcAddress(FHandle, 'PacketSetLengthBuffer');
@PacketSetLengthPacket  := GetProcAddress(FHandle, 'PacketSetLengthPacket');
@PacketGetNextPacket   := GetProcAddress(FHandle, 'PacketGetNextPacket');

 end;
end;

finalization
begin
  if FHandle <> 0 Then FreeLibrary(FHandle);
end;


end.

⌨️ 快捷键说明

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