Jest poczatek marca i mija wlasnie rocznica ogloszenia przez Zomo konkursu na najszybsza prace na temat RES :)
P L A N: 1. WSTEP 2. FAKTY 3. OMOWIENIE METODY OPOZNIENIA - NAGSCREEN 4. OMOWIENIE METODY OPOZNIANIA - DIALOG REJESTRACYJNY 5. ELIMINACJA SPRAWDZANIA SUMY KONTROLNEJ (cz. 1) 6. ELIMINACJA SPRAWDZANIA SUMY KONTROLNEJ (cz. 2) 7. PAKOWANIE RES 8. ZMIANA NAPISU NA SPLASHU 9. ELIMINACJA NAGSCREENU 10. ODBLOKOWANIE FUNKCJI 'GrabResources' 11. ODBLOKOWANIE FUNKCJI 'ResPatcher' 12. REJESTROWANIE RES NA DOWOLNE DANE 13. ELIMINACJA WYSWIETLANIA 'RESTORATOR LICENCE AGREEMENT' 14. ODBLOKOWANIE MOZLIWOSCI ZMIANY ZASOBU 'VERSION'
1. WSTEP
RES to edytor resource'ow programow 32 bitowych. Posiada wygodny interfejs skladajacy sie z 3 paneli: Resource Tree, Resource Viever oraz File Browser. W wersji shareware ma zablokowane dwie funkcje: ResPatcher i GrabResources, a po 30 dniach przestaje sie uruchamiac. Sa 3 wyjscia z tej sytuacji:
Zaraz przed pierwszym uruchomieniem RES warto wyeksportowac rejestr windows. W razie czego bedzie go mozna odtworzyc. Poza tym po uruchomieniu RES i wyeksportowaniu rejestru powtornie, poprzez polecenie:
FC /L CZYSTY.REG BRUDNY.REG > zmiany.txt
uzyskujemy plik ze zmianami jakie w rejestrze wprowadzil RES.
2. FAKTY:
[HKLM\Software\CLASSES\CLSID\{DF53D61A-BA67-5969-039C-3E3917FF0E7F}\InprocServer32]
"1"=hex:65,b6,96,3d,7c,c1,a4,7b
za kazdym uruchomieniem tu jest zapisywany czas:
[HKLM\Software\CLASSES\CLSID\{801FA242-1CAA-4A69-35BE-7106BB608B39}\InprocServer32]
"2"=hex:8c,41,e0,3c,7c,c1,a4,7b
po 30 dniach uzywania RES tworzy:
[HKLM\Software\CLASSES\CLSID\{5AC929E8-3E46-D071-1774-4A1245410E8E}\InprocServer32]
"1"=dword:00000000
i... przestaje sie uruchamiac. na innym komputerze RES wygeneruje inne wpisy, ale bez problemu mozna je wyszukac, np. w Regedit w polu Znajdz wpisujemy "1" (bez " ") i zaznaczamy tylko Przegladaj Wartosci oraz Uwzglednij tylko cale ciagi.
[HKCU\SOFTWARE\Bomers\Restorator\Registration] "Name"="p10TR" "Password"="271828183520599250936329588014981273408239700374531835205992509363295880149812734\n" "Type"="Regular"co i tak nic nie da, bo RES przeciez sprawdza ich poprawnosc.
3. OMOWIENIE METODY OPOZNIENIA - NAGSCREEN
Poprawki opisane w tym i nastepnym punkcie nie sa potrzebne do scrackowania RES - podalem je jako ciekawostke. Przyciski 'OK' i 'Cancel' na nagscreenie sa 'grayed' i dopiero po uplywie jakiegos czasu mozna ich uzyc do wylaczenia naga. Ustawienie pulapek na podstawowych funkcjach czasowych okazuje sie nieskuteczne. Ale w importach jest podejrzana funkcja: timeGetTime (z WINMM.DLL -System APIs for Multimedia). Zwraca ona czas w [ms] jaki uplynal od uruchomienia systemu. Istotnie, po podpieciu biblioteki WINMM.DLL, ustawieniu BPX timeGetTime i uruchomieniu RES, jak zwykle pojawi sie splashscreen, ale zamiast nagscreenu 'Shareware Reminder' zatrzymujemy sie w debuggerze i po wyjsciu z funkcji jestesmy tutaj:
4B7929 E8020EFAFF CALL WINMM!timeGetTime 4B792E 898350020000 MOV [EBX+250],EAX <-- tutaj
W EAX jest czas zwrocony przez ta funkcje. Zostaje on przeslany pod adres DS:[EBX+250], na ktory zakladamy BPM DS:EBX+250 i jednoczesnie dezaktywujemy pulapke na timeGetTime. Puszczamy RES dalej. Na ulamek sekundy pojawia sie nag, ale zadzialal breakpoint:
4B81B9 E87205FAFF CALL WINMM!timeGetTime 4B81BE 2B8350020000 SUB EAX,[EBX+250] 4B81C4 3D70170000 CMP EAX,1770 <-- czy wynik < 1770 ? (6 sekund) 4B81C9 7E1A JLE 4B81E5 <-- jesli tak, to jeszcze opozniaj
Tu jest odliczany czas. Zeby przyciski naga byly od razu ENABLE to trzeba poprawic skok z adresu 4B81C9:
4B81C9: 7E00 JLE 4B81CB <-- czyli JLE $+2
4. OMOWIENIE METODY OPOZNIANIA - DIALOG REJESTRACYJNY
Rowniez oparta o funkcje timeGetTime jest procedura opozniania w dialogu rejestracyjnym. Kiedy po wpisaniu name i password wcisniemy 'OK' i potwierdzimy komunikat o blednej 'informacji rejestracyjnej', kursor myszki zamienia sie w klepsydre i... trzeba chwile poczekac. Ponowne sprobowanie wpisania Name i password spowoduje wydluzenie tej 'chwili'. Tak wiec zanim ponownie damy OK, uaktywniamy pulapke na timeGetTime, teraz dajemy OK. Zatrzymujemy sie w debuggerze i po wyjsciu z funkcji jestesmy tutaj:
4B7F82 E8A907FAFF CALL WINMM!timeGetTime 4B7F87 8BD8 MOV EBX,EAX <--tutaj 4B7F89 EB13 JMP 4B7F9E 4B7F8B 6A64 PUSH 64 4B7F8D E8D2D9F4FF CALL KERNEL32!Sleep 4B7F92 A124174E00 MOV EAX,[004E1724] 4B7F97 8B00 MOV EAX,[EAX] 4B7F99 E856ACF7FF CALL 432BF4 4B7F9E E88D07FAFF CALL WINMM!timeGetTime 4B7FA3 2BC3 SUB EAX,EBX 4B7FA5 6915A80F4E00E8030000 IMUL EDX,[4E0FA8],3E8 <-- ! 4B7FAF 3BC2 CMP EAX,EDX 4B7FB1 7CD8 JL 4B7F8B <-- bez tego skoku 4B7FB1 33C0 XOR EAX,EAX bedzie szybciej :)
Interesujaca wydaje sie byc akcja pod adresem 4B7FA5 - jest tam mnozenie przez 1000 (dziesietnie) zmiennej o adresie 4E0FA8, z wynikiem w EDX. Nastepnie iloczyn jest porownywany z roznica czasow. Wspomniana zmienna to licznik zliczajacy ile razy juz probowalismy wpisywac Name i Password. Co to oznacza w praktyce? Ze z kazda nasza proba trzeba czekac coraz dluzej. Zeby zlikwidowac te niedogodnosc trzeba unieszkodliwic skoku bezposrednio pod tym porownaniem (adres 4B7FB1):
4B7FB1 7C00 JL 4B7F81 <-- JL $+2
Teraz mozna juz bezstresowo popracowac nad generowaniem password :)
5. ELIMINACJA SPRAWDZANIA SUMY KONTROLNEJ (cz. 1) / 1 bajt /
Jezeli dokonalismy jakichs zmian w pliku Restorator.exe, to sie nie uruchomi, tylko pokaze komunikat:
Exception Exception in module RESTORATOR.EXE at 000D328F.
CRC check failed.
Please reinstall Restotator and contact florian@bome.com
Jak z niego wynika, wystarczy teraz wyslac maila do Florka, a on nam powie, w ktorym miejscu RES dal procke sprawdzajaca sume kontrolna. Przewaznie przysyla jeszcze dodatkowo kod zrodlowy RES ;-)
No, ale jakby nie przyslal, to trzeba odnalezc miejsce sprawdzania sumy kontrolnej. Zakladamy wiec: BPX CreateFileA do "d esp->4;p ret" i uruchamiamy RES. Teraz pare razy F5 az w oknie danych pojawi sie: 'c:\twoj_folder\restorator.exe', a modul bedzie RES, czyli na dolnej listwie okna kodu bedzie RESTORATOR!CODE+000790B7:
47A0B7 E820B6F8FF CALL KERNEL32!CreateFileA 47A0BC 8BF0 MOV ESI,EAX <-- tutaj 47A0BE 897308 MOV [EBX+08],ESII dalej az do:
4D3265 E832CFFAFF CALL 48019C <-- tu jest liczona suma kontrolna 4D326A 84C0 TEST AL,AL <-- AL = 0 znaczy: CRC error :( 4D326C 7521 JNZ 4D328F r fl z :)Wnetrze CALL'a z adresu cs:4D3265:
...... 4801CD 8BC6 MOV EAX,ESI 4801CF E878FFFFFF CALL 48014C 4801D4 3B03 CMP EAX,[EBX] <-- porowanie sum kontrolnych 4801D6 7405 JZ 4801DD <-- :=) 4801D8 33C0 XOR EAX,EAX 4801DA 5E POP ESI 4801DB 5B POP EBX 4801DC C3 RET 4801DD B001 MOV AL,1 4801DF 5E POP ESI 4801E0 5B POP EBX 4801E1 C3 RET
Widac, ze na wyjsciu z tej procki AL musi byc rowne 1. Zmieniamy w pliku Restorator.exe co trzeba i na probe, czy juz mozna go patchowac, aplikujemy poprawki z pkt. 3 i 4 likwidujace opoznienia (jak juz wspomnialem, nie sa one konieczne do scrackowania RES). Odpalamy RES - dziala. Jednak po chwili, np. po kilkukrotnym przejechaniu kursorem myszki nad przyciskiem 'Open file', uruchamia sie Notatnik, a w nim otwarty plik 'Register.txt'. Wynika z powyzszego, ze to jeszcze nie koniec.
6. ELIMINACJA SPRAWDZANIA SUMY KONTROLNEJ (cz. 2) / 3 bajty /
Po 'pozornym' scrackowaniu RES, co jakis czas:
Te pierwsze, to czeste uruchamianie przez RES Notatnika z wczytanym plikiem Register.txt ('How to register Restorator...'). Przykladem tych drugich, jest np. tworzenie w katalogu C:\WINDOWS pliku WININIT.INI o takiej zawartosci, ktora po ponownym starcie systemu spowoduje usuniecie wszystkich plikow z katalogu RES. Dlatego na czas crackowania RES dobrze jest miec pierwsza linijke w AUTOEXEC.BAT:
IF EXIST C:\WINDOWS\WININIT.INI DEL C:\WINDOWS\WININIT.INI
Ponadto RES w takim 'zle-scrackowanym' stanie robi jeszcze inne niebezpieczne rzeczy. M. in. przycina otwierane w nim pliki do dlugosci 1536 bajtow, tym samym niszczac je. Usuwa takze z rejestru galaz HKEY_CLASSES_ROOT, czyli informacje OLE oraz, co najwazniejsze, wszystkie skojarzenia typow plikow i skroty. Z tym, ze robi to w nieregularnych odcinkach czasu i 'cichaczem', nie komunikujac tego. Powyzsze fakty swiadcza o tym, ze RES sprawdza sume kontrolna w wielu innych miejscach i robi to czesto. Trzeba wiec wyeliminowac wszystkie te sprawdzania. Sa co najmniej dwa podejscia do tego problemu:
To drugie podejscie jest bardziej uniwersalne, bowiem pozwala wyszukanie prawie wszystkich miejsc (a nie tylko jednego) sprawdzania sumy kontrolnej. Poza tym szybciej mozna stwierdzic od czego zalezy niepozadane zachowanie RES. Zakladamy wiec: BPX CreateFileA do "d esp->4; p ret" i np. najezdzamy kursorem myszki pare razy nad przyciskiem 'Open a file'. W pewnym momencie, zamiast pojawienia sie Notatnika z tekstem 'How to register', zatrzymujemy sie w znajomym nam z poprzedniego punktu miejscu:
47A0B7 E820B6F8FF CALL KERNEL32!CreateFileA <-- odczyt 47A0BC 8BF0 MOV ESI,EAX <-- tutaj 47A0BE 897308 MOV [EBX+08],ESISledzimy dalej RES az do:
4D454C 8B45F8 MOV EAX,[EBP-8] 4D454F E890BCFAFF CALL 4801E4 <-- wyliczenie rzeczywistej 4D4554 8BD8 MOV EBX,EAX sumy kontrolnej (do EAX) 4D4556 8B45F8 MOV EAX,[EBP-8] 4D4559 E8EE5AFAFF CALL 47A04C <-- pobranie 'dobrej' sumy 4D455E 8B4018 MOV EAX,[EAX+18] 4D4561 0FB75008 MOVZX EDX,WORD PTR [EAX+8] 4D4565 8BCB MOV ECX,EBX 4D4567 C1E910 SHR ECX,10 4D456A 3BD1 CMP EDX,ECX <-- porownanie! 4D456C 750E JNZ 4D457C jezeli EDX != ECX to skok 4D456E 0FB7400A MOVZX EAX,WORD PTR [EAX+A] 4D4572 81E3FFFF0000 AND EBX,FFFF 4D4578 3BC3 CMP EAX,EBX <-- druga czesc porownania 4D457A 7451 JZ 4D45CD 4D457C 6A05 PUSH 05 4D457E 6A00 PUSH 00 4D4580 6A00 PUSH 00 ...... 4D45C7 50 PUSH EAX 4D45C8 E86BF6F5FF CALL SHELL32!ShellExecuteA <-- uruchomienie 4D45CD 33C0 XOR EAX,EAX Notatnika 4D45CF 5A POP EDX
Po analizie CALL-a z adresu 4D4559 mozna stwierdzic, ze RES pobiera 'dobra' (tzn. wynoszaca 6437C38B) sume kontrolna z sekcji .rsrc pliku Restorator.exe. Zrzut tego miejsca (z Hiewa):
.00536000: 00 00 00 00-89 A5 04 27-37 64 8B C3-02 00 08 00^^^^^ ^^^^^
I tu wlasnie wpiszemy poprawiona sume kontrolna. Tak zrobilem w cracku docelowym. A tym czasem:
Pod adresami 4D456A i 4D4578 jest para porownan bardziej i mniej znaczacego slowa sumy kontrolnej. W razie wykrycia zmian w execu (zla suma kontrolna) RES wykona skok z adresu 4D456C, uruchomi Notatnik i nic wiecej. Trzeba wiec 'przedluzyc' ten skok az do adresu 4D45CD:
4D456C EB5F JMP 4D45CD
Jesli suma sie zgadza, to drugi skok jest wlasnie pod 4D45CD. OK, na razie RES nie uruchamia Notatnika, ale to jeszcze nie wszystko: przy aktywnej BPX CreateFileA do "d ESP->4; pret" i otwartym jakims execu np. Calc.exe, klikamy pare razy w obrebie panelu RESOURCE TREE Po ktoryms razie zatrzymamy sie w momencie odczytu pliku Restorator.exe, wychodzimy z funkcji i co widac pare linii nizej? Znajome porownanie, ale w zupelnie innym miejscu programu:
4CE94E 0FB75008 MOVZX EDX,WORD PTR [EAX+08] 4CE952 8BCB MOV ECX,EBX 4CE954 C1E910 SHR ECX,10 4CE957 3BD1 CMP EDX,ECX <-- porownanie! 4CE959 7512 JNZ 4CE96D 4CE95B 0FB7400A MOVZX EAX,WORD PTR [EAX+0A] 4CE95F 81E3FFFF0000 AND EBX,FFFF 4CE965 3BC3 CMP EAX,EBX <-- druga czesc porownania 4CE967 0F840A010000 JZ 4CEA77 4CE96D 8B45FC MOV EAX,[EBP-04] 4CE970 8B80F4010000 MOV EAX,[EAX+1F4] 4CE976 E881B2F5FF CALL 429BFC
Tym razem zasieg 2-bajtowego skoku nie wystarczy; trzeba zmienic najpierw skok z adresu 4CE959 na:
4CE959 7500 JNZ 4CE95B <-- JNZ $+2i zamienic nastepny skok na bezwzgledny:
4CE967 E90B010000 JMP 4CEA77
Warto teraz przeszukac plik Restorator.exe na okolicznosc wystepowania sygnatury tej procki. Dlaczego? Poniewaz tych sprawdzen moze byc wiele i trudno byloby wykryc wszystkie z nich; niektore nie uaktywniaja sie od razu... W HIEW mozemy szukac ciagu bajtow lub instrukcji asm. Szukamy:
'SHR ECX,10; CMP EDX,ECX' czyli: C1 E9 10 3B D1
Okazuje sie, ze procka sprawdzajaca sume kontrolna wystepuje 6 razy. Dwie przed chwila juz poprawilismy, pozostale - analogicznie.
Miejsca wystepowania sygnatury "CMP EDX,ECX", wraz z opisem kiedy jest dokonywane sprawdzenie oraz opis akcji, jaka ma miejsce w razie wykrycia przez RES zlej sumy kontrolnej:
4C93BB przy starcieJednak zeby zapatchowac skoki wszystkiech 6 procek trzebaby zmienic 2+4+4+4+4+2 = 20 bajtow. To duzo, ale jest inne wyjscie: za kazdym razem przed porownaniem sumy kontrolnej wywolywana jest procka, ktora ja wylicza. Zmienimy ja tak, zeby zawsze zwracala prawidlowy wynik. To jest interesujacy nas fragment:
48023C 0BF2 OR ESI,EDX ; 48023E 8B0C24 MOV ECX,[ESP] ; 480241 3331 XOR ESI,[ECX] ; 480243 83042404 ADD DWORD PTR [ESP],4 ; liczenie sumy kontrolnej 480247 42 INC EDX ; 480248 48 DEC EAX ; 480249 75F1 JNZ 48023C ; 48024B 897330 MOV [EBX+30],ESIPoprawiamy ja tak:
480243 90 NOP 480244 0424 ADD AL,24 480246 BE8BC33764 MOV ESI,6437C38B <-- prawidlowa suma kontrolna
Przy tym podejsciu zmienic trzeba tylko 6, a nie 20 bajtow. Ale ostatecznie, jak juz wczesniej wspomnialem, patchujemy sume kontrolna zapisana bezposrednio w pliku Restorat.exe w ostatniej sekcji (.rsrc). Wtedy zamiast 20 poprawek (skokow) mamy 3 ! Warto bylo bardziej wniknac w kod :)
7. PAKOWANIE RES / 1 bajt /
Uwaga! Po spakowaniu np. UPX-em, mimo powyzszych poprawek, RES znowu zacznie zachowywyac sie tak, jakby byl potraktowany niedorobionym crackiem. Dlaczego? Po analizie procedury liczacej sume kontrolna mozna sie przekonac, ze na jej poczatku jest sprawdzanych pare rzeczy zwiazanych ze struktura pliku Restorator.exe, m. in. czy istnieje sekcja, w ktorej characteristics jest flaga Code (20). A UPX zmienia na E0000080, wiec sie nie zgadza i nastepuje skok na sam koniec tej procki, z pominieciem naszych poprawek opisanych w punkcie 6. Na wyjsciu jest wtedy bledna suma kontrolna. To jest ten moment:
4801FA E8BDFEFFFF CALL 4800BC <-- spr. sekcji i characteristics 4801FF 84C0 TEST AL,AL 480201 744F JE 480252 <-- zmien 744F na 7443
Uwzgledniajac powyzsze, nalezy nieco 'skrocic' skok z adresu 480201 do linii 480264. Teraz mozna bezpiecznie spakowac Restorator.exe. Warto to zrobic - po spakowaniu z 1,2 MB zostaje 500 kB. Drugiego pliku, tzn. Restorator.dll, nie wolno pakowac - RES nie bedzie dzialal.
8. ZMIANA NAPISU NA SPLASHU / 6+7 bajtow /
Jezeli chcemy zeby RES podawal na splashu i about np.:
Registered to p10TRto mamy 2 wyjscia:
Na splashu pojawia sie info o rejestracji oraz jeden z 45, losowo wybrany, niezbyt madry tekst, np. 'Play with it, not with you'. Teksty te sa w pliku Restorat.exe pod offsetem C5B60. Odpalamy RES z breakpointem:
BPX RegOpenKeyExA if *(esp->8+1B)=='Regi' do "d ESP->8;p ret"i zatrzymujemy sie:
45BD47 E85099FAFF CALL ADVAPI32!RegOpenKeyExA 45BD4C 85C0 TEST EAX,EAX <-- tutaj
Wewnatrz tej procki jest po drodze jeszcze jedno wywolanie RegOpenKeyExA - nieistotne. Wychodzimy z niej:
4C6DDC E8EB4EF9FF CALL 45BCCC 4C6DE1 84C0 TEST AL,AL <-- tutaj 4C6DE3 7422 JZ 4C6E07 AL=0 znaczy: brak wpisu ...... czyli: Unregistered 4C6E07 33C0 XOR EAX,EAX 4C6E09 EB02 JMP 4C6E0D 4C6E0B B001 MOV AL,01 4C6E0D 8845FB MOV [EBP-05],AL <-- wyzerowanie flagi 4C6E10 807DFB00 CMP BYTE PTR [EBP-05],00 4C6E14 7410 JZ 4C6E26 <-- skok ...... 4C6E43 8B45FC MOV EAX,[EBP-04] 4C6E46 80B8F801000000 CMP BYTE PTR [EAX+1F8],0 <--splash czy about? 4C6E4D 7468 JZ 4C6EB7 0 znaczy: splash ...... 1 -"- : about 4C6EA8 8B45FC MOV EAX,[EBP-04] 4C6EAB C680E801000000 MOV BYTE PTR [EAX+1E8],0 <-- flaga 'znikania' 4C6EB2 E9AE000000 JMP 4C6F65 <-- !!! 4C6EB7 E870BAF3FF CALL 40292C 4C6EBC 807DFB00 CMP BYTE PTR [EBP-05],0 4C6EC0 7454 JZ 4C6F16 <-- !!! 4C6EC2 8D4DC0 LEA ECX,[EBP-40] 4C6EC5 B8FC134E00 MOV EAX,4E13FC 4C6ECA BA0D000000 MOV EDX,0D 4C6ECF E818FEFFFF CALL 4C6CEC <-- odxorowanie napisu 4C6ED4 FF75C0 PUSH DWORD PTR [EBP-40] 'Registered to' 4C6ED7 FF75F4 PUSH DWORD PTR [EBP-0C] 4C6EDA 6898714C00 PUSH 4C7198 4C6EDF E878BCF3FF CALL 402B5C 4C6EE4 D80DA0714C00 FMUL REAL4 PTR [4C71A0] 4C6EEA E8A9BAF3FF CALL 402998 <-- EAX = rand(0,44) 4C6EEF FF348530134E00 PUSH DWORD PTR [EAX*4+4E1330] <-- wybor 4C6EF6 8D45E4 LEA EAX,[EBP-1C] 4C6EF9 BA04000000 MOV EDX,4 4C6EFE E85DCEF3FF CALL 403D60 4C6F03 8B55E4 MOV EDX,[EBP-1C] 4C6F06 8B45FC MOV EAX,[EBP-04] 4C6F09 8B80EC010000 MOV EAX,[EAX+1EC] 4C6F0F E884B2F5FF CALL 422198 4C6F14 EB4F JMP 4C6F65
Pod adresem 4C6E46 jest sprawdzenie flagi [EAX+1F8], ktora wskazuje, czy wyswietlony ma byc splash, czy okienkio 'about'. Roznice miedzy nimi sa dwie:
Przy uruchomionym RES flaga [EAX+1F8] = 1, wiec jesli w uruchomionym RES wybierzemy z menu opcje 'About', to wtedy NIE nastapi skok z adresu 4C6E4D i program wykona sie nez przeszkod, az do skoku o adresie 4C6EB2; po drodze, pod adresem 4C6EAB, nastapilo wyzerowanie innej flagi - [EAX+1E8], ktora dla splasha = 1 (a dla 'About' = 0). Okresla ona, czy okienko ma zniknac po paru sekundach, czy dopiero po kliknienciu na nim myszka.
Wrocmy do skoku z adresu adresu 4C6EB2. Zeby na 'About' nie bylo napisu 'Unregistered' to trzeba zlikwidowac ten skok, a poniewaz 5 NOP-ow nie wyglada zbyt elegancko, to proponuje poprawic go na JMP $+5:
4C6EB2 E900000000 JMP 4C6EB7 <-- zmiana 1 bajtu
Dwie instrukcje nizej, pod adresem 4C6EBC, jest porownanie flagi okreslajacej czy w rejestrze sa wpisy rejestracyjne. Tutaj tez wystarczy jednobajtowa poprawka skoku (na skok do nast. instukcji):
4C6EC0 7400 JZ 4C6EC2 <-- zmiana 1 bajtu
Po przejsciu CALLa z adresu 4C6EEA, w EAX jest liczba losowa z zakresu <0, 44> i przy jej uzyciu, instrukcja PUSH DWORD PTR [EAX*4+004E1330], odkladany jest na stos adres (jednego z 45) napisu, ktory bedzie wyswietlony na splashu czy na 'About'. Teraz trzeba w miejsce pierwszego napisu w pliku Restorat.exe:
'It's always nice to have good friends.'
wpisac 'p10TR' i zakonczyc ten string bajtem 00h oraz uaktualnic wartosc polozona kilka bajtow przed napisem, okreslajaca ilosc znakow w stringu (w tym przypadku, z 23h na 05h). No i poprawic instrukcje PUSH:
4C6EEF FF3530134E00 PUSH DWORD PTR [4E1330] 4C6EF5 90 NOPzeby zawsze byl 'losowany' pierwszy napis.
Jest to szybsze rozwiazanie - nie trzeba wpisywac danych rejestracyjnych podczas pierwszego odpalania RES na innym komputerze. Warto zwrocic uwage, ze RES jest wtedy uniezalezniony od wpisow do rejestru dotyczacych rejestracyjnych. Jest to moze mniej eleganckie rozwiazanie, niz poprawienie procki sprawdzajacej seriala (co i tak zrobimy - w punkcie 11), ale szybsze
9. ELIMINACJA NAGSCREENU / 3 bajty /
Odpalamy RES z takim samym jak w poprzednim puncie breakpointem. Po pojawieniu sie splasha, ale przed nadscreenem zatrzymujemy sie:
48EB0D 8B55C4 MOV EDX,[EBP-3C] ;\Software\Bomers\Restorator\... 48EB10 33C9 XOR ECX,ECX ;...\Registration 48EB12 8B45C8 MOV EAX,[EBP-38] 48EB15 E8B2D1FCFF CALL 45BCCC <-- wewnatrz jest RegQueryValueExA 48EB1A 84C0 TEST AL,AL <-- AL = 0 znaczy: brak wpisu 48EB1C 7463 JZ 48EB81 <-- i skok
Analogicznie jest sprawdzanie istnienia wpisow: Name, Password, Type. Jezeli zasymulujemy istnienie tych wpisow (r fl z), to dojdziemy do procedury sprawdzania seriala. Jednak ta metoda nie jest optymalna - wymagalaby niepotrzebnie duzo poprawek w pliku. A zawsze nalezy dazyc do patchowania jak najbardziej optymalnego, czyli zasada: jak najmniej zmian. Wrocmy do adresu 48EB1C - normalnie, przy niezarejestrowanym RES (brak wpisow) program wykona ten skok, czyli:
48EB81 33C0 XOR EAX,EAX 48EB83 EB02 JMP 48EB87 48EB85 B001 MOV AL,1 48EB87 8845CF MOV [EBP-31],AL <-- wyzerowanie flagi 48EB8A 807DCF00 CMP BYTE PTR [EBP-31],0 48EB8E 0F84C4000000 JE 48EC58 <-- skok ...... 48EC58 33C0 XOR EAX,EAX ...... 48EC75 807DCF00 CMP BYTE PTR [EBP-31],0 <-- kolejne spr. 48EC79 0F844C010000 JZ 48EDCB <-- i skok ...... 48EDCB 8A55CF MOV DL,[EBP-31] <-- b. wazne miejsce! 48EDCE 8B45E8 MOV EAX,[EBP-18] 48EDD1 E826FCFFFF CALL 48E9FC 48EDD6 8B45E8 MOV EAX,[EBP-18] 48EDD9 80785400 CMP BYTE PTR [EAX+54],0 48EDDD 750A JNZ 48EDE9
Pod adresem 48EDCB jest bardzo wazne przeslanie do DL. Dla RES niezarejestrowanego DL = 0. Sprawdzmy co sie stanie jak przed CALL z adresu 48EDD1 damy DL = 1. Puszczamy RES dalej. I co? Pozbylismy sie nagscreenu. Trzeba zrobic tak, zeby DL przed tym CALL mial wartosc 1. Sa 3 bajty wolnego miejsca, wiec mozna zrobic to tak:
48EDCB B201 MOV DL,1 48EDCD 90 NOPPo poprawieniu execa - nagscreen nie pojawi sie.
10. ODBLOKOWANIE FUNKCJI 'GrabResources' / 1 bajt /
Stawiamy BPX taki jak w poprzednim puncie, z menu wybieramy 'Grab Resources' i kilkamy na przycisku 'Grab'. Po drugim wywolaniu funkcji wychodzimy z niej i dochodzimy:
4DAB35 84C0 TEST AL,AL <-- tutaj 4DAB37 7463 JZ 4DAB9C <-- AL = 0 ...... 4DAB9C 33C0 XOR EAX,EAX 4DAB9E EB02 JMP 4DABA2 <-- skok 4DABA0 B001 MOV AL,1 4DABA2 8845CD MOV [EBP-33],AL <-- teraz flaga = 0 4DABA5 807DCD00 CMP BYTE PTR [EBP-33],0 4DABA9 0F84C4000000 JZ 4DAC73 ...... 4DADE6 807DCD00 CMP BYTE PTR [EBP-33],0 <-- porownanie 4DADEA 752A JNZ 4DAE16
Jak widac procka jest prawie identycza jak ta z poprzedniego punktu. Zmienila sie tylko flaga: poprzednio [EBP-31] a tym razem jest [EBP-33]. I tak samo, jezeli w rejestrze nie ma odpowiednich wpisow, tzn. galezi: 'Software\Bomers\Restorator\Registration', to flaga = 0 Kluczowym porownaniem jest tutaj to z adresu 4DADE6. Trzeba poprawic nastepujacy po nim skok na bezwarunkowy:
4DADEA EB2A JMP 4DAE16i juz mozna grabic ;)
11. ODBLOKOWANIE FUNKCJI 'ResPatcher' / 2 bajty /
Stawiamy pulapke taka jak w poprzednim punkcie i wybieramy opcje 'ResPatcher'. Jak widac zmienila sie tylko flaga, tym razem na [EBP-47]:
4C2926 84C0 TEST AL,AL <-- tutaj 4C2928 7475 JZ 4C299F <-- AL = 0 ...... 4C299F 33C0 XOR EAX,EAX 4C29A1 EB02 JMP 4C29A5 4C29A3 B001 MOV AL,1 4C29A5 8845B9 MOV [EBP-47],AL 4C29A8 807DB900 CMP BYTE PTR [EBP-47],0 4C29AC 0F84E2000000 JZ 4C2A94 ...... 4C2A94 33C0 XOR EAX,EAX 4C2A96 5A POP EDX 4C2A97 59 POP ECX 4C2A98 59 POP ECX 4C2A99 648910 MOV FS:[EAX],EDX 4C2A9C 68B12A4C00 PUSH 4C2AB1 4C2AA1 8B45B4 MOV EAX,[EBP-4C] 4C2AA4 E8CF03F4FF CALL 402E78 4C2AA9 C3 RET 4C2AAA E99509F4FF JMP 403444 4C2AAF EBF0 JMP 4C2AA1 4C2AB1 807DB900 CMP BYTE PTR [EBP-47],0 4C2AB5 0F8463010000 JZ 4C2C1E ...... 4C2C1E 807DB900 CMP BYTE PTR [EBP-47],0 <-- [EBP-47] musi=1 4C2C22 752C JNZ 4C2C50 ...... 4C3071 8A5DB9 MOV BL,[EBP-47] <-- tu juz jest BL = 1 4C3074 80F301 XOR BL,01 <-- BL = 0 4C3077 84DB TEST BL,BL 4C3079 742C JZ 4C30A7 <-- skok
Pod adresem 4C2C1E patchujemy na OR BYTE PTR [EBP-47],1 poniewaz pozniej jest jeszcze jedno porownanie tej flagi.
12. REJESTROWANIE RES NA DOWOLNE DANE / 2 bajty /
Ta poprawka nie jest potrzebna. Dalem ja jako ciekawostke. W niescrackowanym RES wybieramy opcje Register, wpisujemy dowolne dane, stawiamy BPX hmemcpy, dajemy OK i po chwili:
4B7D1A E849A4F6FF CALL 422168 4B7D1F 55 PUSH EBP <-- jestesmy tuaj 4B7D20 E863FFFFFF CALL 4B7C88 4B7D25 59 POP ECX 4B7D26 8B45E4 MOV EAX,[EBP-1C] 4B7D29 E872BFF4FF CALL 403CA0 4B7D2E 83F850 CMP EAX,50 <-- czy password > 80 znakow 4B7D31 0F8E0C020000 JLE 4B7F43 <-- r fl s ...... 4B7D69 E816FEFFFF CALL 4B7B84 <-- rodzaj licencji: 'Student' 4B7D6E 59 POP ECX 4B7D6F 84C0 TEST AL,AL 4B7D71 7414 JZ 4B7D87 4B7D73 8D4DE0 LEA ECX,[EBP-20] 4B7D76 B818104E00 MOV EAX,4E1018 4B7D7B BA06000000 MOV EDX,6 4B7D80 E8B3FBFFFF CALL 4B7938 4B7D85 EB2C JMP 4B7DB3 4B7D87 55 PUSH EBP 4B7D88 B838804B00 MOV EAX,4B8038 4B7D8D E8F2FDFFFF CALL 4B7B84 <-- rodzaj licencji: 'Regular' 4B7D92 59 POP ECX 4B7D93 84C0 TEST AL,AL 4B7D95 7414 JZ 4B7DAB 4B7D97 8D4DE0 LEA ECX,[EBP-20] 4B7D9A B820104E00 MOV EAX,4E1020 4B7D9F BA06000000 MOV EDX,6 4B7DA4 E88FFBFFFF CALL 4B7938 4B7DA9 EB08 JMP 4B7DB3 4B7DAB 8D45E0 LEA EAX,[EBP-20] 4B7DAE E871BCF4FF CALL 403A24 4B7DB3 837DE000 CMP DWORD PTR [EBP-20],0 <-- wazne porownanie! 4B7DB7 0F8463010000 JZ 4B7F20 <-- poprawka na skok 4B7DBD B201 MOV DL,01 do nast. instrukcji 4B7DBF A180B94500 MOV EAX,[45B980] 4B7DC4 E8133DFAFF CALL 45BADC ...... 4B7EFC 8D4DD8 LEA ECX,[EBP-28] 4B7EFF B8F00F4E00 MOV EAX,4E0FF0 4B7F04 BA25000000 MOV EDX,25 4B7F09 E82AFAFFFF CALL 4B7938 <-- odxorowanie z FF i wys- 4B7F0E 8B45D8 MOV EAX,[EBP-28] wietlenie napisu 'Thank 4B7F11 E80AA1F8FF CALL 442020 <-- you ...'
13. ELIMINACJA WYSWIETLANIA 'RESTORATOR LICENCE AGREEMENT' / 1 bajt /
Podczas *pierwszej* instalacji/uruchomieniu, RES, w okienku 'Restorator licence agreement', pyta nas o zgode na warunki licencji. Poniewaz i tak przewaznie mysle o wszelkich licencjach: "Yes, I agree to the licence" :-), wiec kolejne usprawnienie RES polega wlasnie na ominieciu wyswietlania tego okienka. Dodam, ze jest ono wyswietlane w razie braku wpisow w rejestrze dotyczacych RES, tzn. galezi: [HKCU\Software\Bomers] lub jesli klucz: [HKCU\Software\Bomers\Restorator\Restorator\Current] FirstTime "?" ktory okresla, czy zgodzilismy sie na warunki licencji, ma wartosc "1"
Stawiamy wiec pulapke na: RegQueryValueExA if *(esp->8)=='Firs' do "d esp=>8;pret" i po chwili jestesmy tutaj:
4CFA93 E804D5F8FF CALL 45CF9C 4CFA98 8B55FC MOV EDX,[EBP-04] jesli pierwszy raz, to 4CFA9B 888214040000 MOV [EDX+414],AL <-- ustawiana jest ta flagai w chwile pozniej:
4C8FAE 80B81404000000 CMP BYTE PTR [EAX+414],0 <-- spr. flagi 4C8FB5 7449 JZ 4C9000 4C8FB7 A144164E00 MOV EAX,[4E1644] 4C8FBC 8B00 MOV EAX,[EAX] 4C8FBE 80786400 CMP BYTE PTR [EAX+64],0 4C8FC2 753C JNZ 4C9000 4C8FC4 8B4DFC MOV ECX,[EBP-04] 4C8FC7 B201 MOV DL,01 4C8FC9 A11C834B00 MOV EAX,[4B831C] 4C8FCE E81949F6FF CALL 42D8EC 4C8FD3 E80CF5FEFF CALL 4B84E4 <-- okienko 'Licence agreement' 4C8FD8 83F807 CMP EAX,7 <-- czy wybrano 'No, I do not agree 4C8FDB 7523 JNZ 4C9000 <-- jesli tak, ... to exit 4C9000 A144164E00 MOV EAX,[4E1644] 4C9005 8B00 MOV EAX,[EAX] 4C9007 80785400 CMP BYTE PTR [EAX+54],0 <-- 0 = nagscreen! 4C900B 755D JNZ 4C906A
Pod adresem 4C8FAE jest sprawdzana flaga okreslajaca, czy RES jest uruchomiony po raz pierwszy na danym komputerze. Jesli jest rowna 1, to wtedy zostanie wyswietlone okienko z tekstem licencji. Poprawienie skoku pod adresem 4C8FB5 na bezwarunkowy sprawi, ze nawet podczas pierwszego uruchomienia RES nie wyswietli tego okienka. Tak przy okazji bedzie mozna usunac plik LICENCE.TXT - RES juz nie bedzie sprawdzal jego obecnosci. Jak juz wspomnialem, do prawidlowej pracy RES niezbedne sa tylko 2 pliki: Restorator.exe i Restorator.dll. Reszte, tzn. katalog HELP oraz plik RestoratorContextMenu.dll program sam sobie odtwarza z pliku Restorator.dll. Mozna sie o tym przekonac przegladajac jego resources w... RES. :)
14. ODBLOKOWANIE MOZLIWOSCI ZMIANY ZASOBU 'VERSION' / 1 bajt /
Autor RES zablokowal mozliwosc podmiany resource'a typu VERSION. Tlumaczy to wzgledami praw autorskich. Hmmm... Klikamy na zasobie VERSION jakiegos pliku, z menu kontekstowego wybieramy: Extract as "1.raw".
Stawiamy BPX CreateFileA do "d esp->4; pret" po czym, z panelu File Browser, przeciagamy przed chwila utworzony plik '1.raw' z powrotem, na zasob VERSION. Po chwili sledztwa:
47EC2C 8B4DF8 MOV ECX,[EBP-08] 47EC2F 8B55F4 MOV EDX,[EBP-0C] 47EC32 8BC3 MOV EAX,EBX 47EC34 8B18 MOV EBX,[EAX] 47EC36 FF5318 CALL [EBX+18] <-- !
Przy 'przejsciu' (F10) tego calla, pojawia sie okienko z komunikatem 'Changing version resources is not allowed.' Jeszcze raz wykonujemy wiec ww. czynnosci i jedziemy jeszcze raz, ale tym razem wchodzimy do tego calla i wewnatrz ktoregos z kolejnych mamy:
47E963 8BD3 MOV EDX,EBX 47E965 8B45FC MOV EAX,[EBP-04] 47E968 E84BFEFFFF CALL 0047E7B8 <-- cieplo, cieplo... 47E96D 33C0 XOR EAX,EAX 47E96F 5A POP EDXi to jest to:
480B3E E869BFFFFF CALL 47CAAC 480B43 83F810 CMP EAX,10 <-- spr. rodzaju resource'a 480B46 7521 JNZ 480B69 <-- skok jesli nie 'VERSION' 480B48 8D55FC LEA EDX,[EBP-04] 480B4B B8100B4800 MOV EAX,480B10 480B50 E8D73FF8FF CALL 404B2C 480B55 8B4DFC MOV ECX,[EBP-04] 480B58 B201 MOV DL,1 480B5A A184624000 MOV EAX,[406284] 480B5F E8E88FF8FF CALL 409B4C 480B64 E81329F8FF CALL 40347C <-- komunikat: 'Changing version 480B69 8BD6 MOV EDX,ESI resources is not allowed.'
Zmiana skoku pod adresem 480B46 na bezwarunkowy umozliwia zamiane zasobu 'VERSION'(wlasnie poprzez drag'n'drop). Trzeba tylko pamietac, aby wczesniej eksportowac go w formacie RAW.
cdn.