Contributor: SWAG SUPPORT TEAM        

 > Your approach (as all similar ones I have seen so Far) has a major
 > drawback: you can't use PKLITE, TinYPROG, LZEXE afterwards to
 > squeeze them down in size, as the offsets of the Program change.
 > Has anyone come up With a another approach circumventing this?

Yes, you can store it at the end of the .EXE File ( after the
code ) With the following routine :

Function CodeLenOnDisk( FName : String ) : LongInt;
Var ImageInfo : Record
                  ExeID     : Array[ 0..1 ] of Char;
                  Remainder : Word;
                  Size : Word
    F        : File;
  Assign( F, FName );
  Reset( F, 1 );
  if Ioresult <> 0 then Exit;
  BlockRead( F, ImageInfo, Sizeof( ImageInfo ));
  if ImageInfo.ExeID <> 'MZ' then Exit;
  CodeLenOnDisk := LongInt( ImageInfo.size-1 )*512 + ImageInfo.Remainder;

With this one, you can determine the end of the code in your .EXE File,
and then Write other data there, Drawback : This Dosen't work in network
environments or With shared .EXE Files. I'd recommend an external passWord
File, and there storing a hash of the passWord.