Edycja stringów w plikach wykonywalnych skompilowanych kompilatorem C/C++
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)