なんとか可能だと思います。
仕様上、EXEファイルの後ろにデータを追加しても問題なかったはずですので、そこに暗号化データを持たせれば良いと思います。
暗号化ツールをA.EXEとし、A.EXEが作り出す「自己復元型EXE」をB.EXEとします。
1)まずB.EXEを作ります(処理内容は4)です)。この時、B.EXEのサイズを確認しておきます。
2)A.EXEにB.EXEの内容を持たせます(バイナリリソースで良いでしょう)。
3)A.EXEはB.EXEをファイルとして出力した後、その後ろに暗号化したデータを追加出力します。B.EXEは [EXE本体]+[暗号化データ] という構造になります。
4)B.EXEは自分自身の本来のファイルサイズ以降に暗号化したデータがあることが分かっているので、そこからデータを読み込んで復元するように作っておきます。
問題になりそうなの部分を挙げてみますと、、、
VBだけでバイナリリソースが作れたかどうかですが、Visual Studioをお持ちならCDには入っていたと思います。どうしても無理なら、B.EXEの内容をPublicな配列として持っておくとか、エンコードして文字列として持っておく、といった荒技も可能です。B.EXEを別ファイルとして置いておけるなら最も簡単ですね。
B.EXEは自分自身のファイルサイズを固定値として知っておかないいけないので、コンパイル->サイズ確認->固定値修正->コンパイル の手順で試行錯誤が必要かもしれません。多分、最初は固定値にダミー値を持たせておいて、コンパイルしてサイズ確認後、固定値をその値に書き換えて再コンパイルすれば問題ない(サイズは変わらない)と思います。
パスワードをB.EXE毎に持たせるなら、暗号化データの前に固定サイズで出力しておけば良いと思います。例えば固定サイズを20バイトとするなら、暗号化データは「B.EXEのサイズ+21バイト」目から始まることになります。最初の2バイト程度をパスワード長として使えば可変サイズにも出来ますね。
最後に、もしかするとこれが最も重要かもしれませんが、「B.EXEはVBのランタイムを必要としないこと」が条件であれば、B.EXEを別のツールで作らないといけないので「VBだけでは無理」ということになります。Windows2000以降あたりだと最初からVBのランタイムが入っていたかもしれませんが…… 確認できませんでした。
長々とちょっとクドかったかもしれませんが、最後の1点を除いて無理な部分はないように思います。
ご回答ありがとうございます。私の開発環境は幸いVisulaStudioですので、バイナリファイルを扱えそうです。ただこれまでに私が一度もバイナリ化等をしたことがないため、これは大きな挑戦になりそうです。(バイナリとう文字をオンラインヘルプで見る度に読み飛ばしてきた。)ご提案いただいた方式でトライしてみようと思います。