Ochrona sieci, bezpieczeństwo systemów komputerowych - securitymag.pl
February 1, 2012, 4:32 pm

Edycja zasobów w plikach wykonywalnych

1 Star2 Stars3 Stars4 Stars5 Stars (Brak ocen)
Loading ... Loading ...

W artykule Luki w plikach wykonywalnych (hakin9 11/2007) opisano, w jaki sposób modyfikować pliki wykonywalne za pomocą edytora plików binarnych. Jednak taki edytor nie pozwala na edytowanie bitmap, kursorów ani okien dialogowych. Z pomocą przychodzą programy pozwalające edytować zasoby w plikach wykonywalnych.

Author: Damian Daszkiewicz
Source: Hakin9 02/2008

W plikach wykonywalnych znajdują się instrukcje dla procesora, dane (np. wartości tablic) i zasoby. Zasobami mogą być następujące rzeczy:
• bitmapy (np. logo programu),
• ikony (prawie każdy plik wykonywalny posiada swoją ikonę; program może posiadać kilka ikon),
• niestandardowe kursory myszy,
• dłuższe łańcuchy znaków,
• okna dialogowe,
• menu,
• informacje o skrótach klawiaturowych,
• szczegółowe informacje o pliku (nazwa firmy, nazwa programu, wersja programu, informacje o licencji, informacja o wersji językowej programu).

Edycja zasobów to bardzo ciekawe zagadnienie. Po pierwsze: można zmienić wygląd ulubionego programu (np. podmienić grafiki, pozmieniać wygląd formularzy i menu, a także zmienić skróty klawiaturowe). Drugie interesujące zastosowanie to możliwość wyciągnięcia np. ikon lub grafik z dowolnego pliku wykonywalnego. Niestety, nie wszystkie pliki wykonywalne posiadają sporo zasobów. Przykładowo, kiedy napiszemy program w języku Visual Basic, zobaczymy, że formularze, menu i bitmapy nie są zapisywane jako zasoby – możliwości edycyjne takich plików wykonywalnych są więc mniejsze. Uwaga! Przed edycją jakiegokolwiek pliku wykonaj jego kopię zapasową! Zanim zaczniesz edytować pliki, musisz się upewnić, czy nie są skompresowane, gdyż w skompresowanych plikach EXE zazwyczaj zasoby są spakowane. Jeśli plik jest skompresowany, to należy go rozpakować. Najpopularniejszym programem do kompresji plików wykonywalnych jest darmowy program UPX. Aby rozpakować dany plik, skompresowany programem UPX, należy z linii komend wpisać polecenie upx -d

Przegląd zasobów za pomocą Resource Hacker

Aplikacja Resource Hacker to najpopularniejszy program do przeglądania i edytowania zasobów znajdujących się w plikach wykonywalnych. Resource Hacker obsługuje 32-bitowe pliki wykonywalne przeznaczone dla systemu operacyjnego Windows 95 (i nowszych). Niestety, Resource Hacker nie obsługuje 16-bitowych plików wykonywalnych (czyli dla DOSa i Windows 3.x). Jeśli chcesz edytować zasoby w 16-bitowych plikach wykonywalnych przeznaczonych dla Windows 3.x, musisz zaopatrzyć się w program eXeScope, który jest komercyjny i posiada mniejsze możliwości niż Resource Hacker.

Rysunek 1. Wygląd programu Resource Hacker

Rysunek 1. Wygląd programu Resource Hacker

Edycja ikon, kursorów i bitmap Otwórz w programie Resource Hacker dowolny plik wykonywalny. Wygląd aplikacji przedstawia Rysunek 1. Po lewej stronie znajduje się drzewo, w którym są wypisane wszystkie zasoby znajdujące się w pliku wykonywalnym, podzielone na kategorie według typów. Przykładowo rozwijając gałąź Icon możesz przeglądać wszystkie ikony. Jeśli dana ikona się Tobie spodoba, to możesz ją wyeksportować do pliku w formacie ICO – w tym celu należy wybrać następującą pozycję z menu: Action->Save [Icon : 1 : 1045] (w zależności od tego, jaki plik binarny otworzyłeś i którą ikonę wybrałeś, liczby mogą być inne). W podobny sposób można zapisać bitmapy i kursory. Jeśli któraś ikona nie podoba się Tobie, możesz ją zmienić. W tym celu należy z menu wybrać następującą pozycję: Action->Replace Icon, a następnie wskazać na dysku dowolny plik ICO.

Rysunek 2. Przykładowe okno dialogowe w Resource Hacker

Rysunek 2. Przykładowe okno dialogowe w Resource Hacker

Edycja menu Listing 1. przedstawia przykładowy kod, w którym jest zapisane menu. Z pozoru edycja menu nie wydaje się zbyt interesująca, jest w niej jednak pewien niuans. Otóż w prawie każdej pozycji występuje znak &. Znak ten oznacza, że następna litera w menu jest podkreślona. Jeśli w danym programie w menu Edycja jest podkreślona litera E, to można owo menu rozwinąć naciskając kombinację klawiszy ALT+E. Jest to bardzo przydatna funkcjonalność, gdyż bez potrzeby korzystania z myszy można wybrać z menu dowolną pozycję. Załóżmy, że posiadasz program, w którym kombinacja ALT+E rozwija inne menu niż Edycja. Można to zmienić korzystając z programu Resource Hacker. W tym celu należy w odpowiedniej pozycji menu przed żądaną literą wstawić znak &. Po dokonaniu zmian należy w programie Resource Hacker kliknąć przycisk Compile Script. Dopiero ta czynność spowoduje zapisanie naszych modyfikacji. W ten sposób można w dowolnej aplikacji ustawić skróty klawiaturowe według własnych potrzeb.

Edycja okien dialogowych Program Resource Hacker pozwala na edytowanie okien dialogowych. Po rozwinięciu gałęzi Dialog można przeglądać i edytować okna dialogowe. Po wybraniu dowolnego okna dialogowego oprócz kodu, jaki jest potrzebny do jego stworzenia, pojawi się również wygląd owego okna dialogowego (przykład takiego podglądu przedstawia Rysunek 2). Można w dowolny sposób przemieszczać kontrolki, zmieniać ich rozmiar (można również zmienić rozmiar formularza). Kliknij prawym przyciskiem myszy na dowolnej kontrolce (np. na przycisku) i z menu kontekstowego wybierz pozycję Edit control. Pojawi się okno dialogowe Control Editor, w którym można zmienić parametry wybranej kontrolki. Poniżej wypisałem niektóre ciekawsze właściwości, jakie mogą przyjmować kontrolki:
• Caption – napis na przycisku,
• Left i Top – współrzędne danej kontrolki na formularzu (w pikselach),
• Width i Height – szerokość i wysokość danej kontrolki (w pikselach),
• WS_DISABLED – kontrolka jest nieaktywna (np. szary przycisk, którego nie można kliknąć),
• WS_VISIBLE – kontrolka jest widoczna,
• WS_BORDER – kontrolka posiada obramowanie.
Podobnie jak poprzednio, aby dokonane zmiany zostały zapisane, należy je zatwierdzić klikając przycisk Compile Script w głównym oknie programu Resource Hacker.

Rysunek 3. Control Editor – edycja właściwości przycisku

Rysunek 3. Control Editor – edycja właściwości przycisku

Edycja ciągów znaków Czasami niektóre dłuższe ciągi znaków są zapisane jako zasób. Często pisząc program, który będzie dostępny w kilku wersjach językowych, programiści wszystkie ciągi znaków umieszczają w zasobach (dzięki temu stworzenie innej wersji językowej programu wymaga tylko dołączenia innego pliku z zasobami podczas kompilacji). Listing 2. przedstawia przykładową tablicę stringów. Cyferki po lewej stronie to ID danego komunikatu, natomiast po prawej stronie w cudzysłowiu znajduje się treść owego komunikatu. Podczas edycji nie zmieniaj ID komunikatu, gdyż może wystąpić błąd, gdy program będzie chciał pobrać komunikat o ID 80, który Ty usuniesz. Jeśli w danym ciągu znaków musi wystąpić znak cudzysłowu, to należy go poprzedzić znakiem backslash (\). Po dokonaniu stosownych zmian należy oczywiście kliknąć przycisk Compile Script w celu ich zapamiętania.

Właściwości kontrolek
programach

Korzystając z programu Resource Hacker, można edytować zasoby w plikach wykonywalnych. Natomiast istnieje możliwość edycji właściwości kontrolek (i formularzy) bezpośrednio w pamięci – w aktualnie uruchomionych programach! Jest to bardzo interesujące zagadnienie, gdyż można w ten sposób np. uaktywnić nieaktywny przycisk. Aby to zrobić, należy się zaopatrzyć w program WinDowse. Podobną funkcjonalność oferuje wtyczka Ace- Helper do Total Commandera, jednak w tym artykule skupię się na narzędziu WinDowse. Wygląd programu WinDowse przedstawia Rysunek 4. Program składa się z wielu zakładek, ale nas interesuje tylko zakładka Modify. Po uruchomieniu programu, kiedy poruszasz kursorem myszy, zmienia się zawartość pól tekstowych. Jeśli chcesz zmienić właściwości dowolnej kontrolki, najedź na nią myszą i naciśnij klawisz Scroll Lock. Wtedy ruch kursora myszy nie powoduje już zmiany zawartości pól tekstowych w programie WinDowse, natomiast Ty możesz modyfikować właściwości kontrolki, nad którą znajdował się kursor myszy w chwili naciśnięcia klawisza Scroll Lock. Odznaczając pole wyboru Visible spowodujesz, że dana kontrolka zniknie (jeśli w chwili naciśnięcia klawisza Scroll Lock kursor znajdował się nad paskiem tytułowym aplikacji, zniknie całe okno dialogowe). Odznaczając pole wyboru Enabled spowodujesz, że modyfikowana kontrolka stanie się nieaktywna. W polu Text możesz zmienić napis, który znajduje się na kontrolce (np. na przycisku, w polu tekstowym lub na pasku aplikacji). Jeśli chcesz zmienić właściwości kolejnej kontrolki, należy ponownie nacisnąć klawisz Scroll Lock, najechać kursorem myszy na dowolną kontrolkę i jeszcze raz nacisnąć Scroll Lock. Wykorzystując poznane umiejętności można sprawdzić, czy dowolny program w wersji demonstracyjnej, w którym nieaktywny jest któryś z kluczowych przycisków (np. służący do zapisania projektu), jest zabezpieczony przed zmianą właściwości przycisku za pomocą tego typu programów. Oprócz możliwości zmiany właściwości kontrolek, program Win- Dowse podaje wiele informacji o uruchomionych programach (zainteresuje to programistów piszących programy w WinAPI). Otóż na zakładce Modules podane są informacje o tym, z jakich bibliotek DLL (plików OCX itp.) korzysta wcześniej wybrana aplikacja. Z kolei na zakładce Digger możemy obejrzeć wszystkie aktualnie uruchomione okna dialogowe. Zakładka Tree pokazuje zaś informacje o wszystkich oknach dialogowych w formie drzewa – również o tym, z jakich kontrolek składa się konkretne okienko.

Jak się przed tym bronić?

Pisząc program musisz przewidzieć, że użytkownicy mogą edytować zasoby w pliku wykonywalnym. Jeśli chcesz się przed tym obronić, polecam skompresowanie pliku dowolnym programem (najlepiej jakimś mniej popularnym, wtedy utrudnione będzie znalezienie programu do dekompresji). Ewentualnie można skorzystać z płatnego programu AsProtect. Jeśli napisałeś program, który w wersji demonstracyjnej różni się od pełnej wersji tym, że przycisk do zapisania projektu stworzonego przez użytkownika jest nieaktywny, musisz przemyśleć jakiś mechanizm ochrony przed programem WinDowse. Przykładowo sprawdzenie faktu rejestracji programu podczas uruchamiania i późniejsza deaktywacja przycisku Zapisz projekt jeśli aplikacja nie jest zarejestrowana, nie będzie w tym wypadku wystarczające. Dodatkowa kontrola powinna mieć miejsce w momencie, gdy użytkownik kliknie przycisk Zapisz projekt – kiedy program jest w wersji demonstracyjnej, powinien pojawić się komunikat, że dana opcja jest dostępna tylko w wersji zarejestrowanej.

Rysunek 4. Program WinDowse

Rysunek 4. Program WinDowse

Podsumowanie

Edytując pliki wykonywalne za pomocą programu Resource Hacker, można się dowiedzieć wielu interesujących rzeczy związanych z ich budową. Nabyte umiejętności mogą się przydać podczas pisania własnych programów np. w MASMie lub w Visual C++. Natomiast program WinDowse pozwoli dowiedzieć się, w jaki sposób okna dialogowe i kontrolki są traktowane przez system operacyjny.

_______________
Damian Daszkiewicz,
jest samoukiem od wielu lat interesującym się informatyką i e-biznesem. Obecnie studiuje na Politechnice Rzeszowskiej na kierunku Informatyka. W roku 2003 wydawnictwo Helion wydało jego książkę: Vademecum hakera. Edycja plików binarnych. Kontakt z autorem: damian@daszkiewicz.net.

Listing 1. Przykładowe menu zapisane w pliku wykonywalnym
106 MENU
LANGUAGE LANG_POLISH, 0x1
{
POPUP "&Edycja"
{
MENUITEM "&Kopiuj\tCtrl+C", 300
MENUITEM "Wkl&ej\tCtrl+V", 301
}
POPUP "&Widok"
{
MENUITEM "&Standardowy", 305
MENUITEM "&Naukowy", 304
MENUITEM SEPARATOR
MENUITEM "&Grupowanie cyfr", 303
}
POPUP "Pomo&c"
{
MENUITEM "&Tematy Pomocy ", 317
MENUITEM SEPARATOR
MENUITEM "Kalkulator - i&nformacje", 302

Listing 2. Przykładowy zasób String Table
STRINGTABLE
LANGUAGE LANG_POLISH, 0x1
{
80, "Nie można otworzyć Schowka."
81, "Za mało pamięci dla danych. Zamknij jeden lub kilka programów i
spróbuj ponownie."
82, "pomoc.chm"
83, "Mój Program"
Rysunek 3. Control Editor – edycja 84, "Za mało pamięci"


Komentarze zablokowane.

EN
PL
FR
DE


Software Press Sp. z o.o. Sp. Komandytowa 02-682 Warszawa, ul. Bokserska 1, NIP 9512279582, REGON 141804060, KRS: 0000327578