Contributor: ANTHONY GELAT { ANTHONY GELAT >>Is it the size of the EXE File? You can compress it With PKLite or >>LZEXE - it'll load into memory With full size, though. This just >Nope, it has self modifying data. PKLiting it wouldn't work. I have code For a self modifying EXE that claims to be PKLITEable, so i believe it can be done...here it is } Unit PCkSelfM; { Programmer: Jim Nicholson Purpose: Implement a method For creating "self-modifying" .EXE Files from TP which will survive the encoding techniques used by LZEXE and PKLite(tm). For discussion and examples, see SelfMod.Pas This Unit contains code placed into the public domain, With the following ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ provision: Please do not distribute modified versions of this code Without indicating such modification by commenting the File. if you have questions, comments, modifications, or suggestions, please feel free to contact us: PCkS Associates 138 Frances Place Hillside, NJ 07205 On CompuServe, EasyPlex to 70152,332 On Delphi CHICKENJN On GENie J.NICHOLSON1 } Interface Var ExeFileName : String[128]; Function ConfigBlockPresent(Size : Integer) : Boolean; Function NewConfigBlock(Var C_B; Size : Integer) : Boolean; Function ReadConfigBlock(Var C_B; Size : Integer) : Boolean; Function ConfigBlockReWrite(Var C_B; Size : Integer) : Boolean; Implementation Uses Dos; Const SelfModHeader : String[10] = 'PCkS SMODF'; CtrlZ : Char = ^Z; Var ExeFile : File; Buffer : String[10]; Function ConfigBlockPresent(Size : Integer) : Boolean; begin assign(ExeFile, ExeFileName); reset(ExeFile, 1); seek(ExeFile, FileSize(ExeFile) - (SizeOf(SelfModHeader) + Size + 1)); BlockRead(ExeFile, Buffer, SizeOf(SelfModHeader)); if Buffer = SelfModHeader then ConfigBlockPresent := True else ConfigBlockPresent := False; close(ExeFile); end; Function NewConfigBlock(Var C_B; Size : Integer) : Boolean; begin NewConfigBlock := False; if not ConfigBlockPresent(Size) then begin assign(ExeFile, ExeFileName); reset(ExeFile, 1); Seek(ExeFile, FileSize(ExeFile)); BlockWrite(ExeFile, SelfModHeader, SizeOf(SelfModHeader)); BlockWrite(ExeFile, C_B, Size); BlockWrite(ExeFile, CtrlZ, 1); close(ExeFile); NewConfigBlock := True; end; end; Function ReadConfigBlock(Var C_B; Size : Integer) : Boolean; begin ReadConfigBlock := False; if ConfigBlockPresent(Size) then begin assign(ExeFile, ExeFileName); reset(ExeFile, 1); seek(ExeFile, FileSize(ExeFile) - (Size + 1)); BlockRead(ExeFile, C_B, Size); close(ExeFile); ReadConfigBlock := True; end; end; Function ConfigBlockReWrite(Var C_B; Size : Integer) : Boolean; Var Temp : String; begin ConfigBlockReWrite := False; if ConfigBlockPresent(Size) then begin assign(ExeFile, ExeFileName); reset(ExeFile, 1); seek(ExeFile, FileSize(ExeFile) - (SizeOf(SelfModHeader) + Size + 1)); BlockWrite(ExeFile, SelfModHeader, SizeOf(SelfModHeader)); BlockWrite(ExeFile, C_B, Size); BlockWrite(ExeFile, CtrlZ, 1); close(ExeFile); ConfigBlockReWrite := True; end; end; begin ExeFileName := ParamStr(0); end. {--------------------------And SELFMOD.PAS, referenced above: } Program SelfMod; { This demonstrates a technique For creating self-modifying .EXE Files. It has an advantage over techniques which use Typed Constants, in that it will survive LZEXEC and PkLite(tm). Note that if the Program is run before LZEXEC is used to compress it, the compressed Program will not have been initialized. This is because LZEXEC strips off the config block (and everything else) at the end of the .EXE File. This problem does not occur With PKLite(tm). To run the demo, compile the Program and execute it twice. Whatever String you enter is written to the end of the .EXE File. To further demonstrate it's ablities, compress the File With PKLite(tm) or LZEXEC after compiling. Address all questions and comments to: PCkS Associates 138 Frances Place Hillside, NJ 07205 On CompuServe, EasyPlex to 70152,332 On Delphi CHICKENJN On GENie J.NICHOLSON1 } Uses PCkSelfM; Type ConfigBlock = String[40]; Var MyConfig : ConfigBlock; begin if ConfigBlockPresent(SizeOf(ConfigBlock)) then if ReadConfigBlock(MyConfig, SizeOf(ConfigBlock)) then begin Writeln('Old value of MyConfig: ',MyConfig); Write('Enter new value: '); readln(MyConfig); if ConfigBlockReWrite(MyConfig,SizeOf(ConfigBlock)) then Writeln('Rewrote the block.') else Writeln('ConfigBlockReWrite failed.'); end else Writeln('ReadConfigBlock failed') else begin Write('Enter inital value For MyConfig: '); readln(MyConfig); if NewConfigBlock(MyConfig, SizeOf(ConfigBlock)) then Writeln('Created new config block') else Writeln('NewConfigBlock failed.'); end; end.