-------{pCsK8R's Cracking Tutorial #2}-------
PRoG: ACDSee32 2.4
WHeRe: http://www.acdsystems.com
SKiLLs NeeDeD: BeGiNNeR
ReQueSTeD By: MasterJax
LaNGuaGe: GeRMaN
HoW: Reg-Flag (eigentlich ein Reg-Call)
TooLS: W32Dasm & Hex-Editor

Jo, da bin ich wieder mit meinem 2. Tutorial *WoW* :P
Heute geht's um ACDSee32 2.4.
Also los gehts:

1. Runterladen und installieren. Dann mal das programm analysieren
   und die Registrierungs Option unter Tools->Register...
   ausprobieren. hmm...noch nich gecrackt ;) na denn mal los.

2. Wie wir vielleicht beim analysieren schon gesehen haben, ist in
   der TitelZeile ein "[Unregistered]". Dies werden wir als attack-point
   benutzen. Also Disassemblen (W32Dasm) und unter String References gucken.

3. Dort werden wir auch fuendig:
   " [Unregistered]"
   Nach dreimaligem doppelklick kommen wir zu folgendem:

:0040175B E8104F0000              call 00406670              ;Reg-Check-Routine
:00401760 83F801                  cmp eax, 00000001	     ;check ob eax = 1, wenn ja, dann Regged
:00401763 7432                    je 00401797		     ;und jump weg vom boesen "Unregistered"

* Possible StringData Ref from Data Obj ->" [Unregistered]"
                                  |
:00401765 BF50004E00              mov edi, 004E0050
:0040176A 83C9FF                  or ecx, FFFFFFFF
:0040176D 33C0                    xor eax, eax
:0040176F 55                      push ebp
   
   So, da wir jetzt wissen, dass der call bei 0040175B die Reg-Check-Routine enthaelt, und eax=1 returnen muss,
   damit es regged ist, werden wir in den call reingehen:

-----(Hier wurde ein paar Registry-Checks weggelassen)-----

:00406735 741F                    je 00406756		;wenn der springt, eax=0 (=Unregistered)

---Schnipp--

:00406754 7D0B                    jge 00406761		;(*) Wenn der springt, ist eax trotzdem 0 =>Unregistered

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406735(C)
|
:00406756 5F                      pop edi
:00406757 33C0                    xor eax, eax		;(*) EAX=0 => Unregistered
:00406759 5E                      pop esi
:0040675A 81C424020000            add esp, 00000224
:00406760 C3                      ret			;Return aus dem call, und im programmablauf weiter



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406754(C)
|
:00406761 8D442434                lea eax, dword ptr [esp+34]
:00406765 6A00                    push 00000000
:00406767 8D4C2418                lea ecx, dword ptr [esp+18]
:0040676B 50                      push eax
:0040676C 51                      push ecx

* Possible StringData Ref from Data Obj ->"-314159265"
                                  |
:0040676D 6888034E00              push 004E0388
:00406772 E819230500              call 00458A90
:00406777 83C410                  add esp, 00000010
:0040677A F7D8                    neg eax			;eax wird zahlreichen Rechenoperationen unterzogen
:0040677C 1BC0                    sbb eax, eax			;und returned trotzdem 0, wenn keine gueltige serial
:0040677E 5F                      pop edi
:0040677F F7D8                    neg eax			;vorhanden ist.
:00406781 A340004E00              mov dword ptr [004E0040], eax	
:00406786 5E                      pop esi			
:00406787 81C424020000            add esp, 00000224
:0040678D C3                      ret

   Da das programm abstuerzt, wenn man bei 40677A etc. was aendert, werden wir bei 406735, 406754 & 406757 patchen.
   Der jge bei 406754 muss weg und ein XOR EAX,EAX (33C0h) hin, um bei 406757 ein INC EAX (40h) zu plazieren, um sicherzustellen,
   dass eax=1 ist. Damit uns der JE bei 406735 nicht ueber unser frisch reingepatchtes XOR EAX,EAX rueberspringt, muss er
   auch weggepatched werden.

d.h.
:00406735 741F je 00406756

wird zu
:00406735 48 INC EAX
:00406736 40 DEC EAX
(hier passiert eigentlich gar nichts, es ist ur eleganter als zwei NOP's hinzusetzen, was manche Programme merken, und alarm schlagen)

und
:00406754 7D0B jge 00406761

wird zu
:00406754 33C0 XOR EAX,EAX

und
:00406757 33C0 xor eax, eax

wird zu
:00406757 40 INC EAX
:00406758 90 NOP

Jetzt einen Hex-Editor starten (hier am Beispiel HIEW) und in Decode mode gehen (F4, und dann F3),
dann F5 um zur Adresse zu gehen (hier 6735, 6754 und 6757) und die neuen bytes eingeben (F3 und bytes eintippen)
Dann F9 um die Aenderungen zu speichern und F10 um Hiew zu schliessen. Nun ACDSee32.exe starten, und WOW kein "Unregistered"
mehr in der Titelzeile, und unter Help->About wird unser Name angezeigt :P

Eigentlich eine ziemlich billige protection, oder? :P
Zum schluss noch einen Patch generieren, z.B. mit Flu[X] BytePatcher (Http://tuts98.cjb.net).
Und danach noch die gecrackte exe loeschen und fertig.

pCsK8R , 27-01-99

Bei Fragen #C.i.A oder #GWA im EFNeT (iRC)

Dedicated to: MasterJax und MaSTeR_G_