AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TBruteForce - Version 0.5a [Update: 28.04.2008]

TBruteForce - Version 0.5a [Update: 28.04.2008]

Ein Thema von Meflin · begonnen am 25. Aug 2005 · letzter Beitrag vom 13. Jan 2011
Antwort Antwort
Seite 9 von 10   « Erste     789 10   
Benutzerbild von Meflin
Meflin
Registriert seit: 21. Aug 2003
TBruteForce
Wer hätt's gedacht - eine Brute Force Klasse für Delphi

Aktuelle Version: 0.5a
Download: im Anhang [6,39 KB]



Was ist TBruteForce?

TBruteForce ist eine Klasse, mit der die Implementierung einer BruteForcing-Funktion im eigenen Programm möglichst einfach und gleichzeitig möglichst universell ermöglicht werden soll. Die aktuelle Version verbraucht an sich kaum Arbeitsspeicher (es sei denn der Programmierer entscheidet sich dazu, die erzeugten Kombinationen in irgendeiner Form zwischenzuspeichern). Das bedeutet, dass für die Performance des Vorgangs (abgesehen von der Effektivität des Codes) allein die Prozessorgeschwindigkeit verantwortlich ist.
Bei einem 2GHz Prozessor(kern) liegt die blose Geschwindigkeit bei etwa 50.000.000 Kombinationen pro Sekunde, durch das Zusammensetzen der strings zur Ausgabe verringert sich die Geschwindigkeit auf etwa 2.000.000 Kombinationen pro Sekunde (hier besteht eindeutig Optimierungsbedarf ). Lässt man sich jetzt noch alle Kombinationen sichtbar ausgeben, beispielsweise in einer Konsole, so verringert sich die Geschwindigkeit weiter auf ca. 20.000 Kombinationen pro Sekunde.
So, ich hoffe nun hast Du eine ungefähre Vorstellung in welchen Geschwindigkeitsbereichen man sich mit der Klasse theoretisch und in der Praxis bewegen kann.



Verwendung

Um die Klasse in Betrieb zu nehmen, ist nichts weiter nötig, als die Unit BruteForce.pas in das Projektverzeichnis zu kopieren und in die uses der fraglichen Unit aufzunehmen.
Delphi-Quellcode:
uses
  BruteForce;
Um mit einem einfachen Beispiel zu beginnen: Wir wollen Kombinationen mit 5 Zeichen Länge erzeugen, der Zeichenvorrat soll dabei das Alphabet in Kleinbuchstaben sein. Oder anders ausgedrückt wir wollen alle Kombinationen von aaaaa, aaaab, aaaac, ... bis zzzzx, zzzzy, zzzzz bilden.
Delphi-Quellcode:
var
  BruteForce: TBruteForce;
begin
  // Instanzierung
  BruteForce := TBruteForce.Create;

  // Wir wollen 5 Stellen kombinieren, sg. "Nodes"
  BruteForce.NodeCount := 5;

  // Zeichenvorrat setzen, AlphaLowerCase ist eine Konstante die von der Unit bereitgestellt wird
  // Als ElementList erwartet die Klasse ein array of string. BFConstToDynArray wandelt ein
  // statisches array of string in ein dynamisches array of string um.
  BruteForce.ElementList := BFConstToDynArray(AlphaLowerCase);

  // Soderle. Bereits jetzt enthält BruteForce.Value die erste Kombinationen, in diesem Fall aaaaa.
  // Also müssen wir die gleich ausgeben.
  DoSomething(BruteForce.Value);

  // Jetzt gehts ans eigentliche BruteForcen, wir bilden die Kombinationen
  // BruteForce.NextValue bildet die nächste Kombinationen und gibt das Ergebnis als string zurück
  while not BruteForce.Finished do begin
    DoSomething(BruteForce.NextValue);
  end;

  // Wuppdi - jetzt sind wir schon fertig ;)
Wie viele Kombinationen die Klasse erzeugen wird lässt sich über
BruteForce.ToDo auslesen.


Jetzt ist es aber so, dass man jedem Node seinen eigenen Zeichenvorrat zuweisen kann. D.h. wir könnten beispielsweise auch Kombinationen der länge 5 erzeugen, bei denen die letzten beiden Zeichen Ziffern sind. Das ginge so:
Delphi-Quellcode:
var
  BruteForce: TBruteForce;
begin
  BruteForce := TBruteForce.Create;
  BruteForce.NodeCount := 5;
  BruteForce.ElementList := BFConstToDynArray(AlphaLowerCase);
  // Jetzt kommts ;)
  BruteForce.Nodes[0].ElementList := BFConstToDynArray(Numeric);
  BruteForce.Nodes[1].ElementList := BFConstToDynArray(Numeric);

  DoSomething(BruteForce.Value);

  while not BruteForce.Finished do begin
    DoSomething(BruteForce.NextValue);
  end;
Dieser Code würde alle Kombinationen von aaa00, aaa01,... bis zzz99 ausgeben. Jetzt wunderst Du dich vielleicht, wieso wir den Zeichenvorrat der Nodes 0 und 1 ändern und nicht den der Nodes 3 und 4 (die Zahlen sollen ja rechts hin). Nunja, je weiter ein Node links steht, desto höherwertiger ist er. Deshalb wird der Node, der in der Ausgabe die "rechteste" Stelle repräsentiert über den Index 0 angesprochen. Puh, ich hoffe das ist einigermasen verständlich
Code:
Wort a a a 0 0
Node 4 3 2 1 0

To Do

Bei der Version 0.5a handelt es sich um ein experimentelles Release. Es sind noch kaum Fehlerbehandlungsroutinen eingebaut! Bis jetzt ist es auch so, dass NodeCount unbedingt vor ElementList gesetzt werden muss (ein Henne-Ei-Problem für das ich bis jetzt keine überzeugende Lösung gefunden habe).
Einbauen will ich noch eine Speichern/Laden Funktion, die Möglichkeit, den BruteForce-Vorgang in beliebig viele Pakete aufzuteilen (Multithreading, Parallel Computing), sowie eine Ausgabe der Kombinationen wahlweise als array of string (bzw. TBFElementList). Ich habe auch schon mit dem Gedanken gespielt, beliebige Dinge kombinierbar zu machen (beispielsweise Integer, Objekte, etc). Aber ich bin mir nicht sicher, ob sich der Aufwand lohnen würde.

Ich würde mich freuen, wenn von euch noch Vorschläge und Anregungen kämen, wie man die Komponente noch erweitern könnte



Changelog

Code:
28.04.2008: Version 0.5a "Pandora" released
     Neu: 100% Codebasis ;)
     Kein Multithreading mehr integriert
     Es ist keine Komponente mehr

09.05.2006: Version 0.3b und aktualisierte Demo released
     Neu: Wahl zwischen iterativem und rekurivem Algorithmus
     Neu: TMaxThreads property
     Neu: OnThreadStart Event
     Neu: KeyList jetzt direkt in TBruteForce implementiert, keine 2 Komponenten mehr
     TThreadStatus nicht mehr hardgecodet
     Und alles, was ich inzwischen vergessen habe :(

05.10.2005: Version 0.1.3 Beta RC 2 und aktualisierte Demo released
     Minibugfix beim OnProgressChangeEvent gefixt

03.10.2005: Version 0.1.3 Beta RC 1 und aktualisierte Demo released
     Bugfix: Komponente zählt jetzt richtig
     Bugfix: Memory Leak entfernt
     Performance: Callback Funktion OnProgressChange geht jetzt nicht mehr so auf die Performance

30.08.2005: Version 0.1.2 Beta und aktualisierte Demo released
     Bugfix: das Problem, das das OnLastThreadFinished Event öfter ausgeführt wird sollte behoben sein
     Bugfix: Kleine Unsauberheit beim Progresscounter behoben
     Bugfix: OnProgressChangeTolerance war etwas zu tolerant
     Neu: eine Exception wurde ergänzt

29.08.2005: Demo released

27.08.2005: Version 0.1.1 Beta und neue Demo released
     Bugfix: bei EndLength = 1 werden jetzt nicht mehr fälschlicherweise die 2-stelligen Keys erzeugt
     Neu: Event OnProgressChange
     Neu: public property OnProgressChangeTolerance
     Neu: Exception Handling

26.08.2005: Demo released

25.08.2005: Version 0.1 Beta released
Angehängte Dateien
Dateityp: rar tbruteforce.0.3b_108.rar (4,2 KB, 643x aufgerufen)
Dateityp: pas bruteforce_207.pas (6,4 KB, 346x aufgerufen)
 
Benutzerbild von Diamondback2007
Diamondback2007

 
Delphi 2007 Professional
 
#81
  Alt 30. Apr 2008, 11:50
Zitat von Meflin:
Zitat von Diamondback2007:
wenn du allerdings bei einem bestimmten string anfangen kannst zu rechen, ist das aufteilen auf mehrere pcs natürlich schon praktisch fertig.
Kann ich. Das Problem ist eher, dass Rechner A dann auch bei dem string aufhört, bei dem Rechner B weitermacht
ja und wo is das problem dabei? das ließe sich zur not aber auch noch regeln. du könntest praktisch eine liste übergeben in der in einer bestimmten reihenfolge alle "EndStrings" drin stehen. wenn er mit einem fertig ist nimmt er den nächsten.

Zitat von Meflin:
Zitat von Diamondback2007:
im DF habe ich grade gestern etwas darüber gelesen... und zwar das wenn du in etwa str := str + str2; hast, dass das sehr langsam ist weil erst wieder str eingelesen wird und dann str komplett neu geschrieben wird.
Nunja, in zahlreichen Tests hat sich herausgestellt, dass das so ziemlich die schnellste Variante ist
siehe hier und hier

Zitat:
Also wenn ich AppendStr() benutze bringt das bei mir etwa 100.000 bis 300.000 Kombinationen pro sekunde mehr.
Na das ist ja mal interessant. Denn bei mir ist AppendStr in etwa so implementiert (aus dem Gedächtnis):
Delphi-Quellcode:
function AppendStr(const Source: string; Dest: string): string;
begin
  Result := Dest + Source;
end;
ja das habe ich mich auch schon gefragt...
die methode sieht so aus:

Delphi-Quellcode:
proceudre AppendStr(var Source: String; const Dest: String);
begin
  Source := Source + Dest;
end;
Vielleicht liegt es am const, keine ahnung was genau das bewirkt.

gruß
Fabian E.
  Mit Zitat antworten Zitat
Benutzerbild von Diamondback2007
Diamondback2007

 
Delphi 2007 Professional
 
#82
  Alt 28. Mai 2008, 21:37
Na, gibt es hier keine Fortschritte mehr? Das wäre wirklich schade, da die Komponente wirklich viel Pontential hat...

gruß
Fabian E.
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#83
  Alt 2. Jun 2008, 09:18
Zitat von Diamondback2007:
Na, gibt es hier keine Fortschritte mehr? Das wäre wirklich schade, da die Komponente wirklich viel Pontential hat...
Äh, ja. Danke der Nachfrage

Doch, ich werde die Komponente weiterentwickeln - aber ich kann echt keine zeitlichen Versprechen abgeben. Da ich auch vollzeit arbeite, hält sich meine Freizeit auch in Grenzen
Leo S.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#84
  Alt 2. Jun 2008, 14:19
Müsste sich Brute-Force nicht sehr einfach aufteilen lassen?
Sagen wir, wir haben 4 Kerne und in ToDo kennst du die möglichken Kombinationen. Wenn wir nun 100 Kombinationen haben, dann könntest du doch die 100 auf 4 aufteilen, so dass jeder 25 Kombinationen erzeugen soll. Und es lässt sich nun relativ einfach berechnen, welcher Thread welche Kombinationen machen soll.

Andere Möglichkeit wäre statt einer dezentralen Liste, eine Liste zu verwenden, wo die verschiedenen Ranges stehen. Also dass Thread 1 die Kombinationen von 0 bis 25 erstellt u.s.w.. Außerdem steht in der Liste wie weit der Thread ist.
So kann ein freigewordener Thread sich aussuchen, wo noch am meisten zu tun ist. Dann werden die verbleibenden Kombinationen in diesem "Pool" halbiert.

MfG
xZise
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#85
  Alt 2. Jun 2008, 14:28
Theoretisch ist das ganze kein Problem. Technisch ist es hier auch leicht, einen bestimmten Startwert reinzuladen. Die technische Schwierigkeit besteht tatsächlich darin, dass eine Instanz merkt, wann sie fertig ist.

Der Algo arbeitet mit Überlauf. Bis jetzt heisst das, Überlauf = High(ElementList) der jeweiligen Node (dann wird die höherwertige Node inkrementiert). Das bedeutet auch: wenn der Inkrementzähler jeder Node den Wert High(ElementList) hat, ist der Vorgang beendet.

Bei der Aufteilung trifft das dann nicht mehr zu. Ich muss noch einen zweiten Counter einführen - und da hatte ich bis jetzt noch nicht die Muse, mich reinzudenken
Leo S.
  Mit Zitat antworten Zitat
Benutzerbild von MSSSSM
MSSSSM

 
Delphi 7 Professional
 
#86
  Alt 3. Jun 2008, 13:44
hö?

also, ich habe AlphaLowerCase genommen, nur er zeigt mir kein aa an?

ist aus dem testbeispiel

mfg


edit: aaaaaaaaaaaaaaaargh

ich weiß schon wo mein fehler liegt: NextValue!
Marius
  Mit Zitat antworten Zitat
Micha88
 
#87
  Alt 12. Aug 2008, 23:32
Leider funktioniert keine der Demo-Links.

Kann jemand eine brauchbare Demo nocheinmal hochladen?
  Mit Zitat antworten Zitat
wazup

 
Delphi 2007 Professional
 
#88
  Alt 26. Aug 2008, 16:07
Wäre auch daran Interresiert
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#89
  Alt 27. Aug 2008, 12:46
Ach Jungens, im Grund müsst ihr doch nur den Code aus dem ersten Beitrag Copy&Pasten

Naja, hier habt ihr eure Demo. Aber: Das ist wirklich nur eine Demo zur Veranschaulichung des Prinzips! Sie ist absolut unperformant
Angehängte Dateien
Dateityp: zip tbruteforce_demo_148.zip (246,5 KB, 98x aufgerufen)
Leo S.
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

 
Delphi XE2 Enterprise
 
#90
  Alt 13. Jan 2011, 00:48
Hallo,
wäre es möglich die Version 0.5a nochmal zu Posten, da die Download Links nicht funktionieren.

Vielen Dank
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:05 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