 X Ŀ B
 O ͻ P
 R  .    .Ŀ .    *    Ŀ Ŀ   . Ŀ  .    *Ŀ   .     * X
ٺ               .۳                     Ŀ
ͼ   * Ŀ    .    ۳ .    Ŀ۳    .  ڿ۳.     .  ͻ
 . Ŀ ۳  Ŀ     Ŀ.. Ŀ ۳ Ŀ Ŀ.
  ۳۳  ۳* .۳*  ۳ ۳*   ۳. ۳ 
 ٳ ۳Ŀ ڿ   Ŀ  ۳  
*. ٳ ۳۳. Ŀ ۳  ڿ..  
 ۳   . ۳  ۳۳ٳ۳   ۳۳ ۳    
        ۳ ٳ۳ .   ڿ   
 Ŀ*       .  .    *  ۳ *      Ŀ     *  ۳* 
. ۳   .                 ۳       . ۳  .     ۳ 
              .              .              ..
members:       *    .       *  members: .            *     .       members:
 *    beanus   dulek      jaro   massh    mig-21 oxcart  zetx
arakus .  coxoc   hannibal  lobix * mauzer    neo  ._root_  
ٺ
ͻ   .        .           *     .         .           *   ĿĿĿĿ ͼ
Ŀ official URL: http://beanus.provider.pl/     .         ٳ۳۳۳ 
 E  *     on IRC: #crackpl or #cookiecrk  *          .       C
 X ͼ M
 P  P

Cel:CrakMe 1.00 by Anton_one
Narzedzia: Si
Zabezpieczenie: password, ANTY-SI

[Ogledziny]
-

[Sekcja]
Odpalamy crackme, nic podejzanego sie nie dzieje, tzn dzieje sie crackme sie odpala i pokazuje
sie okno dialogowe: CrackMe 1.00 by ..... Wiec wprowadzamy jakis kod, zakladamy puapke na funkcje
HmemCpy i OK. Po jakiejs chwili ladujemy za GetDlgItemTextA. Wyglada to tak:


xxx:004010AF  E838010000          CALL      USER32!GetDlgItemTextA            
xxx:004010B4  E8A6000000          CALL      0040115F    <-- tu ladujemy (w srodku ANTYSI)                       
xxx:004010B9  E818000000          CALL      004010D6    <-- liczenie                        
xxx:004010BE  EB8B                JMP       0040104B                           
xxx:004010C0  6A00                PUSH      00                                 
xxx:004010C2  FF7508              PUSH      DWORD PTR [EBP+08]                 
xxx:004010C5  E816010000          CALL      USER32!EndDialog                   
xxx:004010CA  6A00                PUSH      00                                 
xxx:004010CC  E8FD000000          CALL      KERNEL32!ExitProcess               
xxx:004010D1  E975FFFFFF          JMP       0040104B

OK. W lini xxx:004010B4 mamy call`a. F8 jestesmy w srodku, a tam taki kawaleczek kodu :

xxx:0040115F  BFA6314000          MOV       EDI,004031A6 <-- po 4031A6 mamy torche smiecia             
xxx:00401164  33C9                XOR       ECX,ECX          po obrobce przez XOR powstaje                 
xxx:00401166  8A0439              MOV       AL,[EDI+ECX]     na ladna nazwa sterwonika SI
xxx:00401169  3479                XOR       AL,79                              
xxx:0040116B  880439              MOV       [EDI+ECX],AL                       
xxx:0040116E  41                  INC       ECX                                
xxx:0040116F  83F908              CMP       ECX,08                             
xxx:00401172  75F2                JNZ       00401166                           
xxx:00401174  6A00                PUSH      00                                 
xxx:00401176  6A00                PUSH      00                                 
xxx:00401178  6A03                PUSH      03                                 
xxx:0040117A  6A00                PUSH      00                                 
xxx:0040117C  6A00                PUSH      00                                 
xxx:0040117E  6800000080          PUSH      80000000                           
xxx:00401183  68A6314000          PUSH      004031A6                           
xxx:00401188  E83B000000          CALL      KERNEL32!CreateFileA               
xxx:0040118D  83F8FF              CMP       EAX,-01                            
xxx:00401190  751E                JNZ       004011B0                           
xxx:00401192  7425                JZ        004011B9                           
xxx:00401194  50                  PUSH      EAX                                
xxx:00401195  E828000000          CALL      KERNEL32!CloseHandle               
xxx:0040119A  BFA6314000          MOV       EDI,004031A6                       
xxx:0040119F  33C9                XOR       ECX,ECX                            
xxx:004011A1  8A0439              MOV       AL,[EDI+ECX]                       
xxx:004011A4  3479                XOR       AL,79                              
xxx:004011A6  880439              MOV       [EDI+ECX],AL                       
xxx:004011A9  41                  INC       ECX                                
xxx:004011AA  83F908              CMP       ECX,08                             
xxx:004011AD  75F2                JNZ       004011A1                           
xxx:004011AF  C3                  RET                
xxx:004011B0  C605AF31400001      MOV       BYTE PTR [004031AF],01       
xxx:004011B7  EBDB                JMP       00401194                       
xxx:004011B9  C605AF31400000      MOV       BYTE PTR [004031AF],00             
xxx:004011C0  EBD2                JMP       00401194                  

TO co widac powyzej to nci innego jak proba stworzenia pliku w pamieci o nazwie sterownika SI.
jak wiadomo jezeli takowy istnieje proba sie nie powiedzie i zostaniemy odestalni do lini 
xxx:004011B0, gdzie pod wskazany adres zostanie wpisana 1. Jedna zecz ktora mnei tu zastanawia
to uzycie przez autora skokow JNZ i JZ - np. JNZ nie zaistnial wiec Z jest ustwaiona, nie trzeba juz
sprawdzac flagi wystarczy uzyc skoku bezwarunkowego. Wiec tu sprawdzany jest pamiec na obecnosc
sterownikow SI - latwo wyelminowac tego rodzaju zabezpiecznie przez zpatchowanie winice.exe - ale
nie nalezy rozpedzac sie za bardzo (pozniej moga byc problemy z prawdilowa praca loadera, ale to
juz inna historia (:. Dobra ANTYSI juz "nie ma" wiec przechodzimy do drugiego call`a a tam 
znajdujemy :

xxx:004010F9  BE0D304000          MOV       ESI,0040300D                      
xxx:004010FE  33C9                XOR       ECX,ECX                          
xxx:00401100  33D2                XOR       EDX,EDX                            
xxx:00401102  4E                  DEC       ESI                                
xxx:00401103  46                  INC       ESI                                
xxx:00401104  8A06                MOV       AL,[ESI]                           
xxx:00401106  0FB6C0              MOVZX     EAX,AL                             
xxx:00401109  03D0                ADD       EDX,EAX                            
xxx:0040110B  23C0                AND       EAX,EAX                            
xxx:0040110D  7402                JZ        00401111                           
xxx:0040110F  EBF2                JMP       00401103                           
xxx:00401111  81FA1E060000        CMP       EDX,0000061E                       
xxx:00401117  7416                JZ        0040112F <-- juezeli rowne idz dalej                          
xxx:00401119  7500                JNZ       0040111B <-- nie potrzebny skok, skacze linije nizej                          
xxx:0040111B  6A10                PUSH      10           wiec jego uzytecznosc stoi pod znakiem                       
xxx:0040111D  6800304000          PUSH      00403000     zapytania                      
xxx:00401122  6871304000          PUSH      00403071                           
xxx:00401127  6A00                PUSH      00                                 
xxx:00401129  E8C4000000          CALL      USER32!MessageBoxA 

Ten kawalek kodu powyzej to nic innego jak sumowanie wszystkich wpisanych znakow i porownanie
tej sumy z wartoscia 61Eh. (instrukcja AND ma tu zastopic CMP EAX,0). Teraz zmienmy flage badz
wartosc rejestru EAX i przejdzmy dalej aby poznac caly schemat zabezpieczenia, a nie tylko jego
czesc. Wiec skaczemy do 40112F a tam:

xxx:004010D8  BF0D304000          MOV       EDI,0040300D                  
xxx:004010DD  33C9                XOR       ECX,ECX                            
xxx:004010DF  8A0439              MOV       AL,[EDI+ECX]                       
xxx:004010E2  41                  INC       ECX                                
xxx:004010E3  22C0                AND       AL,AL                              
xxx:004010E5  7402                JZ        004010E9                           
xxx:004010E7  EBF6                JMP       004010DF               
xxx:004010E9  49                  DEC       ECX                                
xxx:004010EA  C1E105              SHL       ECX,05                             
xxx:004010ED  81F9E0010000        CMP       ECX,000001E0                       
xxx:004010F3  7526                JNZ       0040111B <-- znowu                          
xxx:004010F5  744B                JZ        00401142 <-- znowu                          
xxx:004010F7  EB22                JMP       0040111B          

Linie od 4010D8 do 4010E7 to nic innego jak sprawdzenie ilosci wpsanych znakow przy uzycie ECX.
Wiec ilosc uzytych znakow mosi byc rowna SHR ilosc,5 gdzie po tej operacji w ilosc = 1E0. Wynik
brzmi 15. dobra znowu zmieniamy flage badz zawartosc ECX. teraz ladujemy tuaj : 


xxx:0040112F  BE0D304000          MOV       ESI,0040300D                       
xxx:00401134  8B06                MOV       EAX,[ESI]                          
xxx:00401136  C1E80C              SHR       EAX,0C                             
xxx:00401139  3DF5960600          CMP       EAX,000696F5                       
xxx:0040113E  7498                JZ        004010D8                           
xxx:00401140  EBD9                JMP       0040111B                           
xxx:00401142  803DAF31400001      CMP       BYTE PTR [004031AF],01 <-- pod 4031AF jest wynik              
xxx:00401149  74D0                JZ        0040111B                   operacji na sprawdzanie        
xxx:0040114B  6A40                PUSH      40                         obecnosci SI        
xxx:0040114D  6800304000          PUSH      00403000                           
xxx:00401152  6886304000          PUSH      00403086                           
xxx:00401157  6A00                PUSH      00                               
xxx:00401159  E894000000          CALL      USER32!MessageBoxA <-- Good

To juz ostatnia czesc zabezpieczenia. Ladowane sa tu do rejestu EAX pierwsze 4 bajty wpisanego
ciagu znakow. Ich wartosc po przesunieciu w prawo (SHR) powinna byc ronwa 000696F5h, jezeli tak
jest wykonany jest skok do ostatniego porownania - 401142, gdzie sprawdzana jest adres 4031AF 
( jak by ktos nie pamietal tam byl zpaisany wynik sprawdzania SI 0 - nie ma 1 jest).

[Protokol]
Wiemy ze prwaidlowy ciag znakow powinien miec dlugosc ronwa 15 zankom, a piersze 4 bajty tego
kodu po przesunieciu maja nam dac wynik 696F5 - no i nie zapominajmy o sumie wszytskich znakow
rownej 61Eh. No to :

		696F5 -> xx5x6F69 -> za x wstaw jakies wartosci
			 x x o i  
 					=> P^oixxxxxxxxxxx => za x wstawiwamy takie znaki
							      aby laczna suma znakow sringu
							      dala 61Eh. Moje haslo wyglada tak:
							      P^oirun8_r-ot_  (=211d ASCII)
_______________________________________________________________________________________________
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Greetz: CookieCrK & #crackpl

     r00t^CookieCrK

   mail:r00t@polbox.com

website: www.cookiecrk.z.pl
				 
									
