strona główna
05. wrzesień 2008

Edycja stringów w plikach wykonywalnych skompilowanych kompilatorem C/C++

Powrót do dzialu uzupelnienia

Czasami istnieje potrzeba zmienic w pliku wykonywalnym string. Problem pojawia sie, jesli dany program byl kompilowany przy pomocy jakiegos kompilatora jezyka C++ (np. Dev C++). Stringi moga byc w formacie ASCIIZ lub Unicode, jednak nie to jest najwiekszym problemem. Przygladnijmy sie przykladowemu stringowi:

Plik %s ma rozmiar %d bajtów

Zalózmy, ze chcemy zmienic napis np. Rozmiar pliku %s to %d bajtów. Zadanie to nie jest trudne, jednak nalezy wyjasnic skad sie wziely dziwne znaki %s i %d. Z kontekstu mozna sie domyslic, ze %s to zmienna lancuchowa (string) a %d to jakas liczba. Otóz w jezyku C/C++ funkcja Printf ma dosc dziwna skladnie która jest tajemnicza dla osób programujacych w innych jezykach. Aby wyswietlic informacje ile bajtów ma dany plik nalezy wywolac funkcje printf z nastepujacymi parametrami:

printf("Plik %s ma rozmiar %d bajtów\n\n",&p,a);

Gdzie %s to specjalny znak sterujacy informujacy, ze pomiedzy wyrazem plik a rozmiar ma zostac wyswietlony string a %d to znak sterujacy informujacy, ze miedzy wyrazami rozmiar a bajtów ma zostac wyswietlona liczba typu integer. &p to wskaznik do zmiennej lancuchowej (stringa) natomiast a to nazwa zmiennej zawierajacej jakas liczbe. W Delphi powyzszy kod byl by mieco inny:

writeln('Plik '+p+' ma rozmiar '+IntToStr(a)+' bajtów');

Tutaj wyraznie widac, ze instrukcja writeln wyswietla 5 stringów jeden po drugim (funkcja IntToStr konwertuje liczbe na stringa). W VB kod by wygladal bardzo podobnie:

msgbox "Plik "+p+" ma rozmiar "+Cstr(a)+" bajtów");

Edytujac stringi w plikach wykonywalnych które byly utworzone przez jakis kompilator jezyka C/C++ nalezy zwrócic uwage na owe "znaki sterujace". Ponizsza lista zawiera spis róznych znaków sterujacych

%d    - parametr typu calkowitego ze znakiem    
%u    - parametr typu calkowitego bez znaku   
%o    - parametr typu calkowitego bez znaku w systemie ósemkowym    
%X   - parametr typu calkowitego bez znaku w systemie szesnastkowym. W miejsce cyfr z zakresu 10 - 15 sa wstawiane znaki
%f     - parametr typu float lub double (konwersja do postaci [-]ddd.ddd )   
%E    - parametr typu float lub double (konwersja do postaci [-]d.ddde+|-dd )   
%c     - parametr typu char (pojedynczy znak)   
%s     - parametr typu string (char *)

Sa tez inne znaku sterujace, które nie odpowiadaja za wyswietlanie jakiejs zmiennej. Oto ich wykaz:

/n - wyswietl nastepny tekst w nowej lini (po prostu "wyswietl" klawisz enter)
// - wyswietl znak /

Pobierz przykladowy plik skompilowany programem DevC++ (8 KB)

Powrót do dzialu uzupelnienia