Online: 0x01C (28)
haker.info  — Etyczny hacking_
Spreading knowledge like a virus.

Podstawy edycji plików binarnych

   Dawid Farbaniec    1150 s艂贸w

1. Wst臋p

W tym artykule przedstawiono podstawy modyfikacji plik贸w binarnych. Poruszaj膮c temat plik贸w stosuje si臋 g艂贸wny podzia艂 na pliki tekstowe oraz binarne. Mo偶na wyr贸偶ni膰 r贸wnie偶 pliki obraz贸w, d藕wi臋kowe czy wykonywalne, ale je wszystkie zalicza si臋 do og贸lnej kategorii plik贸w binarnych. Przyj臋to, 偶e plik tekstowy zawiera ci膮g znak贸w zakodowany w postaci bajt贸w. Ka偶demu znakowi odpowiada okre艣lona warto艣膰 liczbowa. Natomiast pliki binarne maj膮 swoj膮 struktur臋. Ka偶da warto艣膰 w pliku binarnym ma ustalone znaczenie. Spos贸b u艂o偶enia danych w takim pliku nazywa si臋 formatem pliku. Bloki danych, kt贸re mo偶na wyodr臋bni膰 okre艣la si臋 terminem sekcja pliku. Cz臋sto spotyka si臋 na pocz膮tku pliku informacje, kt贸re pozwalaj膮 ustali膰 spos贸b u艂o偶enia danych w dalszej cz臋艣ci pliku. Takie dane pocz膮tkowe to nag艂贸wek pliku.

2. Edytor heksadecymalny

Edytor heksadecymalny (ang. hex editor) nazywany te偶 szesnastkowym pozwala wy艣wietli膰 zawarto艣膰 pliku binarnego w formie tablicy bajt贸w. Warto艣膰 ka偶dego bajtu jest pokazywana jako liczba w systemie szesnastkowym od warto艣ci 00 do FF (dziesi臋tnie: od 0 do 255).

2.1. Interfejs programu XVI32

Jest wiele dost臋pnych hex edytor贸w i ka偶dy mo偶e wybra膰 odpowiedni dla siebie pod wzgl臋dem 艂atwo艣ci obs艂ugi czy potrzebnej funkcjonalno艣ci. Tutaj przedstawiono darmowy edytor heksadecymalny o nazwie XVI32.
Dost臋pny jest on do pobrania na stronie:
http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm

Wygl膮d g艂贸wnego okna programu XVI32 przedstawiono na rysunku 2.1.

XVI32 gui
Rysunek 2.1. Interfejs graficzny u偶ytkownika programu XVI32

W edytorze heksadecymalnym XVI32 na rysunku 2.1. wida膰 otwarty plik wykonywalny *.exe. Zawarto艣膰 pliku wy艣wietlona jest jako siatka (ang. grid) wype艂niona warto艣ciami poszczeg贸lnych bajt贸w. Lewa cz臋艣膰 zawiera warto艣ci w systemie szesnastkowym, natomiast prawa strona siatki zawiera widok znakowy. To w艂a艣nie w prawej cz臋艣ci pokazane s膮 warto艣ci znakowe odpowiadaj膮ce poszczeg贸lnym bajtom. Mo偶na zauwa偶y膰, 偶e plik wykonywalny zawiera w sobie r贸偶ne napisy takie jak np. sygnatura MZ na samym pocz膮tku czy tzw. napis DOS Stub o tre艣ci This program cannot be run in DOS mode.. Napis ten jest pozosta艂o艣ci膮 po 16-bitowym podsystemie, kt贸ry zawiera艂 kiedy艣 Windows®.

2.2. Przechodzenie pod okre艣lone przesuni臋cie (ang. offset)

Termin przesuni臋cie (ang. offset) to warto艣膰, kt贸ra okre艣la pozycj臋 w pliku. Pocz膮tek pliku to warto艣膰 zero. W prostych s艂owach pozycja to ilo艣膰 bajt贸w od pocz膮tku pliku, taki numer kolejny.

Na rysunku 2.2. przedstawiono spos贸b w jaki mo偶na przej艣膰 pod okre艣lone przesuni臋cie w pliku. Nale偶y wtedy wybra膰 z g贸rnego menu Address » Goto... i wpisa膰 warto艣膰 przesuni臋cia w systemie szesnastkowym lub dziesi臋tnym. Na rysunku 2.2. zaprezentowano przej艣cie pod offset o warto艣ci 0FFh (dziesi臋tnie 255).

XVI32 offset
Rysunek 2.2. Przej艣cie pod okre艣lony offset w pliku za pomoc膮 hex edytora

Po przej艣ciu pod okre艣lon膮 pozycj臋 w pliku mo偶na wpisywa膰 nowe warto艣ci dla okre艣lonych bajt贸w. W ten spos贸b dokonuje si臋 modyfikacji pliku. Modyfikacj臋 napisu DOS Stub pokazano na rysunku 2.3.

XVI32 edit dos stub
Rysunek 2.3. Modyfikacja napisu DOS Stub za pomoc膮 hex edytora

Gdyby (zamiast nadpisania) usun臋艂o si臋 ten napis (klawisz Backspace), to plik zosta艂by uszkodzony i nie uruchomi艂 by si臋 ju偶. Dlaczego? Skr贸cenie napisu lub usuni臋cie go wp艂ywa na odwo艂ania w pliku. Dane za miejscem edycji maj膮 wtedy inny offset 鈥 s膮 przemieszczone.

3. Edytor zasob贸w

Pliki wykonywalne mog膮 posiada膰 zasoby takie jak m.in. okna dialogowe, bitmapy, ikony, czcionki czy dane surowe (ang. raw data). Edytory zasob贸w pozwalaj膮 na dodawanie, usuwanie i modyfikacj臋 zasob贸w zawartych w okre艣lonym pliku.

3.1. Interfejs programu ResourceHacker

Jednym z darmowych i prostych w obs艂udze edytor贸w zasob贸w jest ResourceHacker (w skr贸cie ResHack).
Mo偶na go pobra膰 ze strony:
http://www.angusj.com/resourcehacker/

Okno narz臋dzia ResHack przedstawiono na rysunku 3.1. Z lewej strony kontrolka widoku drzewa przedstawia rodzaje zasob贸w jakie zawiera aktualnie otwarty plik. W tym przypadku jest to ikona oraz zas贸b grupy ikon. Prawa cz臋艣膰 okna wy艣wietla podgl膮d zawarto艣ci zaznaczonego zasobu.

reshack gui
Rysunek 3.1. Interfejs graficzny u偶ytkownika programu ResourceHacker

3.2. Modyfikacja okien dialogowych

W systemie Windows® istniej膮 r贸偶ne sposoby tworzenia okien dla program贸w. Jednym ze sposob贸w jest umieszczenie okna dialogowego aplikacji w zasobach. Na rysunku 3.2. przedstawiono okno przyk艂adowej aplikacji. Po lewej stronie w kontrolce widoku drzewa wida膰 identyfikator zasobu TESTWIN w ga艂臋zi Dialog. Je艣li kliknie si臋 na identyfikator zasobu, to z prawej strony pojawi si臋 podgl膮d jego zawarto艣ci. Okno tutaj jest opisane jako skrypt zasob贸w, ale edytor dla u艂atwienia modyfikacji przedstawia podgl膮d tego okna. Mo偶liwo艣膰 zmiany wygl膮du i zawarto艣ci okna dialogowego maj膮c tylko gotowy plik wykonywalny pozwala np. na t艂umaczenie interfejsu danego programu na inny j臋zyk. Mo偶na tym sposobem wykona膰 spolszczenie dla programu.

reshack dialogs
Rysunek 3.2. Modyfikacja okien dialogowych w zasobach programem ResourceHacker

3.3. Zmiana ikony pliku wykonywalnego

Jako, 偶e ikona programu jest r贸wnie偶 zasobem, to za pomoc膮 narz臋dzia ResourceHacker mo偶liwa jest zmiana ikony dowolnego pliku wykonywalnego. Nale偶y w tym celu wybra膰 z g贸rnego menu Action » Replace Icon ... i w oknie, kt贸re si臋 pojawi wybra膰 plik z now膮 ikon膮 (Open file with new icon...), a nast臋pnie klikn膮膰 Replace. Zapisanie zmian w pliku wykonuje si臋 poprzez wybranie File » Save.

reshack change icon
Rysunek 3.3. Zmiana ikony pliku *.exe za pomoc膮 narz臋dzia ResourceHacker

4. Modyfikacja kodu plik贸w wykonywalnych *.exe

Aplikacja typu debugger pozwala analizowa膰 wykonywanie kodu programu instrukcja po instrukcji. Cz臋sto tego typu narz臋dzia posiadaj膮 r贸wnie偶 wiele rozbudowanych funkcji np. mo偶liwo艣膰 modyfikacji kodu programu nie maj膮c dost臋pu do kod贸w 藕r贸d艂owych, a jedynie gotowy plik wykonywalny *.exe.

4.1. Analiza programu w debuggerze x64dbg

Narz臋dzie x64dbg to darmowy debugger dla Windows®. Program x64dbg przeznaczony jest dla aplikacji 64-bitowych. Natomiast program x32dbg obs艂u偶y starsze, 32-bitowe pliki wykonywalne.
Program mo偶na pobra膰 ze strony:
https://x64dbg.com/

Aby otworzy膰 plik wykonywalny w debuggerze nale偶y wybra膰 z g贸rnego menu File » Open. Nast臋pnie, aby przej艣膰 do punktu wej艣cia (ang. entry point) analizowanej aplikacji nale偶y klikn膮膰 w g贸rnym menu Debug » Run.

Po tych operacjach mo偶na wykonywa膰 program krok po kroku (instrukcja po instrukcji). Do wykonania jednego kroku s艂u偶膮 przyciski F7 (Debug » Step into) oraz F8 (Debug » Step over). Z tym, 偶e u偶ycie Step into wchodzi do wn臋trza funkcji, gdy jest taka do wykonania. Natomiast Step over nie wchodzi wg艂膮b funkcji, tylko wykonuje j膮 i przechodzi do kolejnej instrukcji.

4.2. Modyfikacja kodu pliku wykonywalnego

W debuggerze, kt贸ry jest prezentowany istnieje mo偶liwo艣膰 analizy kodu pliku wykonywalnego jako listingu w j臋zyku Asembler. Narz臋dzie to dokonuje disassemblacji. Jest to proces odwrotny do kompilacji (asemblacji), czyli zamiana (odtworzenie) kodu maszynowego na j臋zyk Asemblera.

Maj膮c uruchomion膮 dowoln膮 przyk艂adow膮 aplikacj臋 pod debuggerem mo偶liwa jest zmiana jej kodu. Aby zmieni膰 instrukcj臋, nale偶y klikn膮膰 na ni膮 podw贸jnie lewym przyciskiem myszy i wpisa膰 nowy rozkaz lub jego operand. Zaprezentowano to na rysunku 4.1.

x64 dbg edit
Rysunek 4.1. Modyfikacja instrukcji programu za pomoc膮 debuggera x64dbg

Operacja zaprezentowana na rysunku 4.1. spowodowa艂a zmian臋 艣cie偶ki wykonania. Instrukcja skoku warunkowego zosta艂a zmieniona na przeciwn膮. Teraz program nie wykona skoku, po zmianie rozkazu.
Odnosz膮c si臋 do j臋zyk贸w wysokiego poziomu mo偶na to por贸wna膰 do zmiany instrukcji:
if (rax != 7} jump();
na instrukcj臋:
if (rax == 7) jump();.

4.3. Wype艂nianie przestrzeni rozkazami NOP

Je艣li zamiast modyfikacji instrukcji w pliku wykonywalnym istnieje potrzeba usuni臋cia cz臋艣ci kodu, to mo偶na u偶y膰 opcji Binary » Fill with NOPs. Spowoduje to wype艂nienie zaznaczonych instrukcji rozkazami NOP. Rozwini臋cie nazwy tej instrukcji (NOP) to No Operation, czyli nie wykonuje ona 偶adnej czynno艣ci, kt贸ra mia艂aby wp艂yw na stan programu.

Na rysunku 4.2. przedstawiono spos贸b usuni臋cia instrukcji skoku warunkowego poprzez zast膮pienie go instrukcjami NOP.

x64dbg fill with nops
Rysunek 4.2. Wype艂nienie okre艣lonego obszaru rozkazami NOP w x64dbg

5. Zako艅czenie

Je艣li s膮 jakie艣 pytania lub komentarze to prosz臋 pisa膰. Pozdrawiam!

Dawid Farbaniec


Tagi:  reverse-engineering 

Komentarze czytaj膮cych

Wszystkie tre艣ci umieszczone na tej witrynie s膮 chronione prawem autorskim. Surowo zabronione jest kopiowanie i rozpowszechnianie zawarto艣ci tej witryny bez zgody autora. Wszelkie opublikowane tutaj tre艣ci (w tym kody 藕r贸d艂owe i inne) s艂u偶膮 wy艂膮cznie celom informacyjnym oraz edukacyjnym. W艂a艣ciciele tej witryny nie ponosz膮 odpowiedzialno艣ci za ewentualne niezgodne z prawem wykorzystanie zasob贸w dost臋pnych w witrynie. U偶ytkownik tej witryny o艣wiadcza, 偶e z zamieszczonych tutaj danych korzysta na w艂asn膮 odpowiedzialno艣膰. Wszelkie znaki towarowe i nazwy zastrze偶one zosta艂y u偶yte jedynie w celach informacyjnych i nale偶膮 wy艂膮cznie do ich prawnych w艂a艣cicieli. Korzystaj膮c z zasob贸w witryny haker.info o艣wiadczasz, 偶e akceptujesz powy偶sze warunki oraz polityk臋 prywatno艣ci.