//Aufruf
filename := ExtractFilePath(paramstr(0))+'
patched'+ExtractFileName(paramstr(0));
PatchFile(Paramstr(0), filename, '
Version', '
1.0.0.1');
// eigentlich blödes Beispielt mit der Versionsnummer
//Code
procedure PatchFile(
const sourcefilename, destfilename:
string;
const globalident, newconfigstr: Ansistring);
var
exedata, magicword: Ansistring;
p: Integer;
pchecksum: PCardinal;
begin
MAGIC_WORD_LEN := Length(globalident);
//globalconfigdata ist global deklariert. Schaut euch das Original an, dann ergiebt die nächste zeile Sinn
globalconfigdata := #0#0#0#0 + globalident +
#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +
#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0;
// verhindern, dass die neuen Konfigdaten zu lang werden
if Length(newconfigstr) > Length(globalconfigdata) - MAGIC_WORD_LEN - CHECKSUM_LEN
then
raise Exception.Create('
Config String too long');
magicword := GetMagicWord;
// raise Exception.Create(magicword);
exedata := FileToString(sourcefilename);
// Exe-Datei als String laden
p := Pos(magicword, exedata);
// Magisches Wort suchen
Assert(p <> 0);
pchecksum := PCardinal(@exedata[p]);
Dec(pchecksum);
Inc(p, MAGIC_WORD_LEN);
// Magisches Wort überspringen
// Configdaten überschreiben
Move(newconfigstr[1], exedata[p], Length(newconfigstr));
pchecksum^ := CalcXorSum(exedata);
// modifizierte EXE speichern
StringToFile(destfilename, exedata);
end;