PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : brute force algo


Kennung Eins
2002-11-08, 16:24:03
puh,
irgendwie saß ich heute zu lange vorm Rechner.

Vielleicht kann mir jemand helfen:

Ich suche nach einem Algorithmus, welcher mir Zeichenfolgen manipuliert.

Der Algo soll mir erst 'a' .. 'z' bereitstellen (meinetwegen auch #0 .. #255, aber im folgenden sprech ich mal nur von a bis z), danach soll er 'aa' .. 'zz' abarbeiten, dann 'aaa' ... 'zzz' usw.

Wie krieg ich das hin?
Hab mir zumindest Gedanken gemacht, aber es nicht implementiert bekommen:

- erst a bis z laufen zu lassen, also immer das, was momentan am Ende steht um eins zu erhöhen.
- wenn das nicht geht, sollte der Buchstabe davor um 1 erhöht und der am Ende wieder auf a gesetzt werden (z.b. von 'az' auf 'ba') usw., solange bis kein Buchstabe mehr davor steht.
- dann sollte einfach ein neues a davor geschrieben werden (also z.b. von 'zzz' auf 'aaaa').

Hmpf.

Bitte bitte, hat jemand eine Idee?

aths
2002-11-08, 16:26:16
Ich denk mal laut nach:

Du hast 2 Schleifen. Eine äußere zählt die Zeichenlänge, von 1 bis 8 oder so.

Und eine innere erzeugt dann die Zeichenkette. Von A-Z, das kann man sich ja wie ein Zahlensystem mit 26 Ziffern vorstellen, und da zählst du einfach immer nur 1 hoch. Bei "Überlauf" der letzten Stelle (>z) wird der Vorgänger um 1 erhöht und die betreffende Stelle wieder auf "a" gesetzt.

Modulor
2002-11-08, 18:07:47
Originally posted by Kennung Eins
puh,
irgendwie saß ich heute zu lange vorm Rechner.
...

Glaube ich auch :D!
Welchen Sinn macht ein Programm mit so einem Algorithmus?

Demirug
2002-11-08, 18:17:52
Originally posted by Modulor


Glaube ich auch :D!
Welchen Sinn macht ein Programm mit so einem Algorithmus?

ist das nicht offensichtlich?

das ganze ist ein passwortsuchprogramm.

@Kennung Eins:

In welcher sprache willst du das ganze machen?

Kennung Eins
2002-11-08, 19:09:57
@Demi:
korrekt.

Ohne scheiss: ich komme seit einem halben Jahr nicht mehr an meine Router-config ran, weil mein Vater das Passwort geändert hat, und in seiner Dussligkeit dieses Passwort vergessen hat.

Nun will ich aber diverse Ports umkonfigurieren, kann das aber nicht einfach durch ein Reset des Routers machen. (Sonst gehen mir diverse Einstellungen verloren)

Per Telnet kann ich Passwörter eingeben, also hab ich mir heut Nachmittag ein Telnet Prog geschrieben, welches bestens funzt.
Nur mit diesem blöden Algo komm ich nicht klar.

Ich schreibe das Prog zwar in Delphi, bin aber dennoch in Java / C++ / Prolog / Haskell / what ever relativ firm ... Pseudocode wär natürlich optimal :)

Hm.
So, wie aths das beschrieben hat, hab ichs nicht hinbekommen.
Also hab ichs rekursiv versucht, was aber in heillosem Durcheinander und dem nächsten Kaffee endete.
Nun bin ich erstmal ... verwirrt. :)

Kannst du helfen?

Exxtreme
2002-11-08, 19:26:26
Was hast du für einen Router? Vielleicht lässt er sich resetten.

Kennung Eins
2002-11-08, 19:29:20
Originally posted by Kennung Eins
Nun will ich aber diverse Ports umkonfigurieren, kann das aber nicht einfach durch ein Reset des Routers machen. (Sonst gehen mir diverse Einstellungen verloren):)

Exxtreme
2002-11-08, 19:31:07
:bonk:
Isch hob des krass net g'seha..
;)

Demirug
2002-11-08, 19:55:14
So das müsste gehen:


public void GenPasswords ()
{
for (int TestSize = 1 ; TestSize < 11 ; TestSize++)
{
char[] code = new char[TestSize];

for (int Index = 0 ; Index < TestSize ; Index++)
code[Index] = 'a';

do
{
TestPassword (code);
} while (OneUp (code, 0));
}
}

public bool OneUp (char[] code, int pos)
{
if (pos == code.Length)
return false;

code[pos]++;

if (code[pos] <= 'z')
return true;

code[pos] = 'a';

return OneUp (code, pos+1);
}


hoffe du kannst damit was anfangen.

Kennung Eins
2002-11-08, 20:20:38
So ein Mist,
ich hab das Prog in Delphi geschrieben, und Delphi kommt mit dynamischen Arrayzuweisungen nicht so schön klar, wie C++.
Wenn man einem Array (code) einmal eine Größe zuweist, kann diese nicht wieder geändert werden. Einmal eine Variable erzeugt, ist es eine globale Methodenvariable, nicht wie in C++ jeweils eine zwischen { und } vorkommende Variable... hmm trotzdem danke erstmal!

Ich will sehen, was sich daraus machen lässt.

Demirug
2002-11-08, 20:26:03
Das ist doch kein Problem:



public void GenPasswords ()
{
char[] code = new char[10]; // Einmal mit maximal grösse anlegen

for (int TestSize = 1 ; TestSize < 11 ; TestSize++)
{
for (int Index = 0 ; Index < TestSize ; Index++)
code[Index] = 'a';

do
{
TestPassword (code, TestSize);
} while (OneUp (code, TestSize, 0));
}
}

public bool OneUp (char[] code, int maxsize, int pos)
{
if (pos == maxsize)
return false;

code[pos]++;

if (code[pos] <= 'z')
return true;

code[pos] = 'a';

return OneUp (code, pos+1);
}

Kennung Eins
2002-11-08, 20:48:25
Juhu, so funzt es:

(...blah...)

const testsize = 2;

var
code:array[0..testsize] of char;

implementation

{$R *.DFM}

function OneUp(pos:integer):boolean;
begin
if pos = length(code) then result:=false
else begin
code[pos]:=chr(1+ord(code[pos]));
if code[pos]<='z' then result:=true else begin
code[pos]:='a';
result:=OneUp(pos+1);
end;
end;
end;

procedure GenPasswords;
var Index:integer;
begin
for Index:=0 to testsize do
code[Index]:='a';
form1.memo1.lines.add(code);
while OneUp(0) do
form1.Memo1.lines.add(code);
end;

Danke Vielmals, Demi!

Demirug
2002-11-08, 20:53:03
Kein Problem.

Zumindestens weis ich jetzt wieder warum ich kein Pascal mehr sehen konnte.

Kennung Eins
2002-11-08, 21:28:26
:D

stimmt schon, irgendwie ... :stareup:

Darkstar
2002-11-08, 22:20:24
Originally posted by Kennung Eins
So ein Mist,
ich hab das Prog in Delphi geschrieben, und Delphi kommt mit dynamischen Arrayzuweisungen nicht so schön klar, wie C++.Schon mal in der Delphi-Hilfe unter dem Stichpunkt „Dynamische Arrays“ nachgeschaut?

Kennung Eins
2002-11-09, 10:24:15
jo klar.

Hab trotzdem eben nachgeschaut und etwas gefunden, was ich wohl ansonsten immer überlesen habe.

procedure TForm1.FormCreate(Sender: TObject);
var i:array of integer;
begin
setlength(i,3);
i:=nil;
setlength(i,24);
end;Ich war jedoch der festen Überzeugung, daß man die Größe -sobald man sie einmal festgelegt hat- nicht wieder ändern kann.
das i:=nil kam mir nicht in den Sinn.

Mal schauen, was sich damit machen lässt.

[EDIT]
Jupp, damit funzt das nun auch.

Marcel
2002-11-09, 15:22:17
Rekursiv geht schief:


const maxlen = 8;

procedure generatepwd(pwd:string);
var i: byte;
begin
testpwd(pwd);
if length(pwd) < maxlen then begin
for i := 65 to 90 do begin
generatepwd(pwd + chr(i));
generatepwd(pwd + chr(i+32));
end;
end;
end;


Naja, dann brauchste halt noch 'ne


procedure testpwd(pwd: string);
begin
{ hier wird das Passwort an die CIA verkauft}
end;


Warnung: Quellcode wurde nicht auf Tippfehler/Syntaxfehler überprüft und könnte somit Viren enthalten oder Daten an Microsoft übertragen.

Gruß,
Marcel

Darkstar
2002-11-09, 16:55:18
Originally posted by Kennung Eins
procedure TForm1.FormCreate(Sender: TObject);
var i:array of integer;
begin
setlength(i,3);
i:=nil;
setlength(i,24);
end;Das i:=nil; brauchst Du nur am Ende machen, um den Speicher wieder freizugeben.Ich war jedoch der festen Überzeugung, daß man die Größe -sobald man sie einmal festgelegt hat- nicht wieder ändern kann.Kann sein, daß das früher mal so war (Turbo Pascal?), denn ich kann mich auch noch an diesbezügliche Aussagen erinnern.

Kennung Eins
2002-11-10, 10:31:45
Thx again @all!

Marcel,
dein Algo sieht hübsch aus, das ist das, was ich am Anfang (erfolglos) versucht hatte...

Darkstar,
Hmm, wenn ich i:=nil; nicht benutze, kriege ich einen compiler-error... :( Ist ja letztenendes auch egal, funktionieren tut es jedenfalls nun.

Proggi steht nun auch auf meiner HP.

Kennung Eins
2002-11-10, 22:57:18
:...(

Marcel
2002-11-11, 22:23:04
Wo wird denn die meiste Zeit verbraten? Beim Testen des Passwortes? Dann optimier Dein Netz, sofern noch möglich... (und nimm Win2k/XP statt 98/ME, da letztere einen bescheidenen TCP/IP-Stack haben)

Gruß,
marel (heut Abend mit dichken Fingern)

Kennung Eins
2002-11-12, 18:32:30
Hm nö, leider wird die meinste Zeit einfach nur mit Warten auf die Antwort des Routers verbraten.
Der sendet seine Antwort immer mit 150ms ~ 200ms Verzögerung.

Win2k hab ich zum Glück schon drauf...aber ich hab noch ein win98 notebook nebenher mit am laufen.

Ich werd heut abend mal die "use dictionary file" funktion proggen.

Marcel
2002-11-12, 19:25:50
Originally posted by Kennung Eins
Hm nö, leider wird die meinste Zeit einfach nur mit Warten auf die Antwort des Routers verbraten.
Der sendet seine Antwort immer mit 150ms ~ 200ms Verzögerung.


Kannst Du mehrere Anfragen gleichzeitig laufen lassen?

Kennung Eins
2002-11-12, 20:24:40
Hm jein. Von der gleichen IP Adresse kann eine Anfrage pro 200ms kommen.

Marcel
2002-11-12, 20:28:11
Du brauchst eindeutig mehr IPs. :)

Kennung Eins
2002-11-12, 20:56:54
:D jo, ich will das prog noch so erweitern, daß es auf meine hp immer meine aktuelle ip hochläd und clients mittels dieser IP dann beginnen, den router zu bearbeiten.

MeLLe
2002-11-13, 13:11:56
Das nimmt ja fast DDoS-Züge an. Man man man - übertreibs net ;)

Kennung Eins
2002-11-13, 15:37:27
ja, keine Sorge, ich habe nichts böses vor.

Unregistered
2002-12-11, 12:39:40
mach dich doch mal mit der hardware von deinem router vertraut, da kann man bestimmt was kurzschliessen, um das passwort zu killen (oder saemtliche geliebten einstellungen gleich mit ;-)

Stone2001
2002-12-13, 19:39:05
Also bei der Laufzeit, wäre es nicht überlegenswert, einen Las-Vegas-Algorithmus zu nehmen? ;)
Mit etwas Glück, braucht der keine 2500 Tage! :D

Kennung Eins
2002-12-13, 20:56:04
Ist tatsächlich überlegenswert, thx 4 input!
Mal schauen, wann ich meinen Rechner wieder hinkriege ( http://www.forum-3dcenter.org/vbulletin/showthread.php?postid=562388#post562388 ) , um wieder programmieren zu können.

Wenn ich allerdings mal noch Zeit finde, die "use wordlist"-funktion fertigzustellen, das wäre optimal (bzw mit bestem rechnerischen aufwand).

Ach ja, ich hab das pwd übrigens noch immer nicht raus, bin aber mit den 5-stelligen pwds fast fertig... :-/