Autor Beitrag
vazrul
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 03.03.10 21:54 
Nabend ;)

mich interessiert die möglichkeit den brute force angriff in delpgi testweise zu programmieren(hatten in der schule verschlüsselungsverfahrn, fand das thema interessant)

Hab mich auch schon versucht, denke aber dass ich es extremst kompliziert geschrieben habe und es wahrscheinlich einen viel simpleren algorithmus gibt.

Zunächst was mein Programm macht:-
-Zufälliger 1-2 stelliger schlüssel generiert und in maskedit gespeichert.
-Delphi generiert verschiedene 1-2 stellige Kombinationen und vergleicht diese mit dem text in maskedit

generiert wird mit chr(1-255) also alle kombinationen des ASCII codes

der Quelltext: {diese button.click funktion wird nach dem generieren einens keys ausgeführt um nachzusehn ob er übereinstimmt}
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TForm1.Button2Click(Sender: TObject);
begin
if maskedit1.Text=pw then begin
showmessage(brute);
form1.close;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,lang,hilfe,hilfe2:integer; text,htext:string;
begin
lang:=0;
text:='';
  for i:=1 to 255 do begin
    brute:=chr(i);
      maskedit1.Text:=brute;
    button2.Click; // bis hierhin werden 1 stellige keys probiert
end;
brute:='';
hilfe:=1;
i:=1;
while hilfe<> 255 do begin
    brute:=chr(hilfe) + chr(i);
      maskedit1.Text:=brute;
    button2.click;
i:=i+1;
if i= 255 then begin
i:=1;
hilfe:=hilfe+1// hier werden 2 stellige probiert
end;

meine frage, kann man das ganze irgendwie vereinfachen? 3 stellige krieg ich schon auf diese weise nicht mehr hin, da die if bzw while verschachtelung über mein können hinausgeht. Was kann ich generell verbessern und gibts eine vorlage dazu?

lg und für jede hilfe dankbar


Zuletzt bearbeitet von vazrul am Mi 03.03.10 23:40, insgesamt 1-mal bearbeitet
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mi 03.03.10 22:40 
Bitte benutz Delphi-Tags und rück den Quelltext anständig ein, so kann man garnix lesen...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 03.03.10 22:59 
Könntest Du bitte deinen Quelltext in Delphi-Tags einfassen? Dadurch wird das so schön lesbar, wie bei mir ;-)

Aber zu deiner Frage: Ja, das geht zu vereinfachen; und wird dabei sogar noch mal um einiges schneller.

Aber fangen wir klein an. Als erstes räumen wir in deinem Code dazu mal kurz auf:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var
    I: Integer; //Ein paar Zählvariablen; kommt immer gut, da paar zu haben
    PW_Check: String//Das "verschlüsselte", zu suchende Passwort
    PW: String//Unser aktuell geprüftes Passwort
begin
    PW_Check := Edit1.Text; //Verschlüsseltes Passwort lesen
    PW := ''//Mit leerem Passwort initialisieren

    //Bruteforcing ;-)
    While PW_Check <> EncryptPW(PW) Do
        GetNextPW;

    ShowMessage('Huhu, gefunden! PW ist: ' + PW);
end;


Einfach, nicht? Die beiden Routinen EncryptPW und GetNextPW bauen wir gleich. Erstmal die einfachere von beiden: EncryptPW

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure EncryptPW(PW: String): String;
begin
    Result := PW; //Vorerst keine Verschlüsslung
end;


Nun der spannende Teil der Geschichte.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
Procedure GetNextPW;
begin
    //Erstes Zeichen ergänzen
    If PW = '' Then
    Begin
        PW := #1;
        exit;
    end;

    //Schauen, ob's einen Übertrag gibt
    I := 1;
    While (I <= Length(PW)) and (PW[I] = #255do
    Begin
        //Rücksprung auf erstes Zeichen ausführen
        PW[I] := #1;
        //Nächstes Zeichen anvisieren
        Inc(I);
    end;

    //Gültiges Zeichen innerhalb des Passwortes?
    if I <= Length(PW) Then
    Begin
        //Zeichen erhöhen
        Inc(PW[I]);
    end
    else
    begin
        //Neues Zeichen am Ende des Passwortes anhängen.
        PW := PW + #1;
    end;
end;


Die beiden zusätzlichen Routinen gehören beide zwischen die Zeile PW: String und dem begin.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
vazrul Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 03.03.10 23:30 
erstmal vielen dank für eure antworten (besonders dir BenBE, hast mir sehr geholfen) ! ;-)

wie rück ich den text denn in delphi tags ein? tut mir leid für die frage aber würd ich gern wissen, mein text sieht wirklich wie 'dahingeklatscht'aus.

lg und danke nochmals
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 03.03.10 23:32 
Einfach [delphi] vor und [/delphi] nach deinem Quelltext-Abschnitt einfügen.

Moderiert von user profile iconNarses: Pseudo-Tagging geändert.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
vazrul Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 03.03.10 23:39 
//Gültiges Zeichen innerhalb des Passwortes?
if I <= Length(PW) Then

also gehst von dem brute forcing davon aus, dass das pw indirekt bekannt ist? verstehe die zeile nicht ganz ;-)
Hatte es so vor , dass beim ergeinis OnCreate vom Formular ein zufälliges PW mit einer zufälligen schlüssellänge generiert wird, was durch das brute forcing erst rausgefunden werden muss (ebenfalls die länge, welche unbekannt ist)
lässt sich sowas in delphi realisieren? (denke mal maximale schlüssellänge sei 4-5, da das brute forcing sonst zu viel zeit in anspruch nimmt oder? Fragen über fragen, bitte um rat ;)

lg
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 03.03.10 23:51 
Nicht ganz. PW ist das Passwort, was gerade ausprobiert wird. Da dabei jedoch nur auf Zeichen innerhalb des PWs zugegriffen werden darf, stellt diese Abfrage sicher, dass wir mit der Schleife davor beim Eintragen des Übertrages nicht über das Ende hinaus gegangen sind.

Das zu erratende Passwort steht in PW_Check drinnen und wird beim ermitteln des Passwortes lediglich beim Vergleich, ob das richtige Passwort gefunden wurde, angefasst.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
vazrul Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 04.03.10 18:59 
so, wollte BenBe's vorerst nicht direkt kopieren und habs nun so programmiert:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
procedure TForm1.FormCreate(Sender: TObject);
var ran,i:integer;
begin
  brute:='';
  randomize;
  pw:='';
    ran:=random(81)+48;
    i:=random(3)+1;
    while i<>0 do begin
    i:=i-1;
    pw:=pw+chr(ran);
    ran:=random(81)+48;
end;
maskedit1.Text:='';
showmessage(pw);
end;

procedure TForm1.Button2Click(Sender: TObject);  //kontrolle des generierten
begin
if maskedit1.Text=pw then begin
showmessage(brute);
form1.close;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k,lang,hilfe,hilfe2:integer;
begin
    for i:=47 to 130 do begin  // kleinbuchstaben und zahlen im ASCII code
      brute:=chr(i);
      maskedit1.Text:=brute;
      button2.Click;
end;    // Ende des durchlaufs für 1 stellige keys
        // key wird bei FormCreate zufällig mit 1/2/3 stellen erzeugt.
brute:='';
    for i:=48 to 129 do begin
      for j:=48 to 129 do begin
      brute:=chr(i)+chr(j);
      maskedit1.Text:=brute;
      button2.Click;
    end;   // ende des durchlaufs für 2 stellige keys
end;
brute:='';
for i:= 47 to 130 do begin
  for j:= 47 to 130 do begin
    for k:= 47 to 130 do begin
    brute:=chr(i)+chr(j)+chr(k);
    maskedit1.Text:=brute;
    button2.Click;
  end// ende des durchlaufs für 3 stellige keys
end;



es tut sogar was es soll ;-)
allerdings läuft während dem bruteforcing gar nichts, ich weiß nie ob das programm am decrypten ist
oder längst abgestürzt. Wollte nebenher nen timer einbaun der die benötigte zeit mist bei Button1.click mit
timer1.enabled welcher dann die sekunden zählt.

allerdings kommts soweit gar net und er führt nur das bruteforcing aus.

Was mich ebenfalls stört, nach der showmessage in Button2.click soll form1.close ausgeführt werden, soweit kommts aber nicht da nach der showmessage die .exe abstürzt

weiß jemand rat? (und ja ich weiß dass brute forcing sehr rechnintensiv ist^^)

lg
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 05.03.10 00:46 
Du führst zwar deine Rechenschritte aus, gibst der VCL aber keine Möglichkeit auf Ereignisse von außen zu reagieren. Dadurch sieht es so aus, als ob das Programm hängen würde.

Um dies zu umgehen, musst du in regelmäßigen Abständen Application.ProcessMessages; ausführen. Dann reagiert die Anwendung. Dabei solltest du dann aber beachten, dass du deine Buttons entsprechend disablest, da der Benutzer sonst mehrfach verschachtelt in deine Bruteforce-Routine gelangt.

Bei deiner Lösung mal noch eine Frage: Warum ist bei zweistelligen Passwörtern von 48, bei den anderen aber ab 47?

Ansonsten bei meiner Variante soweit durchgestiegen, oder ausgestiegen? Wenn ja, wo?

P.S.: Mein Nick schreibt sich BenBE ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
vazrul Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 05.03.10 15:27 
erstmal danke für die antwort ;-) Application.ProcessMessages , wo sollte ich dass deiner meinung nach einbaun? Hab des nur programmiert weil ich es noch selber versuchen wollte, hat nichts damit zu tun dass ich bei deiner Musterlösung nicht durchblicke ;)

lg
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 05.03.10 21:40 
Application.ProcessMessages musst Du an eine Stelle setzen, die regelmäßig aufgerufen wird. Also z.B. als Teil deiner Button2Click-Event-Prozedur vor der Prüfung des Passwortes.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.