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 - góra).
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)