
                            
                      
                  
                  
                     
                        
                        
                      
              
           
             
                    
                                             
        www.acg.silesianet.pl- --- ---- -----acg@silesianet.pl
        _ __ ___ ____ _____ ______ _______ ________ __________
        
        [Name .............................liquid_crcme1.exe ]
        [Author .........................................ART ]

        PATCH [ ]      CRACK [ ]      SERIAL [ ]    KEYGEN [ ] 
        UTIL  [ ]      OTHERS[ ]      LOADER [ ]       TUT [*]   
        _ __ ___ ____ _____ ______ _______ ________ __________

 Wstep...
 Ktos mnie poprosil o napisanie tutora do tego (baaaaardzo
 starego) crackme wiec oto i on. Ale dla poczatkujacych jak 
 znalazl.
 
 Zaczynamy...
 Odpalamy naszego SoftICE, wlaczamy crackme, wpisujemy nasze
 dane. Teraz wchodzimy do SI Ctrl+D, zakladamy "pulapke" na 
 pobranie stringa poleceniem bpx GetWindowTextA = wychodzimy
 (Ctrl+D) Wciskamy OK i SI nie wyskakuje, wiec zmieniamy nasza
 pulapke. Ponownie wchodzimy do SI (Ctrl+D) i wpisujemy 
 bpx GetDlgItemTextA, wychodzimy z SI ponownie wciskamy OK i tym
 razem SI nam wyskakuje. Teraz wciskamy F11. I jestesmy w kodzie
 crkme. Widzimy cos takiego... (przez kolejne linie przechodzimy
 wciskajac F10)

 40120B    CALL      USER32!GetDlgItemTextA
 401210    TEST      EAX,EAX
 401212    JZ        00401267 
 401214    MOV       [ESI],AX
 401217    MOV       EDX,EAX
 401219    LEA       EBX,[00403143]
 40121F    ADD       EDX,EBX
 401221    DEC       EDX
 401222    XOR       ECX,ECX

 Powyzszy framgment wrzuci nasz name pod adres 403143, pobierze ilosc
 znakow i ustawi sie na ostatniej literce naszego haselka...

 --------------------------------
 401224    MOV       CL,[ESI]     ten fragmencik najbardziej nas
 401226    MOV       AL,[EDX]     interesuje. Co on robi: Pobiera
 401228    SHL       AL,1         ostatni znak naszego hasla i: 
 40122A    XOR       [EBX],AL     SHL nasza litera,1 (definicja SHL
 40122C    INC       EBX          na koncu) potej operacji xoruje
 40122D    DEC       EDX          pierwsza litere naszgo hasla przez
 40122E    LOOPNZ    00401226     to co wyszlo z SHL.
 --------------------------------
 Powtarza te operacje az odczyta wszystkie znaki. Schematycznie 
 wyglada to tak:
         
 (pierwsza litera hasla) xor (SHL ostatni znak,1) 
    (druga litera hasla) xor (SHL przedostatni znak,1)
  (trzecia litera hasla) xor (SHL przedprzedostatni znak,1)
 i tak do konca. Program umieszcza wynik tej operacji w miejscu gdzie
 znajdowala sie litera dla ktorej bylo to obliczenie. Wiec po bedzie
 po polowie bedzie pobieral przeksztalcone litery. Troche to zakrecone
 wiec przyklad dla hasla: Artur

   72->shl1-> E4 xor 41 (A) =>A5
   75->shl1-> EA xor 72 (r) =>98
   74->shl1-> E8 xor 74 (t) =>9C
  *98->shl1-> 30 xor 75 (u) =>45  <tu pobiera juz przeksztalcony
  *A5->shl1-> 4A xor 72 (r) =>38  <tu pobiera juz przeksztalcony

  98 zamiast 72 i A5 zamiast 41...
  Oki, prosciej chyba juz sie nie da :))
  
  Ponizszy fragmencik porownuje nasze haslo "po przejsciach" z tym
  co pod adresem 4030000 az natrafi na roznice. Jak roznica to nas
  wywala...
 401230    LEA       EDI,[00403000]
 401236    LEA       EBX,[00403143]
 40123C    XOR       EDX,EDX
 40123E    MOV       DL,[EDI]
 401240    XOR       DL,[EBX]
 401242    JNZ       00401267       < czy sie rozni
 401244    INC       EDI
 401245    INC       EBX
 401246    CMP       BYTE PTR [EDI],00  < czy juz koniec
 401249    JNZ       0040123E
 40124B    PUSH      00
 40124D    PUSH      004030F3
 401252    PUSH      00403106
 401257    PUSH      00
 401259    CALL      USER32!MessageBoxA   < gratulacje :))
 40125E    PUSH      00
 401260    CALL      KERNEL32!ExitProcess
 401265    JMP       004012D2
 401267    PUSH      00
 401269    PUSH      004030F3
 40126E    PUSH      00403126
 401273    PUSH      00
 401275    CALL      USER32!MessageBoxA
 
 Teraz policzymy poprawne haselko...
 Spisujemy sobie to co bylo pod ardesem 403000 +16 znakow az
 bedzie 00 ktore w tym przypadku oznacza koniec.
 I mamy:
 B8 A7 B9 97 93 B1 B4 24 68 0B 0D 54 5C 17 2D 04
 
 I odwracamy :

 na tej tabelce bedzie to najlatwiej zrozumiec...
 wpisane sa te dane, ktore mamy...

 1? SHL1-> X? xor x? >> B8  chyba nie bedzie problemu 1? to ostani
 2? SHL1-> X? xor x? >> A7  znak na dole czyli 74
 3? SHL1-> X? xor x? >> B9  czyli 74 shl1 ->E8; E8 xor B8-> 50 (P)
 4? SHL1-> X? xor x? >> 97  
 5? SHL1-> X? xor x? >> 93  
 6? SHL1-> X? xor x? >> B1  
 7? SHL1-> X? xor x? >> B4  
 8? SHL1-> X? xor x? >> 24    
 24 SHL1-> X? xor 8? >> 68   czyli 24 SHL1= 48; 48 xor 68 = 20 ( )
 B4 SHL1-> X? xor 7? >> 0B   czyli B4 SHL1= 68; 68 xor 0B = 63 (c)
 B1 SHL1-> X? xor 6? >> 0D   czyli B1 SHL1= 62; 62 xor 0D = 6F (o)
 93 SHL1-> X? xor 5? >> 54   czyli 93 SHL1= 26; 26 xor 54 = 72 (r)
 97 SHL1-> X? xor 4? >> 5C   czyli 97 SHL1= 2E; 2E xor 5C = 72 (r)
 B9 SHL1-> X? xor 3? >> 17   czyli B9 SHL1= 72; 72 xor 17 = 65 (e)
 A7 SHL1-> X? xor 2? >> 2D   czyli A7 SHL1= 4E; 4E xor 2D = 63 (c)
 B8 SHL1-> X? xor 1? >> 04   czyli B8 SHL1= 70; 70 xor 04 = 74 (t)

 !!! Pamietaj zeby zaczac liczyc od konca !!!
 I to by bylo na tyle, zdaje sobie sprawe ze moje wyjasnienia nie 
 sa "najjasniesze" ale... mam nadzieje ze kilku osobom to pomoglo.
 Trzeba dokladnie przyjrzec sie tej tabeli i zakapujesz o co chodzi :))
 A haslo do tego crackme to >>> Password correct <<<
 Pozdrovka dla wszystkich crackerow.

        _ __ ___ ____ _____ ______ _______ ________ __________
                           ___   ___  ______                                         
                          / _ | / _ \/_  __/                                         
                         / __ |/ , _/ / /                                            
                        /_/ |_/_/|_| /_/                                             
           art23@go2.pl
        _ __ ___ ____ _____ ______ _______ ________ __________
