Nein, Du arbeitest ganz sicher NICHT mit Olly. Mein Programm enthält spezielle Anti-Olly Sub´s und der Crypter sicherlich auch !
Oh doch. Ich sage ja nicht dass ich die Crackme im Debugger lade - dann geht es natürlich nicht, aber man kann diese auch attachen. Denn beim attachen (im Ring3, per OS API) wird der Prozess afaik "zugefroren" und die nächste Anweisung ist der BP. Wenn man deine Crackme mit dem Olly lädt, dann wird ja auch die Anti-Debuganweisung ausgeführt.
S: Hey, ich glaube das Du uns was vormachst ! Wie komme ich denn auf 733B8E2C ?
Probiers mit GOTO Adresse

. Ist nämlich der Adressraum der MSVBVM60 DLL.
Um alle "Memoryadressräume" zu sehen gehe in Olly unter "View"->"memory"
Mit GOTO kommt man immer zu einer gültigen Speicherstelle.
ußerdem ist mein Prog absichtlich in P-Code kompiliert worden. Wenn, dann ginge es ( NACH dem entpacken )
Ich hab den P-Code mir gar nicht angeschaut und zum Entpacken bin ich zu faul - wozu auch, wenn die VB.DLL alles intern macht. Wenn man deine Crackme einfach startet und was eintippt landet es im Heap. Da muss man nur danach suchen. Ein wenig rumspielen und beobachten. F9 drücken und bestätigen bis die sich schließt und dann den Stack durchgehen.
Genauere Anletung: Crackme öffnen, was eintippen, in Olly attachen. Jetzt landet man bei 77F62838 6A 08 PUSH 8
(Hab in Olly unter Einstellungen "Break on new thread/DLL" an und BP bei WinMain)
das ist wohl die Nachrichtenschleife oder ähnliches.
Jetzt kannst Du unter "View"-> "Memory" viele schöne speicherbereiche auswählen.
Aber man kann auch ein goto 401000 machen (deine EXE). Hier findet man recht schnell die Import Table (binary string suche nach FF 25 was ein far Jump ist).
Code:
00401066 -FF25 14104000 JMP DWORD PTR DS:[401014]
0040106C -FF25 50104000 JMP DWORD PTR DS:[401050]
00401072 -FF25 3C104000 JMP DWORD PTR DS:[40103C]
00401078 -FF25 54104000 JMP DWORD PTR DS:[401054]
0040107E -FF25 20104000 JMP DWORD PTR DS:[401020]
00401084 -FF25 24104000 JMP DWORD PTR DS:[401024]
0040108A -FF25 08104000 JMP DWORD PTR DS:[401008]
00401090 -FF25 1C104000 JMP DWORD PTR DS:[40101C]
00401096 -FF25 58104000 JMP DWORD PTR DS:[401058]
0040109C -FF25 44104000 JMP DWORD PTR DS:[401044]
004010A2 -FF25 0C104000 JMP DWORD PTR DS:[40100C]
004010A8 -FF25 18104000 JMP DWORD PTR DS:[401018]
004010AE -FF25 4C104000 JMP DWORD PTR DS:[40104C]
004010B4 -FF25 10104000 JMP DWORD PTR DS:[401010]
004010BA -FF25 04104000 JMP DWORD PTR DS:[401004]
004010C0 -FF25 38104000 JMP DWORD PTR DS:[401038]
004010C6 -FF25 34104000 JMP DWORD PTR DS:[401034]
004010CC -FF25 28104000 JMP DWORD PTR DS:[401028]
004010D2 -FF25 30104000 JMP DWORD PTR DS:[401030]
004010D8 -FF25 00104000 JMP DWORD PTR DS:[401000]
004010DE -FF25 40104000 JMP DWORD PTR DS:[401040]
004010E4 -FF25 48104000 JMP DWORD PTR DS:[401048]
ein Rechtklick darauf und Follow in the Dump:
Code:
00400FF4 EE 05 49 73 îIs
00401004 83 A6 47 73 6C AB 47 73 69 1C 47 73 9E 1C 47 73 ??Gsl?GsiGsžGs
00401014 96 20 47 73 A3 7B 3B 73 CD AB 47 73 A3 45 3B 73 ? Gs?{;sÍ?Gs?E;s
00401024 FB A5 47 73 FF CF 3A 73 78 B2 3A 73 E9 E6 3B 73 ??Gs??:sx?:sé?;s
00401034 6D 59 46 73 1F 4B 3B 73 F3 54 47 73 5D E0 48 73 mYFsK;sóTGs]?Hs
00401044 C1 17 47 73 12 DE 39 73 D2 1B 47 73 B5 46 3B 73 ÁGs?9s?Gs?F;s
das sind die Adressen die angesprungen werden. Aus der letzen Crackme weiß ich dass es sehr wahrscheinlihc die VBDlll ist. Aber zurück zur dieser JMP Tabelle:
auf alle ein F2 (BP setzen). Und F9 zum ausführen. Nach ein paar F9s kann man "Registriern" betätigen und landet auf einem BP.
Jetzt mit F9 einfach immer weiter bis man eine Exception reingewürgt kriegt. Hier siehe man ins Stackfenster:
Code:
0012F494 001A738C UNICODE "452291"
0012F498 001A73B4 UNICODE "141476"
0012F49C 001A7594 UNICODE "951141"
0012F4A0 001A79BC UNICODE "514321"
0012F4A4 0012F534
0012F4A8 0012F604
0012F4AC 00000001
0012F4B0 77D17576 RETURN to 77D17576 from 77D174D6
0012F4B4 7101069F
0012F4B8 005CBA30 UNICODE "Registrieren !"
das hab ich ehrlich gesagt zuerst für den Key gehalten. Aber weitergehts:
noch mal SHIFT F9 und man darf den laufzeitfehler "0" wegklicken, danach beendet sich die Crackme. Nochmal öffen, pass rein und diesesmal im Dumpfenster ein GOTO 001a738C
machen. Hier großzügig einen Speicherbereich markieren(ist eben der heap und die aderessen müssen nicht zwangsläufig immer dieselben sein) und einen BP "Memory on access" setzen. F9 und "registrieren". Nach einiger Zeit stellt man fest dass die Nummer nichts damit zu tun haben, aber man kommt mal auf die Idee nach dem usernamen zu suchen. Der wird übrigens schon bei der Eingabe eingelesen. Naja, jetzt F9 und auf die Exeption warten. Jetzt STRG+B und nach dem Benutzernahmen in UNICODE suchen:
Code:
001A747C 63 00 64 00 77 00 63 00 64 00 77 00 00 c.d.w.c.d.w..
nochmal alles neustarten, diesesmal aber einen Memory BP eben großzügighierhin setzen. Jetzt auf Registrierung klicken und man landet eben auf diesem Speicherpunkt, wo noch kein Name steht - aber man darf mittels F9 zusehen wie er reingeschrieben wird. Noch ein F9 und in den Stackfenster sehen:
Code:
0012F3BC /0012F3E0
0012F3C0 |7716C0DE RETURN to 7716C0DE from 77168DE7
0012F3C4 |001A747C UNICODE "cdwcdw"
0012F3C8 |03040105
0012F3CC |01010102
0012F3D0 |77F60104
0012F3D4 |00000006
0012F3D8 |00001FFF
0012F3DC |00000000
0012F3E0 ]0012F528
0012F3E4 |733B450B RETURN to 733B450B from 7716C0CF
0012F3E8 |001A747C UNICODE "cdwcdw"
0012F3EC |001A7454 UNICODE "889875"
0012F3F0 |00000000
0012F3F4 |00030001
0012F3F8 |733B8E46 RETURN to 733B8E46 from 733B44E9
0012F3FC |00000000
0012F400 |001A7454 UNICODE "889875"
0012F404 |001A747C UNICODE "cdwcdw"
0012F408 |7348E942 RETURN to 7348E942 from 733B8E2C
0012F40C |00000000
0012F410 |001A7454 UNICODE "889875"
0012F414 |001A747C UNICODE "cdwcdw"
noch ein F9 (falls man nicht schon hier ist):
Code:
7716C278 33C0 XOR EAX,EAX
7716C27A F3:66:A7 REPE CMPS WORD PTR ES:[EDI],WORD PTR DS:>
7716C27D 74 05 JE SHORT 7716C284
blick auf die Register. Blick auf
REPE CMPS WORD
Und jetzt die Preisfrage wie ich auf 733b8e2c komme:
Stackfenster etwas runterscrollen:
Code:
0012F3F8 |733B8E46 RETURN to 733B8E46 from 733B44E9
0012F3FC |00000000
0012F400 |001A7454 UNICODE "889875"
0012F404 |001A747C UNICODE "cdwcdw"
0012F408 |7348E942 RETURN to 7348E942 from 733B8E2C
0012F40C |00000000
0012F410 |001A7454 UNICODE "889875"
0012F414 |001A747C UNICODE "cdwcdw"
Und 733xyz ist die Adressspace von der VBDLL.
Für die Wissbegieriegen: wir gehen mal auf die 733B8E46 im CPU-Fenser und scrollen hoch bis:
Code:
733B8E38 FF7424 0C PUSH DWORD PTR SS:[ESP+C]
733B8E3C FF7424 0C PUSH DWORD PTR SS:[ESP+C]
733B8E40 50 PUSH EAX
>>>>733B8E41 E8 A3B6FFFF CALL 733B44E9<<<<
733B8E46 C2 0C00 RETN 0C
733B8E49 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4]
jetzt schaut man mit irgendeinem Tool (Olly?- Olly: in Olly die msvbvm60 laden)
ein goto:733B8E46
was steht da?
Code:
733B8E40 . 50 PUSH EAX
>>>]733B8E41 . E8 A3B6FFFF CALL msvbvm60.__vbaStrComp<<<<
733B8E46 . C2 0C00 RETN 0C
So, jetzt hab ich mich wieder rausgeredet, damit ich mein Super_Hypertool nicht preisgeben muss, welches eigentlich solche Crackmes automatisch anlysiert
WKTVBDE kannte ich gar nicht, leider ist auch die offizielle Seite nicht mehr da (war das kostenlos? wenn ja kennt jemand einen Link drauf?) . Das Ding wäre ganz nützlich. Der P-Code muss übrigens trotzdem ausgeführt werden - von der VB Virtual Machine. Einer Referenz dafür und man könnte den auch so lesen.
Aber ich dachte der Crackmeersteller muss immer seine Crackmes auch selber cracken können, oder irre ich mich

? Gilt es jetzt möglichst viele Schutzmechanismen draufzuknallen deren Arbeitsweise man gar nicht versteht und dann zu behaupten es wäre unknackbar (man verzeihe mir die Bissigkeit, aber das musste auch mal sein). Soll ich mal eine Crackme schreiben welche auch niemand knacken kann? Ganz ohne Packer. Ich lasse nur die eingegebene Serial per MD5 haschen und die restlichen Jumps im Programm sind Serialabhängig - wer die nicht kennt, der kennt die nicht
PS: in der letzen Woche habe ich wahrscheinlich mehr Crackmes gemacht als in den letzen 2 Jahren. Die sind zwar eine Art Hobby, vertieft habe ich es nie. Etwas Systemkenntniss und grobe Kenntnisse der Funktionsweise von Windows-executables reichen für die meisten Crackmes gut aus *auf andere Crackmes in diesem Unterforum schiel*. Für manche muss man eben etwas tiefer in die Trickkiste greifen (wie mit der DLL). Der Witz an der Sache ist dass ich durch Crackmes erst zum Programmieren gekommen bin - und mich auch für Assembly interessiert hab.