PortScan

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

Beitrag von DataMiner »

Hallo Danilo, danke für die Antwort!
Wie würdest du das angehen?
(Arrays funzen auch nicht.)

EDIT: Habs jetzt auch mit der ThreadSync-LIB probiert. Nix ist.
Wenns noch jemand weiter probieren will:

Code: Alles auswählen

ThreadSyncInit()
Global MyResource.l
Dim Threads.l(85)
Procedure.l SearchOpenPort(port)
  If OpenNetworkConnection("localhost", port)
    connect=OpenNetworkConnection("localhost", port)
    Debug "Port "+Str(port)+" ist offen"
    CloseNetworkConnection(connect)
  EndIf
EndProcedure
  
If InitNetwork()
  For h=0  To 65450 Step 85
    j=0
    For i=h+1 To h+85
      j+1
      MyResource=AddThreadResource()
      OpenThreadResource(MyResource)
      Threads(j) = CreateThread(@SearchOpenPort(), i)
      Debug "Thread #" + Str(i) + " gestartet. Thread-Handle: " + Str(Threads(j))
    Next
    j=0
    For i = h+1 To h+85 ; Gucken, ob auch alle Threads beendet sind.
      j+1
      WaitThread(Threads(j))
      DeleteThreadResource(MyResource)
      Debug "Thread #" + Str(i) + "beendet"
    Next
  Next 
EndIf
ThreadSyncExit()
End
Wie gesagt, bleibt früher oder später mit einem "invalid memory access" hängen.
__________________________________________
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 »

Achso... ich dachte, Threads wären schon stabil, wenn man keine Strings verwendet. Danke für deinen Hinweis. Ich habe es schon geahnt, dass es an der Liste liegen könnt.

Gibt es irgendwo eine Liste, was alles einen Thread zum Absturz bringen kann?
Da wären Strings, LinkedLists, nochwas?
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Wer eine Firewall an hat, sollte sie lieber ausschalten, eventuell stürzt sie ab (oder dieses Programm).
Es kann nur einen geben: Das Programm oder die Firewall... :lol:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von PAMKKKKK »

@AND51
>_<
Ich kann leider in deine Beiträgen nicht erkennen ob du mit dem Fetten Text nur LAUT SPRICHST oder ob du jemanden anders Zitierst.

Fette Texte in Chats, werden dazu benutzt um Aufmerksamkeit zu erregen oder um eine Laute Sprechweise auszudrücken.
Beides kann ich hier nicht erkennen.:evil:

Es wäre uns allen eine Hilfe, wenn du die Quote Funktion benutzt! :!:
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

PAMKKKKK hat geschrieben:@AND51
[...]
Es wäre uns allen eine Hilfe, wenn du die Quote Funktion benutzt! :!:
Ja, also sorry. Das kursiv und fettsgeschriebene war vorher meine Zitierweise, die ich nun abgelegt und durch
diese
ersetzt habe.
Nochmals SORRY :oops:
Zuletzt geändert von AND51 am 02.11.2005 19:23, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich hätte mal noch eine andere Alternative, die nur mit Arrays funktioniert:

Code: Alles auswählen

InitNetwork() 

Dim OpenPorts.l(65535)
Dim Threads.l(65535) 

Procedure PortCheckThread(Port.l) 
  ConnectionID = OpenNetworkConnection("127.0.0.1", Port) 
  If ConnectionID 
    CloseNetworkConnection(ConnectionID) 
    OpenPorts(Port) = #True
  Else
    OpenPorts(Port) = #False
  EndIf 
EndProcedure 

Anfangszeit = ElapsedMilliseconds() 

Debug "Starte PortCheck..." 

Repeat
  Quit = #True
  For Port = 1 To 65535
    If Threads(Port) = 0
      Threads(Port) = CreateThread(@PortCheckThread(), Port) 
      If Threads(Port)
        Debug "Thread #" + Str(Port) + " gestartet. Thread-Handle: " + Str(Threads(Port))
      Else
        Quit = #False
      EndIf
    EndIf
    Delay(0) 
  Next
Until Quit

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

Endzeit = ElapsedMilliseconds() 

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

Debug "Geöffnet sind:" 
For i = 1 To 65535
  If OpenPorts(i)
    Debug i
  EndIf
Next
CallDebugger 

Debug "Programm beendet." 
End
Dann kommt aber irgendwann das hier:
Link zum Fehlerbild
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Der Fehler kam bei meiner Version gelegendlich auch. Ich vermute, dass das Speichermanagement von Windows überlastet wird, wenn so viele Threads auf einmal gestartet werden.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Hi.
Also ich bin ja erst ein paar Tage bei PB, aber Thread sind in PB sehr wohl stabil. Unstabil ist höchstens die Programmierweise. Überall wo gleichzeit auf den selben Speicherbereich geschrieben werden kann, stürzt das Programm früher oder später ab. Man muß wie in der Hilfe beschrieben die Betriebssystemeigene Syncronisierung nutzen (was auch immer das ist) oder dafür sorgen das dies nicht vorkommt bzw. ein SICHERS Flagsystem nutzen. Also weder PB noch Windows sind schuldig, nur unwissenheit oder ein Denkfehler bei euch.

Unabhängig davon sollte hier beachtet werden, das einige Systeme nur begrenzt Ressourcen zur Verfügung stellen (z.B. Win98) und auch die maximale gleichzeitige Verbindungsanzahl eingeschränktist / sein kann.

und wenn du schon die offenen Ports anzeigen willst, dann muß es "if ergebnis >= 1" heißen, sonst wird nicht angezeigt, falls nurein port offen ist.

Was noch zu bedenken sein solle ist, daß soweit ich das verstehe, mit "opennetworkconnection" nur dann eine verbindung aufgebaut wird, wenn auf dem Port ein SERVER wartet. Ist der Port zwar offen, aber keine "Software" wartet auf eingaben, dann wirft diese Abfrage nichts zurück. Auf jedenfall müßte es so nach meinem Verständnis sein.

Wie ich gerade feststellen mußte, kann selbst WindowsXP nur ca. maximal 2000 Thread pro Programm / Prozess laufen lassen(auf jedenfall mit PB), alle weiteren werden nicht erstellt, verschwinden also im Nirvana. Es hat schon seinen Grund, warum auch auf Websiten Ports nur nach und nach getestet werden (können). Achtet mal auf den XPTaskmonitor.

Man kann es eventl. noch etwas schneller machen (bei mir sind es ca. 4 minuten, aber dafür korrekt), aber hier kann man wenigstens wählen welcher portbereich man absuchen will. wenn man wirklichen den kompletten bereich absuchen will (und immer nur den), dann würde ich es anders machen. einfach weniger threads und in jedem thread mehrere ports abfragen.

ach ja,wie ihr seht, gibt es auf die art auch keine probleme mit der liste.
einzig die handles (threadid) wird im system nicht gelöscht (wärend laufzeit des programmes), auch wenn der thread beendet / durchlaufen ist.
laut hilfe muß man killthread ja nur nehmen, wenn man einen thread knallhart mittendrinn löschen will. also entweder ist die hilfe hier schlecht beschrieben oder PB hat einen bug.

Also wenn ihr einen besseren Code wollt (schneller), sagt bescheid.

Trotzdem mal mein Code(habe nur zwei oder drei Textzeilen übernommen):

Code: Alles auswählen

; Hinweis: An einer stelle im Code scheint wrend der Laufzeit ein Handle nicht zurckgegeben  zu werden, evtl.
; Habe ich mit dem "Memory" noch was falsch gemacht.
OpenConsole()
InitNetwork()
NewList OpenPorts.l()
NewList Threads.l()
Global counter.l
Global counterW.l
*MEM.l
; erstellt von Thorsten Friedrichs 2005
Procedure PortCheckThread(*MEM.l)
	*freemem.l = PeekL(*MEM+8)
	;ConnectionID.l = OpenNetworkConnection("66.249.85.99", PeekL(*MEM+4)) ;google.de
	ConnectionID.l = OpenNetworkConnection("127.0.0.1", PeekL(*MEM+4))
	If ConnectionID
		CloseNetworkConnection(ConnectionID)
	EndIf
	Repeat
		Delay(1) ; nur zum schonen der Prozessorlast, was die Ausfhrung wiederum schneller macht
	If counterW+350 < PeekL(*MEM) ; nur zum schonen der Prozessorlast, was die Ausfhrung wiederum schneller macht
		Delay(1)
	EndIf
	If counterW+500 < PeekL(*MEM) ; nur zum schonen der Prozessorlast, was die Ausfhrung wiederum schneller macht
		Delay(300)
	EndIf
	Until counterW = PeekL(*MEM) ;warte das vorheriger Thread Erlaubnis zum weitermachen gibt
	If ConnectionID ; offenen Port in Liste speichern
		AddElement(OpenPorts())
		OpenPorts() = PeekL(*MEM+4)
	EndIf
	counterW = counterW + 1 ; nchsten Thread erlauben weiterzumachen
	FreeMemory(*freemem)
EndProcedure


Procedure Thread(reserves.l)
	counterW = 1
	counter = 0
	For Port = 1 To 65535 ; Fr jeden Port einen Thread starten
	;AddElement(Threads())
	counter = counter + 1
	*MEM = AllocateMemory(12)
	PokeL(*MEM, Counter)
	PokeL(*MEM+4, PORT)
	PokeL(*MEM+8, *MEM)
	AddElement(Threads())
	Threads() = CreateThread(@PortCheckThread(), *MEM)
	;Delay(1)
	While counter-counterw > 1900 ; <-- Wert gibt an, wieviele Connections max. gleichzeitig offen sein drfen; (noch recht ungenau)
		; Hier wird angenommen, solange der angegebene Wert berschritten ist, genau diese Anzahl an Verbindungen
		; noch aktiv ist. Da dieser Wert aber vom Counter, welcher Schrittweise abgearbeitet wird abgeleitet ist, wei das
		;Programm natrlich nicht, ob nicht schon einige Verbindungen geschlossen sind, die noch nicht an der Reihe sind
		;ihr Ergebnis zu senden. Man mte dafr eine eigene bessere Verwaltung bauen. Aber in diesem Beispiel
		; drfte das nicht notwendig sein.
		;XP wrde ich bis zu 1950 setzten, Win98 nur max. 100 evtl. 200
		
		Delay(100)
	Wend
	Next
EndProcedure

Anfangszeit = ElapsedMilliseconds()
PrintN( "Starte PortCheck..." )
CreateThread(@Thread(), 0)
PrintN( "Warte, bis die Threads abgearbeitet sind..." )

Repeat
Delay (1000)
PrintN(Str(counter)+" : "+Str(counterW) + " offene Port, besser Server an Port -> Anzahl bisher: " + Str(CountList(OpenPorts())))
Until counterW >= counter
Endzeit = ElapsedMilliseconds()

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

ForEach Threads() ; sonst bleibt ein handle im system brig, auch wenn laut hilfe das nicht sein drfte. vielleicht ein Bug.
KillThread(Threads() )
Next ;PS. handel werden hier wohl auch nicht freigegeben, ist wohl ein Bug.

Ergebnis = CountList(OpenPorts()) ; Jetzt schauen wir uns mal das Ergebnis an.
If Ergebnis >= 1
	PrintN( Str(Ergebnis) + " offene Ports gefunden. Geffnet sind:" )
	ForEach OpenPorts()
	PrintN( Str(OpenPorts()) )
	Next
Else
	PrintN( "Keine Ports offen." )
EndIf

PrintN("Programm beendet." )
Repeat
Delay(10)
Until 0
CloseConsole()
End
Gruß
Toshy
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Du hast eine recht arogante Art, hast du das schon mal bemerkt?
Ich bin seit fast 3 Jahren bei PB dabei und behaupte, eine Menge darüber zu wissen.

Natürlich hätte ich meinen Code in jeder Hinsicht perfekt machen können (keine 65k Threads auf einmal, betriebssystemeigene Synchonisierung etc), allerdings hätte ich dann zwei Wochen programmieren müssen. Der Junge suchte nach einer schnellen Lösung und alles muss ich ihm ja auch nicht vorprogrammieren. Er soll sich ja selbst weiterentwickeln.
Thread sind in PB sehr wohl stabil
Falsch. In PB sind die Threads nicht weit genug vom restlichen Programm abgekapselt (was für ein sicheres Laufen nötig ist). Dazu kommt, dass sie nicht selbständig ihre Speicherzugriffe syncronisieren. Solche Threads sind nahezu unbrauchbar. Das Thread-System in PB ist (noch) nicht ausgereift.

A-ja, selber nicht wissen, was mit die betriebssystemeigene Syncronisierung ist, aber uns Unwissenheit unterstellen... ts, ts. Da sag' ich jetzt mal gar nichts zu.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Es ist mir eigendlich total egal ob du mich arrogant findest oder nicht.
Aber es ging hier nicht um deinen Code (auch wenn ich "meinen Code" in nur ein paar Minuten erstellt habe und nicht nach drei Jahren ;-) sondern die Aussage das Thread in PB instabil sind. Das sind sie an sich nicht.
SIe laufen ohne abzuschmieren. Wo du recht hast ist, das sie die Zugriffe nicht syncronisieren und man das selber machen muß, was aber auch probleme aufwerfen kann. aber wie man an dem einfach beispiel sieht, ist auch das ohne probleme möglich.
Es war also in dem Auszug nur gemeint, das der Thread selbst stabil ist, nicht abschmiert, sondern nur, wenn man nicht (wie in der hilfe drauf hingewiesen) darauf achtet den Zugriff selbst zu überfachen.

Auch wenn es sicher programmiertechnisch und auch wohl von der Geschwindigkeit optiomaler wäre, wenn das der Thread selbständig machen würde, aber dem ist nicht so und es gibt keine großen Probleme das zu umgehen.

Man sollte also nicht behaupten das die Threads instabil sind, sondern nur nicht syncronisiert sind. Das "nicht stabile" kommt erst, wenn man den code nicht korrekt erstellt. Ich fange gerade an mit PB und diesen nicht syncronisierten Threads und ich werde min. 3-4 Thread laufen haben mit gegenseitigem Datenaustausch. Ich muß zugeben, man muß da auf vieles achten, aber es scheint keine Probleme zu geben, sprich, keine Abstürzte wegen Syncronisationsfehlern.

Es war kein Meckern an deinem Wissen in Pb oder das du "ne Niete" bist, nur das wenn man sauber programmiert es mit Thread keine Probleme gibt (außer dem Handelbug das ich gestern/heute festgestellt habe).
Ich will mir als PBnewbie gar nicht anmaßen mich mit deiner Erfahrung in PB zu messen, aber eine gut durchdachte Struktur bleibt eine gut durchdachte Struktur und die ist mit das Schwerste.

Gruß
Toshy
[edit] Ach ja, und natürlich will ich auch nur helfen, denn um die Ports schnell durchlaufen zu können bleibt wirklich nur die Möglichkeit mehrere Threads zu verwenden (das kam ja nicht von mir), aber woher hätte er gleich wissen sollen, das es eine Maximale anzahl von Threads gibt (wußte ich auch nicht) und das man auch nur eine geringe Anzahl an Verbindungen unter win98 verwenden soll.
Der originalcode von dir ging halt nicht(ganz richtig), das war auch schon alles. Mußte das ja auch erst testen.
Antworten