____________________________________________________________________________________                                                          
                    _________\          |            __________  
                   /          \      __-+-  __      |         /\ 
                  /___________/     /'( |_  )`\     |________/  \
                 |   \       /     / . \/^\/ . \            /   /
                  \   \           /  _)_`-'_(_  \          /   / 
                   \   \         /.-~   ).(   ~-.\        /   /  
                    \   \       /'     /\_/\     `\      /   /   
                     \  /     __  ___  " __"  __  _ _  \/   /    
                      \/     / _)(  ,)  (  ) / _)( ) )  \__/_    
                            ( (_  )  \  /()\( (_  )  \           
                             \__)(_)\_)(_)(_)\__)(_)\_)          
                                ___             __               
                               (  ,\o l a n d  (  )              
                                ) _/ cRACKING   )(__             
                               (_)      gROUP  (____)            
                                    ____     /\                  
                                   /  \     /  \                 
                                  /\   \   /   /                 
                                    \   \ /   /                  
                                     \___\___/                   
_______________________________________________________________________________________

                                CrackPl prezentuje 
				 iwan's tutorial#4 
_______________________________________________________________________________________

Cel: WinRAR 2.05
Skad: http://tucows.icm.edu.pl/comp95.html; ChipCD 1/99
Rozmiar: 0,5 MB
Czym: Softice, Wdasm, Hiew
--------------------------------------------------------------------------------------
Wstep:
WinRAR jest programem do kompresji. Posiada m.in. mozliwosc tworzenia plikow samorozpakowujacych sie, tworzenia archiwow podzielonych na czesci na twardym dysku (a nie tylko na dyskietkach, jak w przepadku popularnego Winzipa). Efekty jego dzialania sa zazwyczaj lepsze od Winzipa.

Program rejestruje sie po wpisaniu tekstu i odpowiadajacego mu kodu. Sposob generowania tego seriala jest bardzo zlozony i dosc skomplikowany, a bez jego analizy nie da sie znalezc wlasciwego numeru. Dlatego zdecydowalem sie na analize kodu programu i jego (delikatnej) modyfikacji. Jak sie pozniej okaze, sposob bedzie troche podobny do tego opisanego w poprzednim tutorialu Dlatego tez nie bede drugi raz pisal, jak wykonac podstawowe czynnosci w Wdasm, czy tez Hiew (znajdziesz to w iwan's tutorial#3 - Opera 3.50). Tym razem dodatkowo pomozemy sobie Softicem.
So, let's do it!
--------------------------------------------------------------------------------------

Opis:

Tradycyjnie zaczynamy od wstepnego rozpoznania celu. Po uruchomieniu WinRAR'a widzimy, ze:
- do nazwy okna glownego dolaczony jest dodatek -> (evaluation copy),
- pakujac plik(i) nie mozemy zaznaczyc ciekawej opcji - 'Put authenticity verification',
- w menu Options znajdujemy Registration, co doprowadza nas do okienka rejestracyjnego.

OK, wpiszmy wiec dowolne dane w okienku rejestracyjnym. Zalozmy pulapke na pobranie danych z okienka w Softice. Ctrl+D i bpx GetDlgItemTextA. Wracamy do Windy (Ctrl+D) i naciskamy OK. Bach, jestesmy znow w SI. Jeszcze raz Ctrl+D, potem F11 i docieramy do interesujacego nas fragmentu kodu. 

:00413C11 E8F80C0100              Call USER32!GetDlgItemTextA
:00413C16 80BD54FFFFFF00          cmp byte ptr [ebp+00AC], 00 <- tu jestesmy
:00413C1D 751A                    jne 00413C39
:00413C1F 6A66                    push 00000066
:00413C21 FF7508                  push [ebp+08]
:00413C24 E8A10B0100              Call USER32!GetDlgItem
:00413C29 50                      push eax
:00413C2A E8550C0100              Call USER32!SetFocus
:00413C2F B801000000              mov eax, 00000001
:00413C34 E9F2000000              jmp 00413D2B
:00413C39 8D559C                  lea edx, dword ptr [ebp-64]
:00413C3C 52                      push edx
:00413C3D 6830AD4200              push 0042AD30
:00413C42 E831920000              call 0041CE78
:00413C47 83C408                  add esp, 08
:00413C4A 8D8D54FFFFFF            lea ecx, dword ptr [ebp+00AC]
:00413C50 51                      push ecx
:00413C51 8D459C                  lea eax, dword ptr [ebp-64]
:00413C54 50                      push eax
:00413C55 E84B68FFFF              call 0040A4A5
:00413C5A 83C408                  add esp, 08
:00413C5D 85C0                    test eax, eax
:00413C5F 7532                    jnz 00413C93

Zanim zaczniemy sledzenie kodu od miejsca, w ktorym wyladowalismy, spojrzmy kilka linijek nizej. Bardzo interesujace wydaja sie byc dwie ostatnie linijki powyzszego fragmentu - test eax, eax i jnz. Spobujmy dojsc do linii :00413C5F bez wchodzenia w CALL'e po drodze (F10). Skok nie zostaje wykonany i po kilku kolejnych krokach wracamy do Windy i widzimy komunikat 'Registration Failed'. OK, pewno wystarczy zmienic ten skok i po sprawie. Nieprawda. To samo chcielismy zrobic w Operze i nie zadzialalo. Kto nie wierzy, niech sprawdzi. Mozna to zrobic tak: 
- dojsc do linii :00413C5F i zmienic flage zerowa (r fl z),
- po kilku kolejnych krokach zobaczymy co prawda napis 'Thank you for support', ale po kolejnym uruchomieniu programy (evaluation copy) pojawi sie znowu; poza tym zmiena tego skoku nie odblokowywuje opcji 'Put authenticity verification'.

Wrocmy wiec do analizy. Wiemy juz, ze pozadane jest wykonanie skoku w linii :00413C5F. Kiedy wiec zostanie on wykonany? Pamietajmy, ze JNZ to to samo co JNE. Spojrzmy linie wyzej -> TEST EAX, EAX. Zeby skok zostal wykonany, w EAX misi znalezc sie 1. Dlaczego? Przede wszystkim nalezy wyjasnic, jak dziala TEST EAX, EAX (ktora z pozoru wydawac sie moze bez sensu - po co porownywac cos z samym soba?).
 
---------------------------
Newbies Note!
TEST EAX, EAX to operacja rownowazna logicznej koniunkcji, a wiec instrukcji AND. Tak dla przypomnienia (a AND b = c):

a | b |  c            
==========
1 | 1 |  1
0 | 1 |  0
1 | 0 |  0
0 | 0 |  0

W wyniku TEST EAX, EAX zostaje m.in. ustawiona flaga zerowa w przypadku, gdy EAX jest rozny od 1 (patrz tabela wyzej). Nastepujace potem instrukcja JE(JZ) lub JNE(JNZ) odniesc mozna wlasnie do flagi zerowej.
---------------------------

OK, wiemy juz, jak dzial TEST EAX, EAX. Pamietamy tez, ze nastepujacy pozniej skok warunkowy (JNZ) ma zostac wykonany. Flaga zerowa nie moze byc wiec ustawiona (skok, gdy rozne od zera), a to mozliwe jest jedynie, gdy EAX=1. Proste, nie?

Dobra, ale co zrobic, by w EAX rzeczywiscie znalazlo sie 1? Dwie linie nad TEST EAX, EAX widzimy komende CALL 0040A4A5. Najprawdopodobniej procedura, ktora przywoluje, odpowiada za wartosc, jaka znajdzie sie w EAX w momencie powrotu z procedury.
Dalsza analize kodu moglibysmy prowadzic uzywajac nadal Softice. Jednak ze wzgledu na to, ze przywolywana procedura jest dosc dluga i zlozona, zdecydowalem sie przejsc do Wdasm. Zapamietajmy wiec:

:00413C55 E84B68FFFF              call 0040A4A5

i po wylaczeniu pulapki (BC 0) wyjdzmy z Softice i otworzmy Wdasm, a w nim plik winrar95.exe (warto od razu zachowac go jako 'Project File').

Docieramy do linii z powyzszym CALL'em (menu Goto -> Goto Code Location -> Code Offset(Hex) 413C55) i naciskamy 'strzlke w lewo',  by dotrzec do wywolywanej procedury. Szukamy (idac w dol ;)) pierwszej instrukcjei RET, ktora odnajdujemy w :0040A78B. Jak widac, procedura jest dosc dluga. Wiemy, ze momencie powrotu z procedury chcemy miec w rejestrze EAX 1 (pamietacie TEST EAX, EAX i potem JNZ, ktory chcemy wykonac?).
Zaczynamy wiec analize tej procedury od konca, od instrukcji RET. Kilka linijek wyzej znajdujemy cos takiego:

:0040A780 A15C574200              mov eax, dword ptr [0042575C]

Hmm, w wiec w EAX umieszczane jest cos, co znajduje sie w [0042575C]. A jezeli sie tam znajduje, to znaczy, ze wczesniej zostalo tam umieszczone :)))
Pamietacie, co zrobilismy w analogicznej sytuacji w Operze (tut#3)? Tak, menu Search -> Find Text -> mov dword ptr [0042575C] (najlepiej wybrac od razu kierunek - gra). 
Znaleziono jeden raz (Text found on line: 18303) i to nie daleko od miejsca, w ktorym sie znajdujemy. Kewl :).

:0040A71C 890D5C574200            mov dword ptr [0042575C], ecx

Widzimy, ze do intersesujacej nas lokalizacji laduje zawartosc rejestru ECX. Bardzo bysmy chcieli, by bylo tam 1 ;). Pomozmy wiec jej sie tam znalezc. Patrzymy na kilka linii powyzej:

:0040A70C E833280100              call 0041CF44
:0040A711 83C40C                  add esp, 0000000C
:0040A714 85C0                    test eax, eax
:0040A716 0F94C1                  sete cl
:0040A719 83E101                  and ecx, 00000001
:0040A71C 890D5C574200            mov dword ptr [0042575C], ecx


ROZWIAZANIE 1 (dluzsze, ale latwiejsze)
A coz to za dziwnosci? Czy nie lepiej byloby, gdybysmy byli pewni, ze w ECX znajdzie sie 1? Mysle, ze 'mov ecx, 00000001' wygladaloby dosc dobrze ;).
Teraz tak: 'sete cl' to '0F94C1' czyli 3 bajty (kazde dwa znaki to jeden bajt).
'and ecx, 00000001' to takze 3 bajty ('83E101').
'mov ecx, 00000001' wygladac bedzie natomiast tak -> B901000000 (zaraz sie o tym przekonasz, w Hiew, wole to jednak wyjasnic wczesniej).
Jezeli wiec z 'and ecx, 00000001' (3 bajty) chcemy zrobic 'mov ecx, 00000001' (5 bajtow), to brakuje nam 1 bajt. A jako, ze 'sete cl' nie jest nam do niczego patrzebne ;), zastapimy je przez 'nop', czyli 90 (1 bajt). Zmodyfikowany fragment powinien wiec wygladac tak:

:0040A70C E833280100              call 0041CF44
:0040A711 83C40C                  add esp, 0000000C
:0040A714 85C0                    test eax, eax
:0040A716 90                      nop
:0040A719 B90100000               mov ecx, 00000001
:0040A71C 890D5C574200            mov dword ptr [0042575C], ecx

Zapisujemy wiec offset pierwszej linii, ktora chcemy zmienic (9D16), wylaczamy Wdasm i odpalamy Hiew, a w nim winrar95.exe (pamietaj o kopii zapasowej pliku - na wypadek, gdyby cos poszlo 'nie tak'). F4 i Decode, F5, 9D16 i znajdujemy sie w interesujacej nas linii. By zedytowac, naciskamy F3, a potem F2, by wprowadzic zmiany w bardziej czytelny sposob. Usuwamy 'sete cl', wpisujemy 'nop'
i naciskamy ENTER, przechodzac jednoczesnie do kolejnej linii. Usuwamy znow to, co sie pojawi i wpisujemy 'mov ecx,00000001'. Naciskamy ENTER - powinnismy teraz zobaczyc szukana wczesniej linie mov [0042575C], ecx. Zostawiamy ja bez zmian, naciskamy Esc. Jak widac linie 'nop' i 'mov ecx,00000001' zamienily sie miejscami. Coz, czlowiek uczy sie cale zycie ;). Teraz F9 (zapisanie zmian) i F10 (koniec).

A teraz, jezeli doczytales do konca, zmienimy tylko jeden bajt i WinRAR bedzie dzialal rownie dobrze :))). 
ROZWIAZANIE 2
Otoz w linii 'sete cl' do dolnej czesci rejestru ecx kopiowane jest 0 ('sete' to to samo co 'setz'). 'sete cl' mozna wiec w tym wypadku przetlumaczyc 'skopiuj 0 do cl'. Jezeli do tego (w nastepnej linii) dodamy (logicznie) 1, to w ecx ostatecznie otrzymamy 0 (patrz tabelka w Newbies Note!). Aby w ecx otrzymac 1, musimy wykonac wiec 1 AND 1, a nie 0 AND 1. Co wiec zrobic? Wystarczy zmienic 'sete cl' na 'setne cl' (czyli 0F94C1 na 0F95C1)!

Odpalamy WinRAR. Kewl. Zrobione :)))
----------------------------------------------------------------------

----------------
Jezeli szukasz tu jedynie seriali, to zle trafiles.
Dzialania opisane powyzej maja na celu analize kodu programu i poznanie schematu jego zabezpieczenia. Jezeli masz zamiar uzywac tego programu dluzej, kup go (nie dotyczy M$). Pozwoli to producentom udoskonalac oferowane programy, jak rowniez ich zabezpieczenia.
--------------------------------------------------------------------------------------
14-02-99 by iwan (iwy@friko.onet.pl)
