vx7.pl - hacking / coding / vx | Poland |

 Podstawy edycji plików binarnych

Napisane  27 września 2018 godz. 18:06 przez  Dawid_vx7

1. Wstęp

W tym artykule przedstawiono podstawy modyfikacji plików binarnych. Treść jest skierowana dla początkujących. Procesor operuje na liczbach. Dane używane w różnych operacjach to zatem liczby lub ciągi liczb o różnym rozmiarze. Tutaj jednak zamiast określenia „liczba” lepiej użyć słów „bajt” lub „ciąg bajtów”, szczególnie gdy chodzi o pliki, czyli dane przechowywane na dysku czy w pamięci komputera.

Poruszając temat plików stosuje się główny podział na pliki tekstowe oraz binarne. Można wyróżnić również pliki graficzne obrazów, pliki dźwiękowe, pliki 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!

Tagi:  reverse-engineering 


Wszystkie treści, kody źródłowe i programy umieszczone na portalu vx7.pl są chronione prawem autorskim. Surowo zabronione jest kopiowanie i rozpowszechnianie zawartości tej witryny bez zgody autora. Wszelkie materiały opublikowane na portalu vx7.pl służą jedynie celom edukacyjnym. Autorzy portalu vx7.pl i materiałów umieszczanych na nim nie biorą odpowiedzialności za niewłaściwe wykorzystanie udostępnionych zasobów. Nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania zasobów zawartych w witrynie. Osoby zarządzające portalem vx7.pl zastrzegają sobie prawo do usunięcia wpisów opublikowanych przez użytkowników bez podania przyczyny. 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 portalu vx7.pl oświadczasz, że akceptujesz powyższe warunki.