Restorator v2.5 build 757 by p10TR

Temat:
k38k2jCQqcKz5Dtl+MyrzkpXJpW9jA3tAQW0kSL8JiU+ czyli: pare uwag nt. zabezpieczen Restoratora
Program:
Restorator v2.5 build 757
Tools:
TheThingThatShouldNotBe v4.xx, Hiew v6.xx, RegMon
Uwagi:
Nie znalazlem zadnego dobrze dzialajacego cracka do tej wersji RES. A zastosowanie cracka-niedorobki, nieuwzgledniajacego czestych sprawdzan sumy kontrolnej pliku Restorator.exe, moze sie skonczyc nieprzyjemnie...

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:

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],ESI
I 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],ESI
Sledzimy 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 $+2
i 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 starcie
4C99C1 exit: 'ucina' otwierane pliki (SetFilePointer z param 600h)
4C9B28 exit: tworzy WININIT.INI, przy braku LICENCE.TXT takze
4CD491
4CE957 klikanie w panelu 'Resource Tree' oraz 'Tool Window'
4D456A kursor myszki nad przyciskiem 'Open a file': Notatnik

Jednak 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],ESI
Poprawiamy 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
p10TR
to 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             NOP
zeby 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            NOP
Po 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    4DAE16
i 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 flaga
i 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  EDX
i 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.