witam!
Mam takie pytanko czy istnieje możliwośc aby program sam sie zmodyfikował dopisał sam do siebie <ort>co kolwiek</ort> ! chciałbym aby dopisywał liczby aby sam w sobie mial licznik. Czy cos takiego jest wykonywalne ?
witam!
Mam takie pytanko czy istnieje możliwośc aby program sam sie zmodyfikował dopisał sam do siebie <ort>co kolwiek</ort> ! chciałbym aby dopisywał liczby aby sam w sobie mial licznik. Czy cos takiego jest wykonywalne ?
Kiedyś pisałem program shareware, który po n-uruchomieniach kasował sam siebie z dysku. Oto tok postepowania i source.
1). Deklarujemy stałą np. typu LongInt, która przechowuje liczbę dostępnych uruchomień programu, oraz zmienną do odczytania tej liczby. Stała jest typu LongInt ze względu na uproszczenie szukania jej za pomocą Hex edytora (np. inicjujesz ją zmienną $AABBCCDD - szansa, że znajdziesz dwie takie wartości w kodzie jest mała). Do czasu finalnej wersji, wskaźnik plikowy ustawiamy na cokolwiek.
2). Kompilujemy program.
3). Za pomocą hex edytora szukamy liczby uruchomień, czyli $DDCCBBAA (kolejność odwrócona). Gdy ją znajdziemy, zapisujemy jej adres. W kodzie programu ustawiamy wskaźnik plikowy na tą stałą. Teraz możemy dowolnie odczytywać / zapisywać wartości.
Kod programu:
var
f :file;
dd :LongInt;
const
Uruchomienia :LongInt = $AABBCCDD;
begin
Assign(F, ParamStr(0));
if Uruchomienia > 0 then
begin
Reset(F, 1);
{ zmiana wartości pozycji pliku i wartości zmiennej nie mają wpływu na adresy fizyczne }
Seek(F, $1692); { taki adres podał hex edytor }
BlockRead(F, DD, SizeOf(DD)); { odczyt wartości }
Dec(DD); { zmniejsz licznik uruchomień }
Seek(F, FilePos(F) - SizeOf(DD)); { Cofamy się o rozmiar zmiennej }
BlockWrite(F, DD, SizeOf(DD)); { zapis nowej warości }
Close(F);
end else
begin
{ tu operacje destrukcji pliku }
Rewrite(F); { zeruj plik }
Close(F); { zamknij }
Erase(F); { usuń }
end;
end;
Dopisał sam do siebie, hmm...
Nie ma problemu, jeżeli chcesz dopisywać kod maszynowy.
Natomiast jeżeli chodzi o kod Delphi, to ciężka sprawa, bo przecież plik wykonywalny programu ma mało wspólnego z kodem, chyba, że do swojego programu dopisałbyś jeszcze kompilator :d
BTW: w czym chcesz to wykorzystać?