Einzelnen Beitrag anzeigen

C0pa

Registriert seit: 25. Mai 2010
Ort: Laudenbach
23 Beiträge
 
#1

UDP Paket senden Snoop Komponente

  Alt 25. Mai 2010, 21:34
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.
  Mit Zitat antworten Zitat