PortScan

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

PortScan

Beitrag von DataMiner »

Hat jemand eine Ahnung wie man mit PB seinen PC auf offene Ports (TCP/IP) scannen kann?

:?
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Als fortgeschrittener Anfänger würde ich sagen, du gehst alle 65535 Ports einmal durch.
Per Hand natürlich nur, wenn du wahnsinnig bist :lol: , denn dafür gibt es ja die For-Schleife:

Code: Alles auswählen

InitNetwork()
For i = 1 To 65535
   temp = OpenNetworkConnection("AND-Computer", i)
   If temp
      CloseNetworkConnection(temp)
      Debug Str(i)+". Port ist offen"
      Beep_(2500, 750)
   Else
      Debug Str(i)+". Port ist zu oder Verbindung konnte nicht hergestellt werden."
   EndIf
Next
End
i wird bei jedem For-Schleifendurchlauf um eins erhöht.
Es wird versucht, eine Verbindung zu AND-Computer (kann IP Adresse oder Hostname sein) aufzubauen. Die VerbindungsID wird in temp gespeichert. Bei Erfolg ist temp größer als 0. Wenn temp größer als 0, dann schließe die Verbindung wieder und gebe die entsprechende Meldung aus. Bei Erfolg wird zusätzlich ein Piepton ausgegeben.
Nächster Schleifendurchlauf.

Allerdings habe ich beim Testen festgestellt, dass er bei mir nur 1 Port pro Sekunde scannt. Das heißt, er bräuchte 18 Stunden und 12 Minuten, um alle Ports zu scannen.
Beschränke dich daher auf einen bestimmten Bereich oder scanne mit einer selbstegschriebenen EXE die ersten 1.000, mit 'ner anderen EXe die nächsten 10.000 oder so...
Der erste bei mir offene Port ist der Port 135, das ergab der Test. Und während ich hier so schreibe, hat er gerade mal 631 Ports gescannt (und zwischendurch war einer an der Tür und ich musste Kaffee kochen...), also auf jedenfall die Ports aufteilen, wenn du alle scannen willst.

MfG, AND51
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Öffne doch mehrere tausend Ports gleichzeitig, zB mit Threads.

Ich versuch da mal was zu basteln.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Wenn du nur sehen willst, welche Ports an nem bestimmten PC offen sind (ohne die Daten jetzt großartig weiterzuverwenden), dann tuts der
"Shields Up!"-Test von grc.com sicher auch... :wink:
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Das funktioniert soweit. Bei mir dauert der Port-Test ca. 77 Sekunden (Schnapszahl ^^).

Allerdings, und das ist mir unverständlich, gibt er die Ports nicht aus, obwohl sie sich in der Liste befinden. Du musst im Debugger unter "Variablen" dir den Inhalt der Liste OpenPorts() anschauen.

Noch eine Warnung: Das Programm setzt den Rechner auf 100% CPU-Last. Im Schnitt verbraucht es bei mir 24 MB RAM, trotzdem wird die Windows-Auslagerungsdatei um etwa 100 MB vergrößert. Wer eine Firewall an hat, sollte sie lieber ausschalten, eventuell stürzt sie ab (oder dieses Programm).

Code: Alles auswählen

InitNetwork()

NewList OpenPorts.l()
NewList Threads.l()


Procedure PortCheckThread(Port.l)
  ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
  If ConnectionID
    CloseNetworkConnection(ConnectionID)
    AddElement(OpenPorts())
    OpenPorts() = Port
  EndIf
EndProcedure

Anfangszeit = ElapsedMilliseconds()

Debug "Starte PortCheck..."
For Port = 1 To 65535 ; Für jeden Port einen Thread starten
  AddElement(Threads())
  Threads() = CreateThread(@PortCheckThread(), Port)
  Debug "Thread #" + Str(Port) + " gestartet. Thread-Handle: " + Str(Threads())
  Delay(0)
Next

Debug "Warte, bis die Threads abgearbeitet sind..."
For i = 1 To 65535 ; Gucken, ob auch alle Threads beendet sind.
  SelectElement(Threads(), i)
  WaitThread(Threads())
  Delay(0)
Next

Endzeit = ElapsedMilliseconds()

Debug "Verarbeitung hat " + StrF((Endzeit - Anfangszeit)/1000) + " Sekunden gedauert."

Ergebnis = CountList(OpenPorts()) ; Jetzt schauen wir uns mal das Ergebnis an.
If Ergebnis > 1
  Debug Str(Ergebnis) + " offene Ports gefunden. Geöffnet sind:"
  
  FirstElement(OpenPorts())
  For i = 1 To Ergebnise 
    Debug Str(OpenPorts())
    NextElement(OpenPorts())
  Next
Else
  Debug "Keine Ports offen."
EndIf

CallDebugger

Debug "Programm beendet."
End
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

ich hab mal was gefunden
Port und anderes check
Portscan
Bei dieser Prüfung versucht der Online-Check, sich auf unterschiedlichen Ports mit Ihrem Computer zu verbinden um eventuelle Lücken aufzuzeigen.
Achtung! Desktop-Firewalls müssen für diesen Test deaktiviert werden!



Sicherheits-Test
Bei dieser Prüfung versucht der Online-Check gezielt, Informationen über Ihren PC bzw. über Ihr Netzwerk herauszufinden.



Exploit-Test
Bei dieser Prüfung versucht der Online-Check, bekannte Sicherheits-Lücken in Programmen zu finden, die auf Ihrem PC installiert sind.
Hinweis: Dieser Test ist nur für den Internet Explorer verfügbar.



Browser-Check
Bei dieser Prüfung wird die Browser-Konfiguration untersucht und eventuelle Schwachstellen aufgezeigt.
Hinweis: Dieser Test ist nur für den Internet Explorer verfügbar.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Laurin hat geschrieben:Allerdings, und das ist mir unverständlich, gibt er die Ports nicht aus, obwohl sie sich in der Liste befinden. Du musst im Debugger unter "Variablen" dir den Inhalt der Liste OpenPorts() anschauen.

Code: Alles auswählen

Ergebnis = CountList(OpenPorts()) ; Jetzt schauen wir uns mal das Ergebnis an.
If Ergebnis > 1
  Debug Str(Ergebnis) + " offene Ports gefunden. Geöffnet sind:"
  
  FirstElement(OpenPorts())
  For i = 1 To Ergebnise 
    Debug Str(OpenPorts())
    NextElement(OpenPorts())
  Next
Else
  Debug "Keine Ports offen."
EndIf

Debug "Programm beendet."
End
Es läßt mir keine Ruhe. Warum gibt er den Inhalt der Liste nicht aus?
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

WOW, da habe ich ja was losgetreten :D

@AND51
Die Idee mit OpenNetworkConnection hatte ich auch.
... mit dem gleichen Geschindigkeitsproblem.

@hardfalcon / sens-me
Leider so nicht, ich hätte gerne eine Liste mit offenen Ports "von drinnen nach draußen". Diese Online-Tests bleiben meistens schon am Router hängen.


@Laurin
Klasse Idee!
Leider produziert dein Code bei mir einen "invalid memory access" in Zeile 9, Thread 709

Das Auslesen der LinkList würde ich eher so machen:

Code: Alles auswählen

Ergebnis = CountList(OpenPorts()) ; Jetzt schauen wir uns mal das Ergebnis an.
If Ergebnis > 1
  Debug Str(Ergebnis) + " offene Ports gefunden. Geöffnet sind:"
  ResetList(OpenPorts())
  ForEach OpenPorts()
    Debug Str(OpenPorts())
  Next
Else
  Debug "Keine Ports offen."
EndIf
mal sehen wie man das Problemchen beheben kann ...
:allright:
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

DataMiner hat geschrieben:@Laurin
Klasse Idee!
Leider produziert dein Code bei mir einen "invalid memory access" in Zeile 9, Thread 709
Ja, das passiert bei mir gelegendlich auch. Offenbar kommt Windows nicht so gut mit den vielen Threads gleichzeitig klar.
Vielleicht hilfts, wenn man nur um die 500 Threads gleichzeitig ausführt.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Laurin hat geschrieben:
DataMiner hat geschrieben:@Laurin
Klasse Idee!
Leider produziert dein Code bei mir einen "invalid memory access" in Zeile 9, Thread 709
Ja, das passiert bei mir gelegendlich auch. Offenbar kommt Windows nicht so gut mit den vielen Threads gleichzeitig klar.
Vielleicht hilfts, wenn man nur um die 500 Threads gleichzeitig ausführt.
PureBasic ist nicht threadsicher, und Du verwendest hier im
Thread auch noch eine globale Linkedlist. Wundert mich nicht
das da etwas durcheinander kommt oder crasht.

Wenn ein Thread zwischen den 2 folgenden Zeilen unterbrochen
wird, und ein anderer Thread dann die Linkedlist manipuliert, hast Du
schon Chaos:

Code: Alles auswählen

    AddElement(OpenPorts())
    OpenPorts() = Port
Wird der Thread mitten im AddElement() unterbrochen, ist
der Zustand der Linkedlist unstabil.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten