AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte IP Scanner
Thema durchsuchen
Ansicht
Themen-Optionen

IP Scanner

Ein Thema von Neutral General · begonnen am 2. Jan 2006 · letzter Beitrag vom 17. Apr 2006
Antwort Antwort
Seite 6 von 9   « Erste     456 78     Letzte »    
Benutzerbild von Neutral General
Neutral General
Registriert seit: 16. Jan 2004
Hi,

Mein IP Scanner ist ein kleines Tool mit dem man alle IP Adressen im Netzwerk anzeigen kann.
Hinter der IP-Adresse wird der Computername angezeigt.

Gruß
Michael
Miniaturansicht angehängter Grafiken
screenneu_997.jpg  
Angehängte Dateien
Dateityp: zip ipscanner_139.zip (232,6 KB, 691x aufgerufen)
 
Benutzerbild von FriFra
FriFra

 
Delphi 2005 Professional
 
#51
  Alt 4. Jan 2006, 09:56
Zitat von faux:
Wie kann man denn auf einen bestimmten Port pingen?
Entweder Ping oder nicht Ping, aber auf einen Port Pingen...?!
Pingen kann man nicht auf Port 80, aber ein TCP-connect ist schon möglich. Aber wozu soll das gut sein? Es gibt viele Clients mit und viele Clients ohne Webserver, daran kann man auch nicht erkennen, worum es sich handelt... wozu sollte das also gut sein?
  Mit Zitat antworten Zitat
ehoffman

 
Delphi 2006 Enterprise
 
#52
  Alt 4. Jan 2006, 10:55
Zitat von FriFra:
Pingen kann man nicht auf Port 80, aber ein TCP-connect ist schon möglich. Aber wozu soll das gut sein? Es gibt viele Clients mit und viele Clients ohne Webserver, daran kann man auch nicht erkennen, worum es sich handelt... wozu sollte das also gut sein?
Ok, hier wird der Begriff "Ping" halt anders verwendet - gemeint ist (und das macht das Programm) ein TCP connect auf Port 80. Im übrigen kann man damit ziemlich gut feststellen ob ein Rechner "existiert" oder nicht. So machen es die üblichen Portscanner (wie z.B. nmap) ja auch. Genutzt wird dazu der 3-Wege-Handshake von TCP.

Siehe: http://de.wikipedia.org/wiki/Transmi...Wege-Handshake

Dabei sende der Client der die Verbindung aufbauen will ein TCP-Paket mit gesetztem SYN-Bit und der Sequenznnummer N an den Server. Der Server antwortet dann mit einem TCP-Paket mit:
  • SYN-Bit und eigener initialer Sequenznummer Y und
  • gesetztem ACK-Bit + Sequenznummer des Clients plus 1 (N+1).
Der Client antwortet dann darauf mit einem ACK und Sequenznummer Y+1. Die Verbindung ist jetzt aufgebaut und das Scannprogramm "weiss" nun das es dort einen Rechner gibt und der Port geöffnet ist.

Ist der Port geschlossen sollte ein normaler TCP/IP-Stack mit einem TCP-Paket antworten in welchem das RST (Reset) Bit gesetzt ist. Der Scanner "weiss" dann, ok da ist ein Rechner aber der Port ist geschlossen. Antwortet der Server überhaupt nicht, dann gibt es zwei Möglichkeiten: Entweder da ist kein Rechner mit dieser IP-Adresse oder da ist ein Rechner mit Firewall, wobei die Firewall so konfiguriert ist das Verbindungswünsche auf eben diesem Port ohne Antwort gefiltert (Firewallregel DROP) werden (In diesem Fall gibt z.B. nmap dann "filtered" aus, wobei das eben auch "kein Rechner" bedeuten kann. Daher scannt man immer mehr als einen Port )

Rechtlich gesehen ist übrigens bereits das Portscanning von fremden Rechnern strafbar und wird als "Angriff auf fremde Rechnersysteme" gewertet. Das ist im übrigen auch ganz gut so, da die meisten DDoS-Attacken oben genannten 3-Wege-Handshake zum lahmlegen der Server benutzen (Wenn nach dem Verbindungsaufbau die Verbindung nicht korrekt geschlossen, sondern einfach abgebrochen wird, dann wartet der Server auf eigehende Datenpakete bis ein meist recht langes Timeout abläuft. Machen das viele Clients sehr oft, dann wartet der Server nur noch und kann seinen eigentlichen Diensten nicht mehr nachkommen).

So nun aber genug "kluggeschi****".

Viele Grüße,
Eike
Eike
  Mit Zitat antworten Zitat
pacman1986

 
Delphi 2005 Personal
 
#53
  Alt 19. Jan 2006, 14:52
was muss ich binden wenn ich den ping befehl benutzen will? oder hast du das selbst geproggt ?
Christian N.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

 
Delphi 10.2 Tokyo Professional
 
#54
  Alt 19. Jan 2006, 15:02
von den Indys den TIDIcmpClient.
Michael
  Mit Zitat antworten Zitat
pacman1986

 
Delphi 2005 Personal
 
#55
  Alt 19. Jan 2006, 15:27
tx
Christian N.
  Mit Zitat antworten Zitat
CPP-Programmer

 
Delphi 3 Professional
 
#56
  Alt 22. Jan 2006, 12:10
Source text wäre nicht schlecht!

(zum weiterbasteln)
  Mit Zitat antworten Zitat
Benutzerbild von robinWie
robinWie

 
Delphi 2005 Personal
 
#57
  Alt 22. Jan 2006, 12:17
Zitat:
Source text wäre nicht schlecht!
Ich benutze diese Unit. Die habe ich mal hier aus der DP runtergeladen und mit GetHost_Name ausgebaut.
Vielleicht kanss du die ja brauchen.

Delphi-Quellcode:
unit NetworkFunctions;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinInet, WinSock;

type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array[0..100] of TNetResource;

type
  IPAddr = DWORD;

  PICMP_ECHO_REPLY = ^ICMP_ECHO_REPLY;
  ICMP_ECHO_REPLY = packed record
    Address : ULONG;
    Status : ULONG;
    RoundTripTime : ULONG;
    DataSize : WORD;
    Reserved : WORD;
    Data : Pointer;
  end;

  PIP_OPTION_INFORMATION = ^IP_OPTION_INFORMATION;
  IP_OPTION_INFORMATION = packed record
    Ttl : byte;
    Tos : byte;
    Flags : byte;
    OptionsSize : byte;
    OptionsData : Pointer;
  end;

procedure GetComputerList(List: TStrings);
function InternetAvailable:Boolean; // Only DFÜ / RAS
function Ping(IP:string; TimeOut:Cardinal) : Boolean; // TimeOut ~1000
function GetNetworkName(IPAddr: string): string;
function GetIp(const HostName: string): string;
function GetHost_Name(IPAddr: string): string;

implementation

function IcmpCreateFile : DWORD; stdcall; external 'icmp.dll';
function IcmpCloseHandle(const IcmpHandle : DWORD) : longbool; stdcall; external 'icmp.dll';
function IcmpSendEcho(const IcmpHandle : DWORD;const DestinationAddress : IPAddr;const RequestData : Pointer;const RequestSize : WORD;const RequestOptions : PIP_OPTION_INFORMATION;const ReplyBuffer : Pointer;const ReplySize : DWORD;const TimeOut : DWORD) : DWORD; stdcall; external 'icmp.dll'

function GetNetworkName(IPAddr: string): string;
  var SockAddrIn: TSockAddrIn;
      HostEnt: PHostEnt;
      WSAData: TWSAData;
begin
  WSAStartup($101, WSAData);
  SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
  HostEnt:= GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
  if HostEnt <> nil then
    Result := StrPas(Hostent^.h_name)
  else
    Result := '';
end;

function GetIp(const HostName: string): string;
  type
    TaPInAddr = array[0..10] of PInAddr;
    PaPInAddr = ^TaPInAddr;
  var
    phe: PHostEnt;
    pptr: PaPInAddr;
    i: Integer;
    GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  Result := '';
  phe := GetHostByName(PChar(HostName));
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  i := 0;
  while pPtr^[i] <> nil do begin
    Result := inet_ntoa(pptr^[i]^);
    Inc(i);
  end;
  WSACleanup;

end;

function Ping(IP:string; TimeOut:Cardinal):Boolean;
  var hICMP : DWORD;
      pierWork : PICMP_ECHO_REPLY;
      dwSize : DWORD;
      Class1,Class2,Class3,Class4 : String;
      i,j : Byte;
begin
  Result:=False;
  j:=1;
  for i:=1 to Length(IP) do begin
    if IP[i]<>'.then begin
      case j of
        1: Class1:=Class1+IP[i];
        2: Class2:=Class2+IP[i];
        3: Class3:=Class3+IP[i];
        4: Class4:=Class4+IP[i];
      end;
    end else
      Inc(j);
  end;
  hICMP := IcmpCreateFile;
  if hICMP = INVALID_HANDLE_VALUE then exit;
  try
    dwSize := SizeOf(ICMP_ECHO_REPLY)+8;
    pierWork := AllocMem(dwSize);
    try
      if IcmpSendEcho(hICMP,MAKELONG(MAKEWORD(StrToInt(Class1), StrToInt(Class2)),MAKEWORD(StrToInt(Class3), StrToInt(Class4))),nil,0,nil,pierWork,dwSize,TimeOut) = 0 then
        Result:=False
      else
        Result:=True;
    finally
      FreeMem(pierWork,dwSize);
    end;
  finally
    IcmpCloseHandle(hIcmp);
  end;
end;

  // Nur für DFÜ / RAS
function InternetAvailable:Boolean;
begin
  Result := InternetCheckConnection(nil, 0, 0);
end;

function CreateNetResourceList(ResourceType: DWord;
                              NetResource: PNetResource;
                              out Entries: DWord;
                              out List: PNetResourceArray): Boolean;
var
  EnumHandle: THandle;
  BufSize: DWord;
  Res: DWord;
begin
  Result := False;
  List := Nil;
  Entries := 0;
  if WNetOpenEnum(RESOURCE_GLOBALNET,ResourceType,0,NetResource,EnumHandle) = NO_ERROR then begin
    try
      BufSize := $4000; // 16 kByte
      GetMem(List, BufSize);
      try
        repeat
          Entries := DWord(-1);
          FillChar(List^, BufSize, 0);
          Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
          if Res = ERROR_MORE_DATA then begin
            ReAllocMem(List, BufSize);
          end;
        until Res <> ERROR_MORE_DATA;

        Result := Res = NO_ERROR;
        if not Result then begin
          FreeMem(List);
          List := Nil;
          Entries := 0;
        end;
      except
        FreeMem(List);
        raise;
      end;
    finally
      WNetCloseEnum(EnumHandle);
    end;
  end;
end;

procedure GetComputerList(List: TStrings);
  procedure ScanLevel(ResourceType, DisplayType: DWord; NetResource: PNetResource);
  var
    Entries: DWord;
    NetResourceList: PNetResourceArray;
    i: Integer;
  begin
    if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try
      for i := 0 to Integer(Entries) - 1 do begin
        if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or
          (NetResourceList[i].dwDisplayType = DisplayType) then begin
          List.AddObject(NetResourceList[i].lpRemoteName,
                        Pointer(NetResourceList[i].dwDisplayType));
        end;
        if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
          ScanLevel(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER,@NetResourceList[i]);
      end;
    finally
      FreeMem(NetResourceList);
    end;
  end;
begin
  ScanLevel(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, Nil);
end;

function LocalIP: string;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer: array[0..63] of Char;
  I: Integer;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  Result := '';
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(buffer);
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  I := 0;
  while pPtr^[I] <> nil do
  begin
    Result := inet_ntoa(pptr^[I]^);
    Inc(I);
  end;
  WSACleanup;
end;

function GetHost_Name(IPAddr: string): string;
var
  SockAddrIn: TSockAddrIn;
  HostEnt: PHostEnt;
  WSAData: TWSAData;
begin
  WSAStartup($101, WSAData);
  SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
  HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
  if HostEnt <> nil then
    Result := StrPas(Hostent^.h_name)
  else
    Result := 'Unbekannt';
end;

end.
Robin W.
  Mit Zitat antworten Zitat
CPP-Programmer

 
Delphi 3 Professional
 
#58
  Alt 22. Jan 2006, 19:12
Da sag ich mal ein big thx!
  Mit Zitat antworten Zitat
Chrissi91
 
#59
  Alt 22. Jan 2006, 19:54
Hi ,

gar nicht mal so schlecht, jetzt wunder ich mich aber ein bisschen.

Fritzbox <-- Mein Vater, wo die eigentliche Internetverbindung ist.
Chrissi <-- Das bin ich. Mit W-Lan verbunden.
Unbekannt <--

Ist Unbekannt vielleicht der PC meines Vaters und Fritzbox nur die Internetverbindung?

P.S.: Super Programm. Wäre als Open-Source sicher nicht schlecht.
Miniaturansicht angehängter Grafiken
unbenannt_284.gif  
  Mit Zitat antworten Zitat
ringli

 
Delphi 11 Alexandria
 
#60
  Alt 22. Jan 2006, 20:25
Ich bekomme mit dem Scanner gar nichts angezeigt wenn ich als normaler Benutzer angemeldet bin. Als Admin funktioniert es. Ist aber ein typischer Fehler wenn die Indy's benutzt werden...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 9   « Erste     456 78     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz