LEKCJA6(4).TXT

(19 KB) Pobierz
Lekcja VI - "Patchowanie programu"

   a) debugowanie programu, i znajdowanie bajtow do spatchowania
   b) rodzaje hexedytorow
   c) techniki patchowania
   d) loadery
    - zastosowanie
    - opis techniczny
    - plusy i minusy

=========WSTEP===========
Hi all students... dzis uczymy sie roznych sposobow patchowania... kiedy nalezy a kiedy nie powinno sie patchowac. Nauczymy sie jeszcze odpowiednio poslugiwac narzedziami ktore nam posluza do spatchowania pliku dolaczonego do tej lekcji (patchme.exe). Pozwolimy sobie opisac narzedzie zwane loaderem i do czego ono sluzy, w jaki sposob go uzywac i takie tam duperele. Ponadto usuniemy naga i przerobimy dosyc fajne patchme.. no wiec nie przeciagam tylko zapraszam do czytania ;))

=========NARZEDZIA===========
W32DASM - wybralem go bo jest prosty w obsludze i nie potrzeba do niego wiekszych wprowadzen.
SOFTICE - n/c
HEX Workshop lub HIEW - najlepsze hexedytory na rynku ;))

=========ZACZYNAMY===========
Uruchom patchme ktory powinien byc dolaczony do tej lekcji. I juz na wstepie widzimy okropnego naga ktorego zreszta mamy sie pozbyc... hie ;)) ql.. pozbedziemy sie okienka ;))... no ale dobra w jaki sposob mamy to niby zrobic... no wiec juz mowie..

Mozemy go usunac na dwa (trzy) sposoby, a mianowicie:
- mozemy zalozyc pulapke na api wywolujacym okienko naga a nastepnie je zanopowac pod hexedytorem,
- mozemy zapuscic disassemblera i znalezc miejsce wywolania okienka a nastepnie zanopowac je pod hexedytorem,
- mozemy zrobic co tylko nam wyobraznia przyniesie byle okienko zniknelo np. wstawic jmp przed wywolaniem api skaczace za wywolanie api i wogole co tylko nasza madra glowka nam przyniesie i co jest tylko logiczne... powinno zadzialac ;))

My usuniemy naga za pomoca softice + hex edytor... jak kogos interesuje w jaki sposob go usunac za pomoca W32Dasm to odsylam do lekcji 3 jak rowniez kilka wskazowek znajdziesz na samym koncu tej lekcji.... ;))

===========USUWANIE NAGSCREENA===============
Najpierw musimy pozbyc sie tego naga.. ale zeby to zrobic musimy wiedziec na co to zlapac. Otoz musisz wiedziec ze najczesciej uzywana funkcja przy nagscreenach jest:

DialogBoxParam
DialogBoxParamA

i na nia wlasnie lapie sie nasz patchme. Wiec zarzuc pulapke na:

DialogBoxParamA

czyli:

bpx DialogBoxParamA

i uruchom patchme (jesli miales uruchomione patchme to zamknij je i uruchom przy zalozonej pulapce), si powinien przerwac dwukrotnie (z kazdego wywolania wychodz przy pomocy F11.. NIE uzywaj ctrl-d)... i wyszedles z si po czym ujrzales naga.. no wiec kliknij:

Try...

przy nadal zalozonej pulapce... no i si pieknie ci przerwal.. i wyladowales w takim miejscu:

015F:00401103  FF3590324000        PUSH      DWORD PTR [00403290]
015F:00401109  E85A010000          CALL      USER32!DialogBoxParamA <-- wrog nr 1 [XXX]
015F:0040110E  6872324000          PUSH      00403272 <<--tu wyladowales ;))

zastawiamy pulapke na adresie wywolania naszego api czyli:

bpx 00401109

i enter.. po czym puszczasz si i wychodzisz z patchme.. po czym uruchom patchme jeszcze raz i gdy zatrzyma sie na wywolaniu naszej funkcji (wywolanie bedzie podswietlone) to jest juz ql.... a zatrzymal nam sie wiec jest ql ;)) no to wszystko nam sie wyjasnia... musimy poprostu wywalic (zanopowac, czyli zastapic instrukcjami "nop") wywolanie naszej ukochanej funkcji... a robimy to tak:

a [adres_od_ktorego_bedziemy_zmieniac]

czyli:

a 00401109

i enter... po czym klepiemy tyle nop'ow ile bajtow ma wywolanie funkcji co idzie latwo policzyc:

E8 5A 01 00 00

to sa opcody wywolania tej funkcji... ktore tak ladnie rozdzielilem ze widac ze jest ich 5 bajtow.. mozesz zapytac... ze jesli piec bajtow ma opcod wywolania funkcji to dlaczego trzeba go zastapic piecioma nop'ami.. no wiec dlatego ze nop (opcod nop'a) ma jeden bajt i aby wszystko gralo musi zostac zachowana taka sama liczba bajtow bo inaczej bledy i takie tam duperelki sie pojawiaja ;)) No i jesli juz naklepales te piec nop'ow (piszesz nop [enter] i tak piec razy)... to teraz albo nacisnij dwa razy entera lub esc i pusc si.. i jesli pojawia ci sie jakies bledy lub cos podobnego to (akurat w tym przypadku) musiales cos pochrzanic.. na innym programie moga sie pojawiac rozne bledy z roznych powodow... ale jesli nie masz zadnych bledow i pojawilo ci sie okienko patchme z miejscem na wpisanie hasla to jest ql i tescik (czyli sprawdzenie czy wystarczy zanopowanie i czy nie wywala bledow po takiej akcji) sie powiodl.. no wiec juz polowa drogi za toba ;)) Teraz jeszcze raz zlap patchme na wywolaniu tego api (wyjdz i uruchom patchme) po czym musisz spisac sobie opcody wywolania naszej funkcji wraz z opcodami instrukcji sasiadujacych naszemu wywolaniu, czyli jesli mamy:

015F:00401103  FF3590324000        PUSH      DWORD PTR [00403290]
015F:00401109  E85A010000          CALL      USER32!DialogBoxParamA
015F:0040110E  6872324000          PUSH      00403272

opcod naszego wywolania to:

E85A010000

ale ze wzgledu ze opcody moga sie powtarzac w pliku (bo opcod inaczej jest hex kodem danej instrukcji i jest on w takiej postaci zapisywany do pliku) to powinienes spisac jeszcze opcody instrukcji sasiadujacych naszemu call'owi.. a ze maja dlugie opcody to wystarcza tylko te co so wyzej zademonstrowane... staraj sie zawsze przy spisywaniu opcodow do zmiany spisywac ich dosyc duzo aby uniknac pozniejszych nieprzyjemnosci ;)) No wiec spisalismy sobie cos takiego:

FF3590324000 E85A010000 6872324000
             ^^^^^^^^^^
             zanopowac;)

No i jesli juz sobie to pieknie spisales to pusc si i wyedytuj plik patchme.exe pod jakims hexedytorem.. np. HIEW, Hex WorkShop... robiac oczywiscie kopie zapasowa tego pliku do np. patchme.exx...
Teraz wybierz opcje szukania hex w twoim hexedytorze... wpisz w odpowiednie miejsce te spisane opcody i jesli:

- nie znalazl tych opcodow,
Sprawdz dwa razy czy nie popelniles bledu w przepisywaniu opcodow.. a jesli nie popelniles to plik jest pakowany lub protectorowany i musisz go czyms rozpakowac.. o czym bedzie w lekcji 9... akurat nasz plik nie jest niczym spakowany wiec nie masz sie czym przejmowac i napewno znajdziesz odpowiednie opcody (spakowany.. czyli spakowany specjalnym pakerem do exe'cow w celu zmniejszenia jego objetosci lub zaszyfrowania go. Plik taki rozpakowywuje sie do pamieci podczas uruchamiania  exe'ca. Pisze to zeby kto nie pomyslal ze chodzi tu o pakowanie zip'kiem, rar'em lub czyms podobnym).

- znalazl odpowiednie opcody kilkakrotnie,
Musisz znow wejsc do si i spisac wiecej opcodow az do momentu gdy wpisane opcody zostana znalezione tylko raz ;))

- znalazl nasze opcody jednokrotnie,
No wiec jest ql.. bo oto nam przecierz chodzilo ;))

No wiec jesli znalazles jednokrotnie spisane opcody.. to zamieniasz opcody wywolania naszego api na na opcody nop'ow(90h).. wiec szukasz w znalezionym ciagu hex wartosci:

E8 5A 01 00 00

i zamieniasz ja na:

90 90 90 90 90

po czym zapisujesz zmiany i.. he he.. uruchamiasz spatchowanego patchme... ;)) i teraz jesli okienko naga ci sie nie pojawilo.. a pojawilo ci sie okienko samego patchme... to GRATULUJE!!! ;))) wlasnie usunales pierwszego naga w zyciu ;)) pewnie sie cieszysz.. ja tesh sie ciesze ze moglem ci pomoc.. ale nic.. czytaj dalej ;))


============DEBUGOWANIE PROGRAMU I ZNAJDOWANIE BAJTOW DO SPATCHOWANIA ORAZ KILKA SPOSOBOW PATCHU===============

Kiedy juz pousuwalismy to co nam przeszkadzalo i co mielismy usunac ;)) to robimy teraz konkret na ktorym skupia sie cala lekcja ;)) Mamy zapatchowac program w taki sposob abysmy dla kazdego wpisanego hasla otrzymywali info o poprawnym hasle.. czyli po polsku to bedzie tak.. ze patchujemy programa tak aby dla poprawnego hasla powiedzial ze jest bledne haslo a dla blednego hasla powiedzial ze jest poprawne ;))... bo aby trafic w poprawne haslo trzeba miec przecierz niezlego farta a w bledne trafi prawie kazdy (poza tymi co trafia w prawidlowe ;>>). Akurat trafienie w prawidlowe haslo na tym patchme jest o tyle ulatwione ze prawidlowych hasel sa tysiace.. ale my sie tym nie przejmujemy.. tylko patchujemy co tylko wyglada groznie ;)). No wiec jadziemy w ten sposob. Wpisz cos w odpowiednie miejsce w patchme.. zaloz pulapke na GetWindowTextA czyli:

bpx GetWindowTextA

i kliknij Sprawdz... si przerwal.. F11... i jestes  tutaj:

015F:004011B2  E8B9000000          CALL      USER32!GetWindowTextA

wywolanie tego na co lapalismy to patchme of course ;))

015F:004011B7  83F814              CMP       EAX,14
015F:004011BA  752F                JNZ       004011EB

po wywolaniu GetWindowTextA (funkcji pobierajacej tekst) w eax zwracana jest ilosc POBRANYCH znakow... a tu mamy porownanie eax z 14h a nastepnie skok jesli nie zero co nam daje tyle ze mamy wpisac

14h==20d 

znakow aby bylo ok... ale my (raczej) nie mamy wpisanych 20 znakow wiec nas wyrzuci(-loby)... ale my mamy si i nam to nie grozi... musimy to zapatchowac aby dla KAZDEGO wpisanego hasla ten warunek nie zadzialal... czyli zeby nie wyrzucilo.. ja osobiscie proponuje zanopowac te kilka instrukcji tak aby nie bylo roznicy czy wpiszesz 5 czy 30 znakow ;)) wiec:

a 004011B7

i dajesz 5 nop'ow.. a 5 dlatego ze 3 bajty ma cmp a nastepne 2 ma jnz co daje 5.. proste.. ;))

015F:004011BC  BB2C324000          MOV       EBX,0040322C

adres tego co wpisalismy jest kopiowany do EBX ;))

015F:004011C1  8B03                MOV       EAX,[EBX]

cztery pierwsze bajty tego co wpisalismy kopiowane sa do EAX

015F:004011C3  B953000000          MOV       ECX,00000053
015F:004011C8  C1C804              ROR       EAX,04
015F:004011CB  3521122112          XOR       EAX,12211221
015F:004011D0  E2F6                LOOP      004011C8
015F:004011D2  2D32B10221          SUB       EAX,2102B132
015F:004011D7  7512                JNZ       004011EB

tu mamy petelke.. tak niezwykla petelke.. a mianowicie ta petelke stanowi instrukcja

LOO...
Zgłoś jeśli naruszono regulamin