(* file patcher                                        *
 * written in borland pascal 7.0                       *
 * has a filesize check and checks for original bytes  *
 * you are able to "undo" your patch !                 *
 * done by F. Mόcke in 1998                            *
 * f_muecke@gmx.de                                     *)


Var FileName:String[13];
Ver,Cracker:String;
T, TotalChanges:Integer;
BytePos:Array[1..1000] Of LongInt;
ShouldBe,IsGonnaBe:Array[1..1000] Of Byte;
F:File of Byte;
Size:longint;
C:Byte;
Dummy:Char;
Procedure SetArray;
Begin

FileName:='filename.exe';               (* filename to patch *)

Ver:='1.00B';                      (* version of cracked prog *)

Size:=654321;                      (* filesize in bytes *)

Patcher:='ichselbst';              (* your name *)

BytePos[1]:=131527; ShouldBe[1]:=116; IsGonnaBe[1]:=235;
BytePos[2]:=131528; ShouldBe[2]:=117; IsGonnaBe[2]:=235;

  (* Offset[n], OriginalByte[n], PatchedByte[n]; with n<1000  all in decimal values *)

TotalChanges:=2;           (* I think you can imagine ! *)

End;
Begin
SetArray;
writeln;
writeln(' ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΊ');
writeln(' Ί   E  V  O  L  U  T  i  O  N   CRACKZ  Ί');
writeln(' ΊΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ');
writeln(' ³  FiLE......: ',FileName);
writeln(' ³  VERSiON...: ',Ver);
writeln(' ³  SiZE......: ',Size,' bytes');
writeln(' ³  DONE.BY...: ',Patcher);
writeln(' ³');
WriteLn('   ώ Opening file');
Assign(F,FileName);
{$I-}
Reset(F);
{$I+}
If IOResult = 0 Then
Begin
WriteLn('   ώ Checking filezize');
if filesize(F) <> Size Then
Begin
WriteLn('   ώ ERROR: ',FileName ,' is the wrong size');halt(1);
end;
WriteLn('   ώ Patching ',TotalChanges,' bytes');
Seek (F, BytePos[1]);
Read (F, C);
If C=ShouldBe[1] Then
Begin
For T:=1 To TotalChanges Do
begin
Seek  (F, BytePos[T]);
Write (F, IsGonnaBe[T]);
end;
End Else
Begin
WriteLn('   ώ ',FileName,' has already been patched');
Write('     Undo patch [y,n]? ');
ReadLn(Dummy);
if Dummy='y' Then
Begin
For T:=1 To TotalChanges Do
begin
Seek  (F, BytePos[T]);
Write (F, ShouldBe[T]);
end;
End Else
Begin
WriteLn('   ώ ERROR: nothing to patch');
Halt(1);
End;
End;
Close(F);
WriteLn('   ώ Groovy! Patch successful!');
End
Else WriteLn('   ώ ERROR: could not open ',FileName);
End.
