Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   FreePascal Packet-Sniffer (https://www.delphipraxis.net/164590-packet-sniffer.html)

thomasschaf 20. Nov 2011 15:15


Packet-Sniffer
 
Hallo,

ich versuche, einen Packet-Sniffer zu bauen.

Dabei benutze ich diese Vorlage.

Habe mir dazu eine Form gebastelt, "On-Events" zugewiesen und versucht zu kompilieren.

Der erste Fehler tritt auf:
unit1.pas(213,14) Error: Identifier not found "pipheader2"
Ich hoffte, dies sei ein Tippfehler vom Autor und habe alle pipheader2 durch pipheader ersetzt.

Folgendes hat sich erledigt:
Dann kommt aber eine Fehlermeldung, mit der ich nicht viel anfangen kann und mich aufhält:
unit1.pas(214,16) Error: Illegal qualifier
Das bezieht sich auf:
Delphi-Quellcode:
  if pipheader.Protocol = 6 then ...
Damit ist (so glaube ich) gemeint, dass der Compiler mit dem ".Protocol" nicht anzufangen weiß, da sich dort auch der Cursor hinsetzt.

Es ist ja pipheader vom Typ TIPHeaderPtr.
Der wurde ja am Anfang definiert (siehe Quelle):

Delphi-Quellcode:
  TIPHeaderPtr = ^TIPHeader;

  TIPHeader = packed record
    VerLen:  byte;
    TOS:     byte;
    TotalLen: word;
    Identifer: word;
    FragOffsets: word;
    TTL:     byte;
    Protocol: byte; // Da ist auch "Protocol"
    CheckSum: word;
    SourceIp: DWORD;
    DestIp:  DWORD;
    Options: DWORD;
  end;

  ...
Es ist auch (siehe Kommentar) Protocol als Eigenschaft/Property(?) definiert, es wird aber nicht darauf zugegriffen.

Was soll ich tun ?
Es sind vielleicht Einstellungen im Compiler zu machen ?


UPDATE
Nun habe ich folgendes ausprobiert, was mir geholfen hat, sodass das Projekt compiliert!
Delphi-Quellcode:
//{$mode objfpc}{$H+}
{$mode delphi}{$H+}
Nun gibts einen Fehler hier:
Delphi-Quellcode:
    Result := bind(RawSocket, sa, sizeof(sa));
    if Result = SOCKET_ERROR then
      raise Exception.Create('bind failed');
Habe die Exception mittels "on e:Except..." abgefangen:
Exception : bind failed

Was soll ich nun tun ?

(Habe das Projekt mal angehängt.)

Vielen Dank

THOMAS

Uwe Raabe 20. Nov 2011 15:31

AW: Packet-Sniffer
 
Ich weiß nicht, wie es bei FreePascal ist, aber bei Delphi werden Pointer-Referenzen wenn nötig standardmäßig automatisch aufgelöst.
Delphi-Quellcode:
pipheader.protocol
entspricht also eigentlich
Delphi-Quellcode:
pipheader^.protocol
.

thomasschaf 20. Nov 2011 15:38

AW: Packet-Sniffer
 
Hallo,

(Siehe Update)

zur Vollständigkeit möchte ich die veränderte Version hochladen.

Ich habe ein "on e:except do..." eingebunden, um Fehler auszuwerten.

Vielen Dank

thomasschaf 20. Nov 2011 16:06

AW: Packet-Sniffer
 
Mit GetLastError erhalte ich:

Exception : bind failed / 10013 / Der Zugriff auf einen Socket war aufgrund der Zugriffsrechte des Sockets unzul?ssig.

Habe über die Fehlermeldung nichts Brauchbares finden können.

Was bedeutet dieser Fehler ?

Klaus01 20. Nov 2011 16:12

AW: Packet-Sniffer
 
Hallo,

einen RAW_SOCKET kann in der Regel nur der root user (bzw. ein User mit dessen Rechten) öffnen.

Grüße
Klaus

thomasschaf 20. Nov 2011 16:22

AW: Packet-Sniffer
 
Falls du das meinst, was ich meine:

Mir ist gerade (auch) aufgefallen, dass es mit Admin-Rechten klappt.

Warum geht das denn als "eingeschränkter, normaler" Nutzer nicht :?:

Klaus01 20. Nov 2011 17:06

AW: Packet-Sniffer
 
Zitat:

Zitat von thomasschaf (Beitrag 1137106)
Warum geht das denn als "eingeschränkter, normaler" Nutzer nicht :?:


Ich denke, dass es aus Sicherheitsgründen eingeschränkt ist.

Grüße
Klaus

thomasschaf 20. Nov 2011 22:22

AW: Packet-Sniffer
 
Ok, das wäre natürlich möglich.

So habe ich wenigstens den Fehler gefunden.

Danke sehr.

JamesTKirk 21. Nov 2011 09:01

AW: Packet-Sniffer
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1137101)
Ich weiß nicht, wie es bei FreePascal ist, aber bei Delphi werden Pointer-Referenzen wenn nötig standardmäßig automatisch aufgelöst.
Delphi-Quellcode:
pipheader.protocol
entspricht also eigentlich
Delphi-Quellcode:
pipheader^.protocol
.

Das funktioniert in Free Pascal nur im Modus Delphi. In den anderen Modi ist das nicht erlaubt, um die "Striktheit" der Sprache wieder sicherzustellen (ich persönlich habe es ganz gern, wenn mich der Compiler auf sowas mit einem Fehler aufmerksam macht :mrgreen: ).

Daher ergibt sich auch die Lösung von thomasschaf das
Delphi-Quellcode:
{$mode objfpc}
durch
Delphi-Quellcode:
{$mode delphi}
zu ersetzen.

Gruß,
Sven

thomasschaf 21. Nov 2011 15:24

AW: Packet-Sniffer
 
Wo man dann gerade dabei ist:
Wenn ich am Anfang
Delphi-Quellcode:
{$mode delphi}
setze, bedeutet das dann, dass der Compiler auf den Delphi-Modus umstellt, also alles wie in Delphi-Language behandelt wird ?

Wozu kaufen sich dann die Leute Delphi ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz