             ___  ___ _  _   ____   ___ ____   ____   ____
           _/  /_/  // \/ \ /    \ /  //    \ /    \ /    \
          /_   _/  //      \  ___//  //  ___//  ___//  ___/
           /  //__//        \___//  //  ___//___  //___  /
          /______//___\__/\  \_//____/___ / \____/ \____/
                           \__\
             

                     ~~~~~~~~tIMELESS~~~~~~~~
                       Founder of fRACTUs`99


   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   | Keygen ( )   RegKey ( )   Regfile ( )   Crack ( )   Appz  ( ) |                                                              
   |                                                               | 
   | Tutor  (x)   Progz  ( )   Message ( )   Filez ( )   Other ( ) |                                                              
   |                                                               | 
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


                      ...Creative Cracking...
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~

Und wieder mal ein Tutor von mir...und wiedermal in SoftICE......


Ziel    : Jaylock (gibts auf www.jaytown.com)
Bentigt: SoftICE 3.XX / 4.XX
Typ     : Serial, Berechnung aus vorgegebener ID


Also fangen wir mal an....
Wir installieren Jaylock und starten es mal. Als erstes poppt uns ein
"Please Register"-Screen entgegen, wo wir eine Registriernummer eingeben
knnen. Allerdings steht im selben Fenster auch eine Program-ID. 
Fr uns heisst das, das die Registrierungsnummer offensichtlich aus der
angegebenen ID berechnet wird. Somit scheidet die Mglichkeit aus, eine
Serial zu rippen, die auch ein dritter benutzen kann. Also mssen wir 
etwas kreativ sein. 
Wir geben als erstes mal eine Fakeserial ein. Als nchstes berlegen wir
uns mal wie wir breaken....mein erster Versuch ist immer: 

BPX GETWINDOWTEXTA
BPX GETDLGITEMTEXTA
BPX MESSAGEBOXA

Damit komm ich fast immer rein. Wir gehen in SoftICE und setzen mal diese
3 Breaks. Als wir wieder rausgehen, poppt SI gleich wieder hoch und sagt
uns, dass ein GetWindowTextA der Verursacher dieses Breaks ist. Wir 
knnen F5/Strg+D solang drcken wie wir wollen....wir kommen immer wieder
zurck. Also nicht unbedingt das was wir wollen. Also deaktivieren wir
den BPX GETWINDOWTEXTA (bd X; X ist die Nummer des Breaks). Wieder raus
aus SI und OK drcken. Wieder poppt SI hoch...diesesmal wegen einer 
MESSAGEBOXA. Wunderbar. Wir drcken F11/F12 um zum Call zurckzukommen.
Die Falscher-Code-Message poppt uns entgegen...wir drcken OK und sind
wieder auf ICE. Wir sind eine Stelle unter dem Call-MessageBoxA. Und
jetzt schauen wir uns mal ein bisschen Code ber dem Call an. Bei einem
BPX MESSAGBOXA mssen wir uns immer folgendes Schema vor Augen halten.
Zuerst kommt nach dem Oberen RET-Befehl mal ein bisschen Code, der nicht
interessiert. Als nchstes kommt ein Call, der die Serials vergleicht.
Dann ein CMP oder TEST, der die Serial validiert und dann ein Conditional
Jump, der ber die Fehlermeldung wegspringt bzw. in die Meldung rein (in
letzterem Fall steht unter dem Conditional Jump ein JMP-Befehl, der dann
die Fehlermeldung berspringt). Also wie folgt: 
 
  ...
  ...
  CALL   <IRGENDWOHIN>
  CMP    <IRGENDWAS/IRGENDWAS>
 JZ/JNZ  <NACH DIE FEHLERMELDUNG>---------\
  ...                                      |
  ...                                      |
  CALL   <MESSAGEBOXA>                     |
  ...                                      |
  ...                                      |
  RET                                      |
  ... <-----------------------------------/


Also, das Schema ist soweit klar oder? Natrlich knnen einzeln Abweichungen
auftreten. Nun schauen wir nochmal den Code ber dem Call an.........
Sehen wir so ein Schema? Nun, da sind zwei Jumps, die immer nur um eine
oder zwei Zeilen weiterspringen, weiterhin auch ein paar Calls. Aber
davor schon das RET.....kann das also die Validierung des Codes sein?
NEIN. Also mssen wir noch eine Ebene hher...wir drcken F12.
Wir sind nun an einer Stelle die so aussehen msste: 

CALL 00407DE0	
MOV  ECX, [ESI+000000D8]
ADD  ESP, 04
CMP  EAX, ECX
JZ   0040655A ---------------------------
...  ........                           |
...  ........                           |
CALL 00420977                           |
CMP  DWORD PTR [ESI+000000DC], 03       |
...  ........                           |
...  ........                           |
RET                                     |
MOV  ECX, ESI <--------------------------

Erkennen wir hier das Schema? Ein Call, danach ein Vergleich und danach
ein Conditional Jump, der ber den nchsten RET und somit die MessageBox
berspringt, die in dem zweiten Call ist. Ist das etwa nicht vorzeigereif?
Jetzt berlegen wir mal den nchsten Schritt. Der Vergleich lautet: 

CMP  EAX, ECX

Also keine Validierung im 0/1-Schema sondern direkt ein Vergleich zweier
Werte...knnte also theoretisch der Vergleich der Fakeserial mit der
richtigen sein. Probieren wirs aus...Wir setzen einen BPX auf dem CMP.
Deaktivieren vorher aber noch alle anderen Breakpoints. Wieder raus aus
SoftICE und wieder OK drcken. Wir breaken beim CMP. Betrachten wir das
Register EAX nher, erkennen wir unsere Serial als HexWert wieder. Demnach
muss ECX also die richtige sein (kleiner Tip: sie ist es ;-)). 
STOP!
Wie wir am Anfang gesagt haben, wird diese Serial aus der ID berechnet.
Also bringt es uns jetzt herzlich wenig, wenn wir jetzt aufhren. Wir 
wollen ja, dass viele Leute diese Serial verwenden. Also mssen wir ein
bisschen um die Ecke denken. Der CMP vergleicht eingegebene Serial mit
berechneter Serial: CMP  EAX, ECX. Was wre aber, wenn an dieser Stelle
die berechnete Serial mit der berechneten Serial verglichen werden wrde.
Hmmmmmm....das Programm vergleicht zwei Werte, ist zufrieden und registriert
sich selbst. Das hrt sich doch gut an! Und ausserdem ist das Programm
nach dem Neustarten immernoch registriert, da es ja die richtige Serial
in der WinReg gespeichert hat.......Und das machen wir jetzt.
Wir ndern einfach den Asm-Code 

CMP  EAX, ECX 

in 

CMP  ECX, ECX 

um. Das machen wir mit "a" (der Balken muss auf dem CMP stehen!). Wir 
berschreiben den CMP, lschen alle Breakpoints und gehen aus SI raus.
Man dankt uns frs registrieren, also hat es geklappt. Neustarten des
Programms....immer noch. Tja, wir wiedermal ;-)))))). 

Um unsere Arbeit jetzt zu publizieren (schnes Wort) haben wir zwei Mglichkeiten:

1.) Wir bauen einen Crack, d.h. wir suchen uns die HexWerte aus dem Prog
    raus, suchen danach in einem HexEditor und patchen die Bytes. Nehmen
    eine coole Compare-engine unserer Wahl und bauen den Crack.
    Aber Achtung: Nehmt nicht die Bytes des CMP...die gibts im Programm
    ungefhr 1.000.000.000....mal. Nehmt am Besten die HexWerte des Calls
    und der Werte danach, die gibts in dieser Reihenfolge nur einmal.
    Sollte das immernoch zu unsicher sein, kann man ja den HIEW als Sttze
    nehmen (ASM-Code anzeigen lassen).

2.) In die WinReg gehen und unter HKLM den Softwarekey fr Jaytown/Jaylock
    exportieren. Wenn dann ein dritter diesen Eintrag ausfhrt, wird auch 
    seine Prog-ID gendert, und die Serial funzt auch bei ihm.

~~~~~~~~
Alles soweit verstanden? 
Wenn nicht, dann zgert nicht mir zu mailen: tIMELESS99@gmx.net

cu all
tIMELESS - fTs
