Ich bastele gerade an einem kleinen
IP-Sniffer herum. Die Pakete fange ich richtig ab, also TTL, Paketgröße, Quell-Adresse sind richtig.
Nun will ich die Nutzdaten auslesen, und da haperts.
So sieht mein
IP-Paket aus:
Delphi-Quellcode:
type
ip_hdr = packed record
ip_verlen: u_char; //Version(4) und Länge(4)
ip_tos: u_char; //TOS(8)
ip_totallength: u_short; //Gesamtgröße(16)
ip_id: u_short; //Identifikation(16)
ip_offset: u_short; //Flags(3) und Fragment-Offset(13)
ip_ttl: u_char; //Time-to-live(8)
ip_protocol: u_char; //Protokoll(8)
ip_checksum: u_short; //Header-Prüfsumme(16)
ip_srcaddr: u_int; //Herkunftsadresse(32)
ip_destaddr: u_int; //Zieladresse(32)
end;
TIPHdr = ip_hdr;
Und so les ich die Pakete:
Delphi-Quellcode:
procedure GetPackets; stdcall;
var
recBytes: Integer;
buf: Array[0..999] of Byte;
sDisplay: string;
IPHdr: TIPHdr;
Inaddr: TInAddr;
packData: String;
dataSize: Integer;
p:Pointer;
begin
while true do
begin
recBytes := recv(S, buf, Length(buf), 0);
if recBytes > 0 then
begin
CopyMemory(@IPHdr, @buf, Sizeof(IPHdr));
InAddr.S_addr := IPHdr.ip_srcaddr;
dataSize := recBytes - Sizeof(IPHdr);
//hier versuche ich an den String zu kommen
p := Pointer(Integer(@buf) + Sizeof(IPHdr));
packData := String(p);
SetLength(packData, recBytes - Sizeof(IPHdr));
sDisplay := Format('%d Bytes erhalten: from %s with TTL %d. %d Bytes Nutzdaten %s:',[recBytes,inet_ntoa(InAddr),IPHdr.ip_ttl,dataSize,packData]);
Form1.Listbox1.Items.Add(sDisplay);
inc(recvPackets);
recvBytes := recvBytes + recBytes;
Form1.Statusbar1.Panels[0].Text := Format('%d Bytes in %d Paketen erhalten',[recvBytes,recvPackets]);
end;
end;
end;
In
buf kommen meine Daten. An der markierten Stelle versuche ich, an den String zu kommen. Nur klappt das anscheinend nicht. Kann mir einer helfen?