📄 main.pas
字号:
// 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 + -