Heyho,
ich habe eine Frage, und zwar benutze ich die
Snoop Komponenten (das Projekt zur Entwicklung dieser Komponente ist meines Wissens derzeit eingestellt) zum mitschneiden und analysieren des Datenverkehrs (genauer gesagt des Protokolls UDP).
Das funktioniert auch alles wie es soll. Nun muss ich aber auch UDP Pakete versenden können die einen bestimmten Inhalt haben. Bei der
Snoop Komponente lagen einige Beispiele dabei. Mir ist jedoch Rätselhaft WARUM diese denn funktionieren. (der Quellcode zu diesen Beispielen kommt gleich). Ich habe mir auf Wiki den etwas ernüchternden UDP Eintrag angeschaut, es wird zwar genau gesagt wie man eine Checksumme erstellt aber mehr auch nicht.
Was ich für Informationen habe:
[+] Source- und Destination
IP
[+] Inhalt des zusendenden Pakets in Hexadezimal schreibweise
Beispiel Source einer
Snoop Anwendung welche ein
TCP Paket versendet (dies funktioniert)
Delphi-Quellcode:
procedure TMainForm.btnSendClick(Sender: TObject);
const
MAX_PACKET_SIZE = 1000;
var
i: Integer;
Size: Integer;
Buffer: array[0 .. MAX_PACKET_SIZE - 1] of Char;
BufferStr: String;
Ch: Byte;
begin
if not Snoop1.Active then
begin
Snoop1.AdapterIndex := cbxAdapter.ItemIndex;
Snoop1.Open;
end;
if not Snoop1.Active then
begin
ShowMessage(Snoop1.Error);
exit;
end;
BufferStr := edBuffer.Text;
Size := 0;
while BufferStr <> '' do
begin
i := Pos(' ', BufferStr);
if i = 0 then i := Length(BufferStr) + 1;
Ch := StrToInt('$' + Copy(BufferStr, 1, i - 1));
Buffer[Size] := Chr(Ch);
BufferStr := Copy(BufferStr, i + 1, Length(BufferStr) - i);
inc(Size);
end;
if snoopSendPacket(Snoop1.Pcap, Buffer, Size) = 0 then // if the packet is succesfully sent
ShowMessage('Packet is successfully sent')
else
ShowMessage('Fail to send packet');
Snoop1.Close;
end;
function snoopSendPacket(Pcap: PPcap; Buffer: PChar; Size: Integer): Integer;
begin
Result := pcap_sendpacket(Pcap, Buffer, Size);
end;
Mehr Einstellungen werden nicht getroffen. Wo soll ich nun einstellen an welche
IP das Ganze gesendet werden und wo stelle ich überhaupt das Protokoll ein?!
Ein weiteres Bespiel setzt dann anscheinend das Protokoll, aber mir ist nicht ganz ersichtlich, wo dieses denn von
Snoop eingelesen wird, da zwar die Variablen alles belegt werden aber diese keiner Snoopfunktion oder einem für
Snoop relevanten Parameter übergeben werden.
Delphi-Quellcode:
procedure snoopSendTCPBlock(Pcap: PPcap;
MyMac: PMACADDR;
ETHHdr: PETH_HDR;
IPHdr: PIP_HDR;
TCPHdr: PTCP_HDR);
const
TCP_BLOCK_DATA_SIZE = sizeof(ETH_HDR) + sizeof(IP_HDR) + sizeof(TCP_HDR);
var
MyBuffer:
array [0 .. TCP_BLOCK_DATA_SIZE - 1]
of Char;
MyETHHdr: PETH_HDR;
MyIPHdr: PIP_HDR;
MyTCPHdr: PTCP_HDR;
TCPDataLen: Integer;
begin
// My Hdr
MyETHHdr := @MyBuffer[0];
MyIPHdr := PIP_HDR(UINT32(MyETHHdr) + sizeof(ETH_HDR));
MyTCPHdr := PTCP_HDR(UINT32(MyIPHdr) + sizeof(IP_HDR));
// Set Ethernet Hdr
MyETHHdr^.Destination := ETHHdr^.Destination;
MyETHHdr^.Source := MyMac^;
MyETHHdr^.Protocol := ETHHdr^.Protocol;
// Set IP Hdr
MyIPHdr^.VerLen := IPHdr^.VerLen;
MyIPHdr^.Service := IPHdr^.Service;
MyIPHdr^.Length := ntohs(sizeof(IP_HDR) + sizeof(TCP_HDR));
MyIPHdr^.Ident := htons(ntohs(IPHdr^.Ident) + 1);
MyIPHdr^.FlagOff := htons(16384);
MyIPHdr^.TimeLive := 44;
MyIPHdr^.Protocol := PROTO_TCP;
MyIPHdr^.Source := IPHdr^.Source;
MyIPHdr^.Destination := IPHdr^.Destination;
// Set TCPHdr
MyTCPHdr^.Source := TCPHdr^.Source;
MyTCPHdr^.Destination := TCPHdr^.Destination;
if snoopIsTCPData(IPHdr, TCPHdr,
nil, @TCPDataLen)
then
begin
MyTCPHdr^.Seq := htonl(ntohl(TCPHdr^.Seq) + TCPDataLen);
end else
begin
MyTCPHdr^.Seq := TCPHdr^.Seq;
end;
MyTCPHdr^.Ack := TCPHdr^.Ack;
MyTCPHdr^.Off_Rsvd := $50;
MyTCPHdr^.Rsvd_Flags := $04;
MyTCPHdr^.Window := 0;
MyTCPHdr^.UrgPoint := 0;
// Calculate Checksum
MyTCPHdr^.Checksum := htons(snoopTCPChecksum(MyIPHdr, MyTCPHdr));
MyIPHdr^.Checksum := htons(snoopIPChecksum(MyIPHdr));
// SendPacket
snoopSendPacket(Pcap, @MyBuffer[0], TCP_BLOCK_DATA_SIZE);
end;
Wenn man diesen Code nimmt, hat man sich eine Art "Firewall" gebaut welche jede Anfrage an das Internet verhindert (zumindest
TCP).
Also mir ist es nun absolut ein Rätsel wo ich was einstellen soll. Hoffe mir kann jemand helfen.