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

📄 main.pas

📁 一个SNOOP控件,各位看看可以对网络包进行分析.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
	// TCPData
	Common.AddListViewField(lvTCPData, TCPDATA_FIELD, HEADER_FIELD);
	Common.AddListViewField(lvTCPData, TCPDATA_FIELD, ETHERNET_FIELD);
	Common.AddListViewField(lvTCPData, TCPDATA_FIELD, IP_FIELD);
	Common.AddListViewField(lvTCPData, TCPDATA_FIELD, TCP_FIELD);
	Common.AddListViewField(lvTCPData, TCPDATA_FIELD, TCPDATA_FIELD);
	// UDPData
	Common.AddListViewField(lvUDPData, UDPDATA_FIELD, HEADER_FIELD);
	Common.AddListViewField(lvUDPData, UDPDATA_FIELD, ETHERNET_FIELD);
	Common.AddListViewField(lvUDPData, UDPDATA_FIELD, IP_FIELD);
	Common.AddListViewField(lvUDPData, UDPDATA_FIELD, UDP_FIELD);
	Common.AddListViewField(lvUDPData, UDPDATA_FIELD, UDPDATA_FIELD);
end;

procedure TMainForm.ViewPacket;
var
	ListView: TListView;
	List: TList;
begin
	ListView := GetActiveListView;
	List := GetActiveList;
	if ListView.Items.Count <> List.Count then
		ListView.Items.Count := List.Count;
end;

procedure TMainForm.ActionOpenExecute(Sender: TObject);
var
	FileSucceed: Boolean;
begin
	if OpenForm = nil then
		OpenForm := TOpenForm.Create(Application);
	OpenForm.ShowModal;
	if OpenForm.ModalResult <> mrOk then exit;
	Snoop1.Filter := _Global.Filter;
	Snoop1.ReadTimeOut := _Global.ReadTimeOut;
	Snoop1.SnapLen := _Global.SnapLen;
	Snoop1.ThreadSafe := _Global.ThreadSafe;
	if SnoopMemory = nil then SnoopMemory := TSnoopMemory.Create;
	ActionClear.Execute;
	if _Global.OpenType = 2 then // File Capture
	begin
		FileSucceed := Snoop1.LoadFromFile(_Global.FileName);
		lvTCPData.Items.Count := TCPDataList.Count;
		if FileSucceed then
		begin
			ExistingFileName := _Global.FileName;
			NewFileName := _Global.FileName;
		end else
			Application.MessageBox(PChar(Snoop1.Error), 'Error', MB_ICONERROR);
	end else // Adapter Capture or Remote Capture
	begin
		if _Global.OpenType = 0 then // Adapter Capture
		begin
			Snoop1.AdapterIndex := _Global.AdapterIndex;
			Snoop1.Open;
		end else // Remote Capture
			Snoop1.Open(_Global.Host, _Global.UserName, _Global.Password);
		if Snoop1.Active then
		begin
			if CapturingForm = nil then
				CapturingForm := TCapturingForm.Create(Application);
			CapturingForm.Initialize;
			CapturingForm.Show;

			if SnoopDump = nil then
				SnoopDump := TSnoopDump.Create(nil);
			SnoopDump.Close;
			ExistingFileName := ExtractFilePath(Application.ExeName) + 'temp.$$$';
			NewFileName := '';
			SnoopDump.Open(Snoop1.Pcap, ExistingFileName);
			if not SnoopDump.Active then
			begin
				Application.MessageBox(PChar(Snoop1.Error), 'Error', MB_ICONERROR);
				CapturingForm.Close;
				exit;
			end;
		end else // if fail to open
		begin
			if CapturingForm <> nil then
				if CapturingForm.Visible then
					CapturingForm.Close;
			Application.MessageBox(PChar(Snoop1.Error), 'Error', MB_ICONERROR);
		end;
	end;
	StatusBar1.Panels[0].Text := Snoop1.SourceName;
	SetControl;
end;

procedure TMainForm.ActionCloseExecute(Sender: TObject);
begin
	Snoop1.Close;
	if CapturingForm.Visible then
		CapturingForm.Close;
	if not _Global.ThreadSafe then
		SynchronizeListWithListView;
	SetControl;
end;

procedure TMainForm.ActionClearExecute(Sender: TObject);
var
	ListView: TListView;
begin
	SnoopMemory.Clear;
	ClearAllList;
	SynchronizeListWithListView;
	ListView := GetActiveListView;
	if ListView = nil then exit;
	ListView.Items.BeginUpdate;
	ListView.Items.EndUpdate;
	mmData.Lines.Clear;
end;

procedure TMainForm.ActionOptionExecute(Sender: TObject);
begin
	if OptionForm = nil then
		OptionForm := TOptionForm.Create(Application);
	OptionForm.ShowModal;
end;

procedure TMainForm.ActionOpenFileExecute(Sender: TObject);
begin
	if odFile.Execute then
	begin
		_Global.FileName := odFile.FileName;
		_Global.OpenType := 2; // File Capture
		_Global.Save;
		ActionOpen.Execute;
	end;
end;

procedure TMainForm.ActionSaveExecute(Sender: TObject);
var
	Node: PSnoopMemoryNode;
	Succeed: Boolean;
begin
	if NewFileName = '' then
	begin
		if not sdFile.Execute then exit;
		NewFileName := sdFile.FileName;
	end;
	if SnoopDump.Active then // if need to save
	begin
		Node := SnoopMemory.HeaderNode;
		while Node <> nil do
		begin
			SnoopDump.Write(@Node^.PacketHeader, Node^.Data);
			Node := SnoopMemory.GetNext(Node);
		end;
		SnoopDump.Close;
		SnoopMemory.Clear;
	end;

	if ExtractFileExt(ExistingFileName) = '.$$$' then
	begin
		if FileExists(NewFileName) then
			DeleteFile(NewFileName);
		Succeed := MoveFile(PChar(ExistingFileName), PChar(NewFileName))
	end else
		Succeed := CopyFile(PChar(ExistingFileName), PChar(NewFileName), false);
	if Succeed then
	begin
		ExistingFileName := NewFileName;
		IsNeedToSave := false;
	end else
	begin
		Application.MessageBox(PChar('Error $' + IntToHex(GetLastError, 4)),
			'Error', MB_ICONERROR);
	end;
	SetControl;
end;

procedure TMainForm.ActionSaveAsExecute(Sender: TObject);
begin
	if sdFile.Execute then
	begin
		if NewFileName = sdFile.FileName then
		begin
			Application.MessageBox('Same file name', 'Error', MB_ICONERROR);
			exit;
		end;
		NewFileName := sdFile.FileName;
		ActionSave.Enabled := true;
		ActionSave.Execute;
	end;
end;

procedure TMainForm.ActionExitExecute(Sender: TObject);
begin
	Close;
end;

procedure TMainForm.ActionAboutExecute(Sender: TObject);
begin
	if AboutForm = nil then
		AboutForm := TAboutForm.Create(Application);
	AboutForm.ShowModal;
end;

procedure TMainForm.ActionHomePageExecute(Sender: TObject);
begin
	ShellExecute(0, 'open', 'http://www.snoopanalyzer.com', nil, nil, SW_SHOW);
end;

procedure TMainForm.ActionPacketFieldExecute(Sender: TObject);
var
	ListView: TListView;
begin
	ListView := GetActiveListView;
	if ListView = nil then exit;
	if PacketFieldForm = nil then
		PacketFieldForm := TPacketFieldForm.Create(Application);
	PacketFieldForm.ListView := ListView;
	PacketFieldForm.ShowModal;
end;

procedure TMainForm.Snoop1GetRemoteAdapterInfo(Sender: TObject;
  AdapterNames, AdapterDescriptions: TStringList;
  var AdapterIndex: Integer);
var
	Index: Integer;
begin
	if _Global.DontShowJustOne and (AdapterNames.Count = 1) then
	begin
		AdapterIndex := 0;
		exit;
	end;
	if RemoteAdapterForm = nil then
		RemoteAdapterForm := TRemoteAdapterForm.Create(Application);
	RemoteAdapterForm.lbRemoteAdapter.Items := AdapterDescriptions;
	RemoteAdapterForm.ShowModal;
	if RemoteAdapterForm.ModalResult = mrOk then
	begin
		Index := RemoteAdapterForm.lbRemoteAdapter.ItemIndex;
		if Index >= 0 then
			AdapterIndex := Index;
	end;
end;

procedure TMainForm.pcViewChange(Sender: TObject);
begin
	ActiveListViewIndex := pcView.ActivePageIndex;
	SynchronizeListWithListView;
end;

procedure TMainForm.lvDataChange(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
	ViewData;
end;

procedure TMainForm.chkViewHexaClick(Sender: TObject);
begin
	LastListItem := nil;
	ViewData;
end;

procedure TMainForm.Snoop1Capture(Sender: TObject;
  PacketHeader: PPCAP_PKTHDR; EthernetHeader: PETHERNET_HDR);
var
	Node: PSnoopMemoryNode;
	IPHeader: PIP_HDR;
	TCPHeader: PTCP_HDR;
	UDPHeader: PUDP_HDR;
begin
	IsNeedToSave := true;
	if _Global.OpenType <> 2 then // if not File Capture
		CapturingForm.Process(PacketHeader, EthernetHeader);
	Node := SnoopMemory.Enqueue(PacketHeader, PChar(EthernetHeader));
	EthernetList.Add(Node);
	if snoopIsIP(EthernetHeader, @IPHeader) then
	begin
		IPList.Add(Node);
		if snoopIsTCP(IPHeader, @TCPHeader) then
		begin
			TCPList.Add(Node);
			if snoopIsTCPData(IPHeader, TCPHeader) then
				TCPDataList.Add(Node);
		end else
		if snoopIsUDP(IPHeader, @UDPHeader) then
		begin
			UDPList.Add(Node);
			if snoopIsUDPData(IPHeader, UDPHeader) then
				UDPDataList.Add(Node);
		end else
		if snoopIsICMP(IPHeader) then
			ICMPList.Add(Node);
	end else
	if snoopIsARP(EthernetHeader) then
		ARPList.Add(Node);
	if _Global.ThreadSafe then
		ViewPacket;
end;

procedure TMainForm.lvEthernetData(Sender: TObject; Item: TListItem);
var
	i: Integer;
	Node: PSnoopMemoryNode;
	PacketHeader: PPCAP_PKTHDR;
	EthernetHeader: PETHERNET_HDR;
begin
	i := Item.Index;
	if i >= EthernetList.Count then exit;
	Node := PSnoopMemoryNode(EthernetList.Items[i]);
	PacketHeader := @Node^.PacketHeader;
	EthernetHeader := @Node^.Data[0];

	Common.AddPacketHeader(Item, PacketHeader);
	Common.AddEthernet(Item, EthernetHeader);
end;

procedure TMainForm.lvIPData(Sender: TObject; Item: TListItem);
var
	i: Integer;
	Node: PSnoopMemoryNode;
	PacketHeader: PPCAP_PKTHDR;
	EthernetHeader: PETHERNET_HDR;
	IPHeader: PIP_HDR;
begin
	i := Item.Index;
	if i >= IPList.Count then exit;
	Node := PSnoopMemoryNode(IPList.Items[i]);
	PacketHeader := @Node^.PacketHeader;
	EthernetHeader := @Node^.Data[0];

	if not snoopIsIP(EthernetHeader, @IPHeader) then exit;

	Common.AddPacketHeader(Item, PacketHeader);
	Common.AddEthernet(Item, EthernetHeader);
	Common.AddIP(Item, IPHeader);
end;

procedure TMainForm.lvARPData(Sender: TObject; Item: TListItem);
var
	i: Integer;
	Node: PSnoopMemoryNode;
	PacketHeader: PPCAP_PKTHDR;
	EthernetHeader: PETHERNET_HDR;
	ARPHeader: PARP_HDR;
begin
	i := Item.Index;
	if i >= ARPList.Count then exit;
	Node := PSnoopMemoryNode(ARPList.Items[i]);
	PacketHeader := @Node^.PacketHeader;
	EthernetHeader := @Node^.Data[0];

	if not snoopIsARP(EthernetHeader, @ARPHeader) then exit;

	Common.AddPacketHeader(Item, PacketHeader);
	Common.AddEthernet(Item, EthernetHeader);
	Common.AddARP(Item, ARPHeader);
end;

procedure TMainForm.lvICMPData(Sender: TObject; Item: TListItem);
var
	i: Integer;
	Node: PSnoopMemoryNode;
	PacketHeader: PPCAP_PKTHDR;
	EthernetHeader: PETHERNET_HDR;
	IPHeader: PIP_HDR;
	ICMPHeader: PICMP_HDR;
begin
	i := Item.Index;
	if i >= ICMPList.Count then exit;
	Node := PSnoopMemoryNode(ICMPList.Items[i]);
	PacketHeader := @Node^.PacketHeader;
	EthernetHeader := @Node^.Data[0];

	if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
	if not snoopIsICMP(IPHeader, @ICMPHeader) then exit;

	Common.AddPacketHeader(Item, PacketHeader);
	Common.AddEthernet(Item, EthernetHeader);
	Common.AddIP(Item, IPHeader);
	Common.AddICMP(Item, ICMPHeader);
end;

procedure TMainForm.lvTCPData1(Sender: TObject; Item: TListItem);
var
	i: Integer;
	Node: PSnoopMemoryNode;
	PacketHeader: PPCAP_PKTHDR;
	EthernetHeader: PETHERNET_HDR;
	IPHeader: PIP_HDR;
	TCPHeader: PTCP_HDR;
	TCPData: PChar;
	TCPDataLen: Integer;
	CheckDataLen: Integer;
begin
	i := Item.Index;
	if i >= TCPList.Count then exit;
	Node := PSnoopMemoryNode(TCPList.Items[i]);
	PacketHeader := @Node^.PacketHeader;
	EthernetHeader := @Node^.Data[0];

	if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
	if not snoopIsTCP(IPHeader, @TCPHeader) then exit;
	snoopIsTCPData(IPHeader, TCPHeader, @TCPData, @TCPDataLen);
	CheckDataLen := ntohs(IPHeader^.Length) - sizeof(IP_HDR) - sizeof(TCP_HDR);
	if TCPDataLen > CheckDataLen then
		TCPDataLen := CheckDataLen;

	Common.AddPacketHeader(Item, PacketHeader);
	Common.AddEthernet(Item, EthernetHeader);
	Common.AddIP(Item, IPHeader);
	Common.AddTCP(Item, TCPHeader);
	Common.AddTCPData(Item, TCPData, TCPDataLen);
end;

procedure TMainForm.lvUDPData1(Sender: TObject; Item: TListItem);
var
	i: Integer;
	Node: PSnoopMemoryNode;
	PacketHeader: PPCAP_PKTHDR;
	EthernetHeader: PETHERNET_HDR;
	IPHeader: PIP_HDR;
	UDPHeader: PUDP_HDR;
	UDPData: PChar;
	UDPDataLen: Integer;
	CheckDataLen: Integer;
begin
	i := Item.Index;
	if i >= UDPList.Count then exit;
	Node := PSnoopMemoryNode(UDPList.Items[i]);
	PacketHeader := @Node^.PacketHeader;
	EthernetHeader := @Node^.Data[0];

	if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
	if not snoopIsUDP(IPHeader, @UDPHeader) then exit;
	snoopIsUDPData(IPHeader, UDPHeader, @UDPData, @UDPDataLen);
	CheckDataLen := ntohs(IPHeader^.Length) - sizeof(IP_HDR) - sizeof(UDP_HDR);
	if UDPDataLen > CheckDataLen then
		UDPDataLen := CheckDataLen;

	Common.AddPacketHeader(Item, PacketHeader);
	Common.AddEthernet(Item, EthernetHeader);
	Common.AddIP(Item, IPHeader);
	Common.AddUDP(Item, UDPHeader);
	Common.AddUDPData(Item, UDPData, UDPDataLen);
end;

procedure TMainForm.lvTCPDataData(Sender: TObject; Item: TListItem);
var
	i: Integer;
	Node: PSnoopMemoryNode;
	PacketHeader: PPCAP_PKTHDR;
	EthernetHeader: PETHERNET_HDR;
	IPHeader: PIP_HDR;
	TCPHeader: PTCP_HDR;
	TCPData: PChar;
	TCPDataLen: Integer;
	CheckDataLen: Integer;
begin
	i := Item.Index;
	if i >= TCPDataList.Count then exit;
	Node := PSnoopMemoryNode(TCPDataList.Items[i]);
	PacketHeader := @Node^.PacketHeader;
	EthernetHeader := @Node^.Data[0];

	if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
	if not snoopIsTCP(IPHeader, @TCPHeader) then exit;
	if not snoopIsTCPData(IPHeader, TCPHeader, @TCPData, @TCPDataLen) then exit;
	CheckDataLen := ntohs(IPHeader^.Length) - sizeof(IP_HDR) - sizeof(TCP_HDR);
	if TCPDataLen > CheckDataLen then
		TCPDataLen := CheckDataLen;

	Common.AddPacketHeader(Item, PacketHeader);
	Common.AddEthernet(Item, EthernetHeader);
	Common.AddIP(Item, IPHeader);
	Common.AddTCP(Item, TCPHeader);
	Common.AddTCPData(Item, TCPData, TCPDataLen);
end;

procedure TMainForm.lvUDPDataData(Sender: TObject; Item: TListItem);
var
	i: Integer;
	Node: PSnoopMemoryNode;
	PacketHeader: PPCAP_PKTHDR;
	EthernetHeader: PETHERNET_HDR;
	IPHeader: PIP_HDR;
	UDPHeader: PUDP_HDR;
	UDPData: PChar;
	UDPDataLen: Integer;
	CheckDataLen: Integer;
begin
	i := Item.Index;
	if i >= UDPDataList.Count then exit;
	Node := PSnoopMemoryNode(UDPDataList.Items[i]);
	PacketHeader := @Node^.PacketHeader;
	EthernetHeader := @Node^.Data[0];

	if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
	if not snoopIsUDP(IPHeader, @UDPHeader) then exit;
	if not snoopIsUDPData(IPHeader, UDPHeader, @UDPData, @UDPDataLen) then exit;
	CheckDataLen := ntohs(IPHeader^.Length) - sizeof(IP_HDR) - sizeof(UDP_HDR);
	if UDPDataLen > CheckDataLen then
		UDPDataLen := CheckDataLen;

	Common.AddPacketHeader(Item, PacketHeader);
	Common.AddEthernet(Item, EthernetHeader);
	Common.AddIP(Item, IPHeader);
	Common.AddUDP(Item, UDPHeader);
	Common.AddUDPData(Item, UDPData, UDPDataLen);
end;

end.

⌨️ 快捷键说明

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