Autor Beitrag
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Mi 27.12.06 13:37 
Ist nicht wirklich was neues ;)
user profile iconJayEff hat folgendes geschrieben:
Naja, man sollte auf jeden fall das Passwort nicht unverschlüsselt speichern, denn wie du gesehen hast, war es kein Probelm für Luckie, dein Programm zu cracken, und btw, die Lösung für Luckies Programm ist "crak". ich habs selbst rausgefunden. Einfach per Hex-editor.
hagbart06
Hält's aus hier
Beiträge: 2

Win XP Home, Win XP Pro, Linux 10.1
Delphi6, C++, Delphi 2005
BeitragVerfasst: Mi 27.12.06 13:43 
Ohh man, tut mir leid, habe gar nicht gemerkt das es mehrere Seiten gibt, haben ur die erste gelesen
zongo-joe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 134

win xp prof
D3, D4, D7
BeitragVerfasst: Mi 27.12.06 14:37 
Da habt Ihr einen gewieften Passwortschutz gefunden. (wenn Ihr mir die Bemerkung erlauben wollt)

Nur: wer soll den benutzen ?

- Wenn man wenige Progs verkauft, braucht man keinen so aufwendigen Schutz, weil entweder keiner Interesse am Crack hat oder das Prog mit Passwort kopiert wird.
- Wenn man viele Progs verkauft, muss man für jedes Programm ein eigenes PW erstellen und dann aber auch jedes verkaufte Programm separat verschlüsseln und brennen, und das ist etwas viel Aufwand, oder ?

Trotzdem, echt keine schlechte Idee !

afk
DarkLord05
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 449

WinXP Pro SP2
Opera; Delphi 3 Pro; Delphi 2005, Turbo Delphi, dev-c++, Eclipse, MS Visual Studio .NET 2003, MS Visual C++
BeitragVerfasst: Mi 27.12.06 14:48 
Ich finde es schon alleine intressant das aus einer einfach geposteten "if-Abfrage" etwas deartiges entsteht. Den Leuten hier gehts glaub ich nicht darum das es irgendwo in nem teuren Programm benutzt wird, sondern eher darum, das sie eine Abfrage schaffen, die man nicht so einfach knacken kann. Also rein ums Prinzip würd es hier voll treffen denk ich mal. Verfolge das hier schon seit dem 1. Post und es ist sehr intressant was da so bisher rauskommt.

_________________
QBasic | Delphi | c++ | PHP | C# .NET | Java
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Mi 27.12.06 15:10 
user profile iconzongo-joe hat folgendes geschrieben:
Da habt Ihr einen gewieften Passwortschutz gefunden. (wenn Ihr mir die Bemerkung erlauben wollt)

Nur: wer soll den benutzen ?

- Wenn man wenige Progs verkauft, braucht man keinen so aufwendigen Schutz, weil entweder keiner Interesse am Crack hat oder das Prog mit Passwort kopiert wird.
- Wenn man viele Progs verkauft, muss man für jedes Programm ein eigenes PW erstellen und dann aber auch jedes verkaufte Programm separat verschlüsseln und brennen, und das ist etwas viel Aufwand, oder ?

Trotzdem, echt keine schlechte Idee !

afk

Hinweis: Diese Passwortabfrage dient schon seit Threadbeginn nicht als Shareware-Schutz o.ä.. Sie dient nur dazu, einen Teil des Programms oder das gesamte Programm so einzuschränken, dass man diesen Teil nur mit einem Passwort asuführen kann. Du könntest zum Beispiel ein Spiel programmieren und es mit dieser Passwortabfrage versehen, sodass nur du das Spiel spielen kannst, und nicht dein nerviger Bruder. ;)
Als Shareware-Schutz ist das überhaupt nicht geeignet. Sobald jemand das Passwort mit der dazugehörigen EXE hat, kann er die Datei problemlos von Hand entschlüsseln und patchen. Dann wären wir wieder auf Seite 1.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 27.12.06 15:15 
Dann ist das Ziel das PW geheim zu halten und zwar so geheim, dass es nichtmal der Programmierer weiß ;-).

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Sirke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 208
Erhaltene Danke: 2



BeitragVerfasst: Mi 27.12.06 15:38 
Ich hoffe ich habe nicht irgend eine Seite vergessen oder einen Beitrag überlesen, aber es ist total Sinnlos eine If-Abfrage so zuverwandeln, dass man Sie umgehen kann! Man muss nur einmal daran denken wozu man diesen Passwort-Schutz benötigt bzw. was man Schützen möchte.

Einen Gegenstand ein einem Raum einzuschließen und die Tür mit verschiedenen Schlüsseln oder Vorhängeschlössern zu versehen bringt doch gar nichts wenn man einfach die Wand einreißt und sich den Gegenstand holt :/
Ich weiß der Vergleich hinkt ein wenign aber auch bei Programmen kann man ja diese gesammt Abfrage "rausschmeißen" und so das Programm ausführen!

Ich denke man möchte damit Inhalte Schützen, also sollte man nicht eine Tür vor den Inhalt bauen sondern den Inhalt verändern, sodass dieser einem nichts bringt, wenn man ihn ließt. KURZ: Verschlüssel die Daten für z.B. jeden Benutzer mit dem Hash des PWs! - An diesem Punkt sollte man seiner Fantasie freien Lauf lassen und nicht an der Tür die man eh umgehen kann!

Mfg Sirke
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 27.12.06 15:45 
joah das hatten wir hier schon besprochen, das ist die einzig sinnvolle möglichkeit, die auch effektiv genug ist.

mfg
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Mi 27.12.06 17:15 
Hi!

Da das Crackme in absehbarer Zeit wohl doch nicht mehr gecrackt wird, habe ich mich entschlossen, das Passwort, den Original-Quelltext, sowie ein Mini-Tutorial zu veröffentlichen. Ich beschreibe hier, wie ich beim Crackme vorgegangen bin. Es mag auch einfachere Wege geben.


Passwort: bruteFORCE


Entschlüsselung:

Edit1.Text enthält das eingegebene Passwort
EncProc ist die verschlüsselte Prozedur.
L ist vorerst nur ein Dummy-Wert, der später korrigiert wird.

1.
Damit bei einem falschen Passwort nicht unnötig versucht wird, Code zu entschlüsseln und auszuführen (was gar nicht mal so ungefährlich ist), habe ich eine kleine Prüfsumme des richtigen Passwortes eingebaut. Allerdings sollte man darauf achten, dass das Passwort genügend lang gewählt wurde, da man per Bruteforce möglicherweise durch den Hash das Passwort herausfinden könnte. Hier wurde folgende Hashmethode eingesetzt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function Hash(S: String): Byte;
var
  i: Integer;
begin
  Hash := $00;
  for i := 1 to Length(S) do
    Hash := Hash xor Ord(S[i]);
emd;

Die Hashlänge beträgt hier nur 1 Byte, was in der Praxis viel zu wenig wäre. Zu Demonstrationszwecken genügt dies jedoch auf jeden Fall. Vor der Verschlüsselung wird das eingegebene Passwort gehasht und mit dem internen Wert (Hash des richtigen Passwortes) verglichen. Stimmen die beiden Werte überein, gehts mit der Entschlüsselung weiter, sind sie verschieden, wird eine Meldung angezeigt, dass das Passwort falsch ist.

2.
Nun entschlüsseln wir den entsprechenden Speicherbereich mit dem zuvor eingesetzten Verschlüsselungsverfahren. Hier habe ich eine der einfachsten Verfahren benutzt, die XOR-Verschlüsselung, die allerdings auf keinen Fall sicher ist.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
const
  L = 123// Länge des verschlüsselten Teils in Bytes
var
  p: PByte;
  i: Integer;
begin
  if Hash(Edit1.Text) = $2E then
  begin
    p := @EncProc;
    for i := 0 to L - 1 do
    begin
      p^ := p^ xor Ord(Edit1.Text[(i mod Length(Edit1.Text)) + 1]);
      inc(p);
    end;

  end
  else
    ShowMessage('Das eingegebene Passwort ist falsch.');  
end;

Der Zeiger p wird Byte für Byte verschoben und an die Stelle im Speicher, an die er hinzeigt, der entschlüsselte Wert geschrieben.

3. Als letzen Schritt rufen wir nun die entschlüsselte Prozedur auf.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
const
  L = 123// Länge des verschlüsselten Teils in Bytes
var
  p: PByte;
  i: Integer;
begin
  if Hash(Edit1.Text) = $2E then
  begin
    p := @EncProc;
    for i := 0 to L - 1 do
    begin
      p^ := p^ xor Ord(Edit1.Text[(i mod Length(Edit1.Text)) + 1]);
      inc(p^);
    end;
    EncProc;
  end
  else
    ShowMessage('Das eingegebene Passwort ist falsch.');  
end;



Verschlüsselung:

1.
Als erstes muss das gesamte Programm fertig sein, mit Entschlüsselungsroutine und allem drum und dran. Lediglich die Prozedur, die später verschlüsselt werden soll, ist noch unverschlüsselt. Wir öffnen die fertige EXE-Datei mit einem Disassembler, z.B. OllyDbg, und suchen im Code die Stelle, die verschlüsselt werden soll. Am Besten geht das mit der String-Suche. Wenn wir die Stelle gefunden haben, lassen wir uns anzeigen, aus wieviele Bytes die gesamte Prozedur einschließlich RETN besteht. Diesen Wert benötigen wir später, deshalb schreiben wir ihn uns auf. Im Disassembler kopieren wir uns die gesamte Prozedur noch in eine neue Datei.

2.
Diese Datei verschlüsseln wir nun mit dem gewünschten Passwort. Die Implementierung einer einfachen, aber unsicheren XOR-Verschlüsselung könnte so aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure Encrypt;
var
  i: Integer;
  psw: String;
  FSIn, FSOut: TFileStream;
  Buf: Byte;
begin
  FSIn := TFileStream.Create('C:\proc.txt', fmOpenRead);    
  FSOut := TFileStream.Create('C:\proc_enc.txt', fmCreate);
  i := 0;
  repeat
    FSIn.Read(Buf, 1);
    Buf := Buf xor Ord(psw[(i mod Length(psw)) + 1]);
    FSOut.Write(Buf, 1);
    inc(i);
  until FS.Position = FS.Size;
end;


3.
Mittels eines Hex-Editors oder eines Disassemblers kopieren wir nun den Inhalt der neuen Datei zurück in unser Programm, genau an die Stelle, wo die zu verschlüsselnde Prozedur ist.

4.
Da wir zur Entwicklungszeit noch nicht wussten, wie groß der zu verschlüsselnde Teil später einmal in der EXE sein wird, müssen wir diesen Wert nachträglich wieder korrigieren. Wir suchen also im Disassembler die Stelle, wo L definiert wird (im Beispielprogramm bekommt L den Wert 123) und überschreiben diesen Wert mit der zuvor am Anfang aufgeschriebenen Zahl. Wir speichern alle Änderungen ab.

5.
Nun können wir unser Programm starten und die Passwortabfrage testen. Viel Spaß!


Anmerkungen:

Alle Variablen, die man in der Prozedur, die verschlüsselt wird, deklariert und initialisiert, werden nicht verschlüsselt. Das liegt daran, dass die Daten für die Variablen nicht zwischen dem eigentlichen Quelltext stehen, sondern außerhalb der Prozedur.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure EncProc;
var
  S: String;
begin
  S := 'Hallo, das kann niemand lesen';  // Die Zuweisung wird verschlüsselt, der eigentliche String jedoch nicht
  ShowMessage('Das auch nicht');         // Der ShowMessage-Aufruf wird verschlüsselt, der angezeigte Text jedoch nicht
end;

Um diese "Sicherheitslücke" zu umgehen müsste man jede einzelne Variable verschlüsseln, oder aber Delphi dazubringen, die Daten für Variablen innerhalb des Codes zu speichern. Ob letzeres möglich ist und wie, kann ich euch auch nicht sagen.


Chryzler
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Chryzler am Mi 27.12.06 20:24, insgesamt 1-mal bearbeitet
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 27.12.06 18:14 
Klingt gut, wenn auch kompliziert. Ich guck das später mal genauer an.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
ConditionZero
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 190

Win XP
Delphi 7 PE, C++ (Dev-C++), HTML+PHP (Dreamweaver MX), JavaScript(MS FrontPage)
BeitragVerfasst: Mi 27.12.06 19:18 
So mal was ganz hartes ;)

Hab des Teil von www.Hackquest.com
da gehts um solche aufgaben.
Da ich gemerkt hab hier sind welche wo sich auskennen hab ich halt mal die schwerste
Aufgabe aus dem Bereich CrackIt genommen :P

Würd mich bei Freuen wenn es jmd. schafft und mir erklärt wie denn das habe ich selber noch nicht hinbekommen...
Einloggen, um Attachments anzusehen!
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Mi 27.12.06 20:27 
Beschreibung aktualisiert. Man kann das ganze OpenProcess, ReadProcessMemory, usw. weglassen. Dadurch verkürzt sich der Code erheblich. Ich hoffe, dass ich jetzt keinen Fehler reingebracht habe.
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Do 31.07.08 15:52 
hab den thread hier durch zufall mal ausgegraben, da ich selber grade dateien von mir schütze
das crackit12 da ist das einfachste was ich gesehen hab...aspack gepackt und mit 1 abfrage geschützt: www.sendspace.com/file/429pt1
da habter die gecrackte version ^^ (jedes pw geht)

der mechanismus von Chryzler gefällt mir
man kann ja mal ein programm schreiben, dass das automatisch macht

das sinnvollste ist es tatsächlich, einen möglichst variablen schlüssel zu nehemen der die wichtigsten daten entschlüsselt
ich hab das mit nem serverseitigen login geregelt. dann noch obfuscater drüber und es ist nicht mehr knackbar (ok doch ist es, aber seeehr umständlich)