Vale, lo que buscas entonces es un "Patcher", algo así como esto:
Código Delphi
[-]
{$APPTYPE CONSOLE}
Program patch_programa;
Uses Windows;
Const
IntroMessage : string = 'Programa 2.70, Crack by cualquiera!...';
TargetFileName : string = 'programa.exe';
TargetBackupName : string = 'programa.bak';
TargetFileLength : longint = 568352;
NumberOfBytes = 21;
TargetOffsets : Array [1..NumberOfBytes] Of Longint = ($000B1F,$0043C0,$007EA9,$007EAA,$00ACA3,$00E3D4,$00E69F,$00EC77,$00ECAC,$00ECED,$00F8D4,$01772B,
$01772C,$01772D,$0178F6,$01A36C,$01AD5F,$01AD60,$01AD61,$01AE54,$021055);
TargetBytes : Array [1..NumberOfBytes] Of Byte = ($EB,$EB,$00,$00,$00,$00,$EB,$EB,$EB,$EB,$EB,$E9,$F3,$00,$EB,$00,$E9,$BE,$00,$EB,$EB);
var f: File Of Byte;
ErCode: Byte;
Function FileOpen:Integer;
Begin
{$I-}
Assign(f,TargetFileName);
FileMode := 2;
Reset(F);
{$I+}
ErCode:=0;
If IOResult<>0 Then ErCode:=1 Else
If FileSize(f)<>TargetFileLength Then ErCode:=2;
If ErCode=0 Then FileOpen:=0 Else FileOpen:=-1;
End;
Procedure ShowErr(ErCode:Byte);
Begin
WriteLn;
Write('Error..: ') ;
Case ErCode Of
1: Writeln(TargetFileName,' No se encuentra o se está usando.');
2: Writeln(TargetFileName,' :Tamaño de archivo distinto. Será otra versión.');
End;
Readln;
Halt;
End;
Procedure FileModifyAndClose;
var j:byte;
Begin
{$I-}
For j:=1 to NumberOfBytes Do
Begin
Seek(f,TargetOffsets[j]);
Write(f,TargetBytes[j]);
End;
Close(F);
{$I+}
If IOResult=0 Then Writeln(TargetFileName,' Se ha cambiado con éxito!')
Else Writeln('Eeeeee! Error desconocido ',TargetFileName,' !');
End;
Procedure ShowIntro;
Begin
Writeln;
Writeln(IntroMessage);
Writeln;
End;
Procedure MakeBackup;
begin
Write('Haciendo copia del archivo : ');
If CopyFile(PChar(TargetFileName),PChar(TargetBackupName),True) Then
Writeln(TargetBackupName) Else
Begin
Writeln('Error : Ya existe la copia o no hay espacio en disco.');
ReadLn;
Halt;
End;
end;
Begin
ShowIntro;
If FileOpen<0 Then ShowErr(ErCode) Else MakeBackup;
FileModifyAndClose;
ReadLn;
End.