MENU  
  Strona startowa
  Newsletter
  Rejestracja
  LOGOWANIE
  Forum
  Systemy
  WAREZ
  Chomikuj.pl
  Darmowy Hosting
  GRAFIKA
  Baner Flash
  Alfabet HTML
  Asembler Kurs
  PIERWSZY RAZ HTML
  Hakerstwo
  => Lekcja 1
  => Lekcja 2
  => Lekcja 3
  => Lekcja 4
  => Lekcja 5
  => Lekcja 6
  => Lekcja 7
  => Lekcja 8
  => Lekcja 9
  => Lekcja 10
  => Lekcja 11
  Świat WWW
  Serwery Proxy
  Galeria
  GRY
  SKÓRKA DO GG
  Lockerz.com
  SKLEP
...
Lekcja 5
Lekcja 5 - "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

LOOP

a dziala ona w ten sposob ze wykonuje skok pod adres podany jako jej argument (tutaj 004011C8) dopoki

ECX <> 0

czyli skacze pod ten swoj adres dopoki ECX rozne od zera.. dekrementujac (odejmujac 1) ten rejestr przy kazdym skoku.. czyli skacze tyle razy jaka liczba jest w ECX.. a u nas jest (jakbys nie zauwazyl) 53h ) No wiec analizujac ta nasza petelke to 53h razy wykonywane sa instrukcje (odwracalne):

015F:004011C8  C1C804              ROR       EAX,04
015F:004011CB  3521122112          XOR       EAX,12211221

ktorych wynik jest zapisywany w EAX po czym:

015F:004011D2  2D32B10221          SUB       EAX,2102B132

od wyniku odejmowana jest wartosc 2102B132h i:

015F:004011D7  7512                JNZ       004011EB

jesli wynikiem odejmowania jest 0 (zero [EAX == 00000000]) to skoku nie ma.. a my musimy wiedziec ze jezeli skok sie wykona to wylatujemy ) a inaczej przegrywamy... otrzymujemy info o zlym hasle ;(( no i tu zademonstruje patch na dwa sposoby:

1. Gdybysmy szukali poprawnego hasla to moglibysmy spatchowac w ten sposob. Instrukcje:

015F:004011C8  C1C804              ROR       EAX,04
015F:004011CB  3521122112          XOR       EAX,12211221

zamienilibysmy na:

XOR EAX, 12211221
ROL EAX, 04

przy czym przed przejsciem przez pierwsza instrukcje (xor) EAX == poprawnemu wynikowi (2102B132) czyli klepiesz:

r [enter]

i do eax klepiesz:

2102B132

i po sprawie.
Nastepnie zamieniasz te instrukcje tak jak opisalem wyzej i po przejsciu przez loop piszesz:

? EAX

i enter.. po czym otrzymujesz wartosc eax w dec, hex, ascii.... to ascii czytasz od tylu i juz masz pierwsze cztery literki prawidlowego hasla )
Sposob przedstawiony powyzej po odwroceniu odpowiednich instrukcji.. zamiast sprawdzac poprawnosc naszego hasla.. wylicza nam prawidlowe haselko ) ql.. )

2. Drugi sposob to (to co mamy zrobic) zwykla zmiana jnz na jz )


015F:004011D9  E839000000          CALL      00401217
015F:004011DE  85C0                TEST      EAX,EAX
015F:004011E0  7509                JNZ       004011EB

tradycyjne... call a nastepnie test i jnz/jz itp... wiec tutaj dam ci dobra rade... akurat na tym przykladzie to nie ma to sensu ale gdy lamiesz normalnego proga to nie zmieniaj tego jnz na jz tylko wejdz w tego call'a.. i sprobuj wylukac co jest robione z twoim haslem.. bo musisz sobie zapamietac ze czym lepiej poznasz zabezpieczenie tym trafniej bedziesz potrafil je zlamac a i satysfakcja bedzie nie wspolmiernie wieksza.. a tak praktycznie mowiac to czesto zmiana tego jnz by wystarczyla ale jeszcze czesciej w tym callu zapisywane sa jakies dane ktore pozniej sa gdzies jeszcze raz sprawdzane... i po zmienieniu skoku to i tak bedziesz mial nie zarejestrowanego proga.. a poprzez dokladniejsze sledzenie kodu mozesz wylukac odpowiednie miejsca.. gdzie i co jest zapisywane... i dzieki temu przedsiewziac jakies srodki zapobiegawcze.. w taki sposob aby (glupi?) progi myslal ze jest zarejestrowany... wiec my postepujemy jak ludzie i wchodzimy w call'a.. czyli gdy masz go podswietlonego to F8 i ladujesz tu:


015F:00401217  83C304              ADD       EBX,04

dodaje do EBX wartosc 04h.. dzieki czemu (jak dobrze pamietasz w EBX jest adres twojego hasla) teraz adres w EBX wskazuje na 5 znak twojego hasla... )

015F:0040121A  8B03                MOV       EAX,[EBX]

nastepne 4 znaki hasla do EAX...

015F:0040121C  86C4                XCHG      AL,AH

teraz zamienianie miejscami wartosci z AH na wartosc z AL... czyli jesli:

AH == 00h
AL == FFh

to po operacji:
xchg AL, AH

wyniki sa nastepujace:

AH == FFh
AL == 00h

proste.. nie??.. tak wiem ze proste ale jakbys czegos nie wiedzial to pytaj albo na forum UCS albo mailuj na crk_pomoc@poland.com )


015F:0040121E  80C4CD              ADD       AH,CD

w AH jest teraz 8 znak naszego hasla.. i do tego znaku dodawana jest wartosc CDh...

015F:00401221  84E4                TEST      AH,AH
015F:00401223  7502                JNZ       00401227
015F:00401225  33C0                XOR       EAX,EAX
015F:00401227  EBB5                JMP       004011DE

i jesli po dodaniu do AH wartosci CDh w AH jest wartosc rozna od zera to skok do jmp a jesli jest zero to EAX jest xor'owane  przez siebie(zerowane) a nastepnie skok jmp sie wykonuje do naszego:

015F:004011D9  E839000000          CALL      00401217
015F:004011DE  85C0                TEST      EAX,EAX <== tutaj skacze jmp
015F:004011E0  7509                JNZ       004011EB

test eax, eax.. czyli jesli w eax jest wartosc rozna od zera to zle haslo... wniosek prosty.. jesli bedzie xorowanie w call'u to skok jnz po test eax, eax sie nie wykona czyli do tego momentu patchme by myslal ze jest dobre haslo.. no wiec z tego co przeanalizowalismy widzimy ze bez roznicy dla nas jest czy zmienimy za tym callem czy w srodku odpowiedni skok bo zadne szczegolne rzeczy tam sie nie dzieja.. ale tylko w tym przypadku.. wiec zmien skok:

015F:004011E0  7509                JNZ       004011EB

na:

015F:004011E0  7409                JZ       004011EB


huh... juz jestesmy prawie na samym koncu ) jeszcze tylko kilka lini kodu i patchme bedzie poprawnie zapatchowane )

015F:004011E2  83C307              ADD       EBX,07

w EBX nadal jest adres naszego hasla (5 znaku) i do tego adresu dodawane jest 07h co daje nam tyle ze teraz adres w EBX wskazuje na 12 znak w hasle )

015F:004011E5  8A03                MOV       AL,[EBX]

i ten wlasnie (dwunasty) znak z hasla kopiowany jest do AL...

015F:004011E7  2C31                SUB       AL,31

a nastepnie odejmowane od tego znaku jest 31h...

015F:004011E9  7816                JS        00401201

i jesli (js - skok jesli ujemny, jns - skok jesli dodatni) wynik odejmowania jest ujemny to skok sie wykonuje i otrzymujemy info o poprawnym hasle ) w przeciwnym wypadky bash... ;(( no to widzimy ze aby skok sie wykonal 12 znakiem powinien byc znak od 30h w dol... ale to raczej robi za ciekawostke... my mamy to spatchowac... wiec jesli skok sie wykona to jest dobrze to zrobmy tak zeby sie wykonywal zawsze czyli zamienmy js na jmp czyli:

015F:004011E9  7816                JS        00401201

zamien na:

015F:004011E9  EB16                JMP        00401201

i juz dostajesz info o poprawnym hasle ) wiec jak sie pewnie domyslasz ZLAMALES patchme.. ale dopiero w 50%... w 100% zlamiesz gdy zrobisz to samo tylko na stale... czyli pospisuj sobie opcody, uruchom hexedytora.. a zreszta sam wiesz co... jak nie to odsylam do opisu usuwania naga ) GrAtUlUjE i pOwOdZeNiA zycze )


===========LOADERY=============

Loader jest to programik sluzacy do sledzenia poczynan danego programu od pierwszej jego instrukcji... jest pomocny przede wszystkim przy rozpakowywaniu spakowanych PE'kow ale rowniez przy zwalczaniu niektorych antysi i takich tam podobnych rzeczy. Baardzo dobry loader dolaczony jest do si.. nosi on nazwe symbol loadera ) i jest naprawde profesjonalnym narzedziem wspolpracujacym z takimi chocby (rownie profesjonalnymi) narzedziami jak IceDump czy ProcDump wraz z calym dodatkowym stuffem )
Niewatpliwa zaleta loaderow jest mozliwosc sledzenia za ich pomoca programu od pierwszej instrukcji.. niestety loadery pracuja w oknie co jak pewnie wiecie ulatwia jego wykrycie.. ale jest to rownie proste do obejscia wiec bez obawy. Niewatpliwa wada loaderow jest to ze wspolpracuja z debugerami.. powiesz pewnie ze to zaleta a nie wada... no zaleta jest dlatego ze znajac danego debuggera mamy w zasadzie nieograniczone mozliwosci.. ale wada jest taka ze gdy ukryjemy debuggera przed programem to spoko.. program go nie widzi.. ale loader tesh nie i dupa zbita... bo przeciez musi byc widziany przez loadera... no ale mozesz pomyslec ze jesli mozemy sledzic program od pierwszej instrukcji to odkrycie debuggera nam nie przeszkadza.. bo chocby bylo nawet jakies anty to przeciez mozna go zlikwidowac... no tak.. calkiem dobra teoria.. ale w praktyce to wyglada tak ze czesto (baardzo czesto) zachodzi potrzeba puszczenia debuggera aby wykonal jakas tam petle z mnostwem call'ow i teraz wystarczy tylko male anty i juz prog sie wywala a my musimy leciec od poczatku ) Wiecej przeciwwskazan nie zauwazylem )
Moje skromne zdanie brzmi ze bez loadera nie ma crackera.. moze kiedys i ty sie ze mna zgodzisz )


=======OBIECANY OPIS USUNIECIA NAGA Z PATCHME ZA POMOCA W32DASM========
Ten opis mial byc krotki.. wiec taki bedzie. Nie ma tu zadnych opisow.. co, gdzie i dlaczego sie dzieje tylko szybciutki opisik jak usunac naga z patchme )
Ladujesz do W32DASM plika... w SDR szukasz stringu

NAGSCREEN

klikasz na nim dwukrotnie... nastepnie szukasz pierwszego call'a ponizej podswietlonej lini.. czyli czegos takiego:

* Reference To: USER32.DialogBoxParamA, Ord:0092h

:00401109 E85A010000  Call 00401268

klikasz na tyym call'u tak aby byl podswietlony... patrzysz na pasek znajdujacy sie zaraz nad paskiem zadan.. lukajac na pole offset na tym pasku.. zobaczysz:

00000509h

to jeszcze spisujesz opcod tego Call'a czyli:

E85A010000

Otwierasz plik patchme pod hexedytorem.. walisz pod offset spisany wczesniej.. i nop'ujesz wczesniej spisany opcod... nastepnie zapisujesz zmiany i juz masz usunietego naga )
Gratulacje )
Teraz 11199 odwiedzający (26033 wejścia)
Logowanie  
 
Nazwa użytkownika:
Hasło:
 
 
 
 
 
   
Ta strona internetowa została utworzona bezpłatnie pod adresem Stronygratis.pl. Czy chcesz też mieć własną stronę internetową?
Darmowa rejestracja