PortScan

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Friedrichs hat geschrieben:sondern die Aussage das Thread in PB instabil sind. Das sind sie an sich nicht.
Fred, der Programmierer von PB, hat selbst zugegeben, das das Threadsystem nicht so das Wahre ist ;)
Deshalb hat er das auf die ToDo-Liste gesetzt :D
Es war kein Meckern an deinem Wissen in Pb oder das du "ne Niete" bist,
Mit dieser Aussage hast du mich wieder freundlich gestimmt :D
Handelbug
*hust* Handle *hust*
aber eine gut durchdachte Struktur bleibt eine gut durchdachte Struktur und die ist mit das Schwerste.
Das finde ich eigendlich nicht so schwer. Am schwierigsten sind meiner Meinung nach immernoch die ganzen Feinheiten. Die haben immer die Eigenart ganz plötzlich ein paar Stunden Programmierarbeit zunichte zu machen.
Gruß
Toshy
Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Laurin hat geschrieben:
Handelbug
*hust* Handle *hust*
Schön, dass das mal erwähnt wird, wenn ich "Handel"(Händel) lese denk ich immer an n Hänchen mit Pommes.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Fred, der Programmierer von PB, hat selbst zugegeben, das das Threadsystem nicht so das Wahre ist ;)
Deshalb hat er das auf die ToDo-Liste gesetzt :D.
Da habe und werde ich dir recht geben. Aber fehlerhaft nur in dem Sinne, das man den Ablauf / Syncronistaion einbauen könnte usw. NICHT im Sinne von "Thread stürzt ab, nur weil er da ist;-)"
Mit dieser Aussage hast du mich wieder freundlich gestimmt :D
Das ist schön, du "Klammer" ;-)
*hust* Handle *hust*
keuch echz. keine ahnung ob es ein Tipfehler war oder mal wieder falsch. ich bin mir nicht sicher bei dem Engleiche /amerikanischen LE und EL.
Das finde ich eigendlich nicht so schwer. Am schwierigsten sind meiner Meinung nach immernoch die ganzen Feinheiten. Die haben immer die Eigenart ganz plötzlich ein paar Stunden Programmierarbeit zunichte zu machen.
Da kann ich dir nur recht geben, das hält auf. Aber die Struktur ist schon wichtig, sehr wichtig. Denn am optimalsten geht das was ich machen will mit Thread, aber wenn Daten ausgetauscht werden müssen oder zugriff auf die selben Speicherdaten, so muß man ganz genau strukturieren, damit das programm an der richtigen stelle wartet bzw. nicht in einer endloswarteschleife hängt, weil Threads gegenseitig aufeinander warten. Ich zerbreche mir da auch gerade den Kopf, aber irgendwie bekomme ich das hin.

Aber stimmt alles schon, Thread und Listen bringen mich gerade an den Rand des Wahnsinns ;-)

Gruß
Toshy
Benutzeravatar
PureFan
Beiträge: 19
Registriert: 10.09.2004 14:40
Kontaktdaten:

Beitrag von PureFan »

Hier mal ein Beispiel, wie man einen Portscann am besten machen sollte.

Dauernd Threads zu killen und neu zu erstellen halte ich persönlich nicht für sinnvoll, viel besser ist es die Anzahl der Threads konstant zu halten!

Das ganze System ist im Prinzip eine Art Automat zum Nummern ziehen. Solange Nummern vorhanden sind "zieht" sich jeder Thread eine und führt die Überprüfungen durch! Dadurch sind Konflike zwischen den Threads ausgeschlossen.

Hier im Test wird "localhost" gescannt, dadurch sind auch 1000 Überprüfungen gleichzeitig möglich (#ChecksAtSameTime)! Sollte der Code aber für das Internet umgebaut werden ist es unbedingt notwendig die Anzahl zu reduzieren, da es sonst zu Verbindungs-Überlastungen und Timeouts bei anderen Programmen kommen kann.

Code: Alles auswählen

;- PureFan's Critical Section
DisableDebugger
Structure Pure_CS 
  Cnt.l 
EndStructure 
Procedure Pure_InitCS(*PCS.Pure_CS) 
  *PCS\Cnt=0 
EndProcedure 
Procedure Pure_EnterCS(*PCS.Pure_CS) 
  !POP Edi           ;POP/PUSH dient zum schnellen Einlesen des Parameters *PCS in das Register EDI 
  !PUSH Edi 
  
  !.loop: 
  Delay(1)
  
  !MOV Esi,1 
  !XCHG [Edi],Esi    ;Wir lesen den alten Wert aus und schreiben als neuen 1 rein! 
  
  !CMP Esi,0         ;Alter Wert war null, d.h. die vorige CS ist fertig 
  !JNE .loop         ;Durch das XCHG haben wir automatisch wieder 1 im Speicher 
EndProcedure 
 Procedure Pure_LeaveCS(*PCS.Pure_CS) 
  *PCS\Cnt=0 
EndProcedure
EnableDebugger


;- Definitionen

#minPort = $0000
#maxPort = $FFFF
#ChecksAtSameTime = 1000

Global AktuellerPort:  AktuellerPort=#minPort
Global CS.Pure_CS   :  Pure_InitCS(CS)
Global ThreadCount  :  ThreadCount = 0
NewList OpenPorts.l()

;- Thread ScanPorts

DisableDebugger
Procedure ScanPorts(OhneFunktion.l)
  Repeat
    
    ;Jeder Thread zieht eine Nummer zum Überprüfen!
    ;Der Code hier darf nicht mehrfach gleichzeichtig ausgeführt werden!
    ;Dies wird durch die CriticalSection gewährleistet
    Pure_EnterCS(CS)
    If AktuellerPort > #maxPort
      ThreadCount-1
      Pure_LeaveCS(CS) ;<- WICHTIG! Sonst warten die anderen Threads unendlich
      ProcedureReturn 1
    EndIf
    LokalerPort = AktuellerPort
    AktuellerPort+1
    Pure_LeaveCS(CS)
    
    ;=> Jeder Thread hat eine einmalige Nummer = Port!
    
    ;ACHTUNG: OpenNetworkConnection ist hier nur Threadsicher, da ein
    ;konstanter String verwendet wird!
    check=OpenNetworkConnection("localhost",LokalerPort)
    If check
      CloseNetworkConnection(check)
      
      ;=> Der Port ist offen => LL eintragen
      Pure_EnterCS(CS)
      AddElement(OpenPorts())
      OpenPorts()=LokalerPort
      Pure_LeaveCS(CS)
    EndIf
    
  ForEver
EndProcedure
EnableDebugger

;- Main

InitNetwork()

;1. Starte alle Threads! Es kann passieren, dass das Starten manchmal fehlschlägt,
;   daher müssen wir mitzählen
For I=1 To #ChecksAtSameTime
  If CreateThread(@ScanPorts(),0)
    Pure_EnterCS(CS)
    ThreadCount+1
    Pure_LeaveCS(CS)
  EndIf
Next I

;2. Die Hauptschleife! Sie kann dazu genutzt werden den aktuellen Status
;   anzuzeigen
Repeat
  Delay(1000)
  
  ;Berechne den Status in Prozent und zeige ihn an
  Pure_EnterCS(CS)
  Cur.l=(AktuellerPort-#minPort)*100/(#maxPort-#minPort)
  Debug Str(Cur)+"%"
  Pure_LeaveCS(CS)
  
Until ThreadCount=0 ;=> Bis kein Thread mehr offen ist!

Debug "DONE!"
  
;3. Ergebnisse auswerten!
ForEach OpenPorts()
  Debug OpenPorts()
Next

End
Mfg,
PureFan

EDIT: Ganz kleiner Rechtschreibfehler korrigiert, der jedoch keinen Einfluss auf die Funktionsweise hat ;)

EDIT2: Eine weitere kleine Modifikation durchgeführt, die das ganze möglicherweise etwas stabiler macht.
Zuletzt geändert von PureFan am 04.11.2005 21:47, insgesamt 2-mal geändert.
Procedure x(a,b,c):If a:ProcedureReturn b:EndIf:ProcedureReturn c:EndProcedure:For I=0 To 6:T.s+Chr(I&1+x(((I&4)/4+(I&2)/2-I&1+1)&6,1,0)<<1+x(I&1-(I&4)/4,1,0)<<2+x((I+2)&7,0,1)<<3+((4-(I+1)&4)/4)<<4+x(3-(I+3)&3,1,0)<<5+64):Next I:Debug T
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

Wie gerne würde ich sagen: Das ist die Lösung!
Aber leider bleibt der Code einfach unmotiviert stehen.
Mal geht das Debug-Fenster auf und es werden die ersten Prozente angezeigt, mal bleibt er gleich hängen.

Sorry.
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP
Benutzeravatar
PureFan
Beiträge: 19
Registriert: 10.09.2004 14:40
Kontaktdaten:

Beitrag von PureFan »

Ich habe den Quellcode natürlich vor dem Posten mehrmals getestet.. Sowohl unter PB 3.94 als auch 3.93 und kann mir den Fehler daher nicht erklären. Arbeitest du evt. mit geupdateten Libraries oder sonstigen Beta-Modifikationen?

Die einzige Idee die ich hätte, wäre folgendes: Den Debugger abschalten und ein kleines Consolen-Programm daraus bauen (einfach alles in die Console schreiben anstatt ins Debug-Output). Wenn der Verdacht besteht, dass es an der PB-Version liegt kann ich auch eine compilierte Version online stellen.

EDIT: Eine weitere Testmöglichkeit wäre die Anzahl der Threads zu reduzieren. Oder aber: Eine IP anstatt eines Domainnamen verwenden! (DNS Abfragen benötigen viel Zeit! Man würde daher den Fortschritt kaum bemerken!)
Procedure x(a,b,c):If a:ProcedureReturn b:EndIf:ProcedureReturn c:EndProcedure:For I=0 To 6:T.s+Chr(I&1+x(((I&4)/4+(I&2)/2-I&1+1)&6,1,0)<<1+x(I&1-(I&4)/4,1,0)<<2+x((I+2)&7,0,1)<<3+((4-(I+1)&4)/4)<<4+x(3-(I+3)&3,1,0)<<5+64):Next I:Debug T
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Bei mir funktioniert dein Code einwandfrei. Danke :D
Ich glaub' jetzt können wir Andre benachrichtigen. Das CodeArchiv wird sich freuen <)

Ich wußte, dass es sowas wie eine CriticalSection gibt. Dass man sie allerdings so benutzen muss, finde ich etwas befremdlich.
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 »

@Dataminer: der Code funzt einwandfrei, aber du musst ihn erstmal 1-2 Minuten werkeln lassen, bevor er beginnt, sich per Debug zu "äussern"... :wink:

@PureFan: Geil-o-mat, das is ein WIRKLICH guter Code! :allright:

//EDIT:
Laurin hat geschrieben:Beim Fahren gefürchtet,
von Frauen verehrt,
am Glase der Beste,
sein Körper begehrt,
politisch gebildet,
der Schw*** wie ein Bein,
das kann nur ICH sein!
Kein Wunder, dass du beim Fahren gefürchtet bist... Hast ja für jedes der 3 Pedale ein Bein... Und mit 3 Beinen fährt es sich bestimmt besser als mit 2... :mrgreen:
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

hardfalcon hat geschrieben:
Laurin hat geschrieben:Beim Fahren gefürchtet,
von Frauen verehrt,
am Glase der Beste,
sein Körper begehrt,
politisch gebildet,
der Schw*** wie ein Bein,
das kann nur ICH sein!
Kein Wunder, dass du beim Fahren gefürchtet bist... Hast ja für jedes der 3 Pedale ein Bein... Und mit 3 Beinen fährt es sich bestimmt besser als mit 2... :mrgreen:
Hehe, gewußt wie, ne? :mrgreen:
Ich glaube, das eine Wort muss ich komplett in Sterne setzen, sonst gibt es vielleicht wieder sowas wie bei RTFM.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

@PureFan / Laurin: Code ist schon fürs Archiv vorgemerkt. :wink:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten