Windows 3.1の使用者名と会社名は、USER.EXEに焼き込まれている。

たまたま書き換えたい機会があり、WIN.INIをいじっても直らんなと思ったら、まさかのUSER.EXEに直接焼き込まれていた話。
投稿日時:

みなさんWindowsをセットアップしたら最初にやることというのはいろいろあると思います。その中の一つが、winver.exeで表示されるユーザー名と組織名の書き換えではないでしょうか。

昔のWindowsはセットアップウィザード内でこれらの値を尋ねてくれましたが、最近のWindowsは何も聞かずにWindows ユーザーとかいう当たり障りのない値を設定してくれます。そこで、レジストリのHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersionにあるRegisteredOwnerRegisteredOrganizationを編集して、自分の名前にするわけですね。

で、先日たまたまWindows 3.1の使用者名を修正したい場面が出まして。え?このシチュエーション2025年にあるか?備忘録として残すほど未来にまたあり得るか?まあいいや。で、そのときのお話でございます。もうタイトルと概要欄でネタバレしてますけど。

WIN.INIを編集しても反映されない!

Windows 3.1というものには、レジストリがほぼありません。レジストリは「登録データベース」という名前で、ファイルタイプの関連付けにのみ使用されています、たぶん。システムの挙動に関する設定の大部分はINIファイルに書かれています。

で、その中でもC:\WINDOWS\WIN.INIというのがありまして、ここには末尾のあたりに以下のようなセクションがあります。

[MS User Info]
DefName=Izumi Otsuki
DefCompany=会社名不明

※氏名は置き換えています。

もう絶対ここだと思うじゃないですか。

書き換えて再起動しても1mmも反映されません。

意地になってC:ドライブをVS Codeで開いて氏名で検索しても見つかりません。なぜ。

発見に至るまでの道のり

今は2025年。当然Google検索してもぜんっぜんそれらしい情報にぶち当たりません。というかそもそも当時はみんな書籍かパソ通かで情報を入手していたので、インターネット上に書かれるチャンスがほぼなかったんですね。

行き詰まってCalude先生を質問攻めにしてみると、いろいろと間違った情報を回答してきたあげく、USER.EXEGDI.EXEの中に書き込まれているなどと言うではありませんか。さすがに嘘だろと思って別解(SETUP.INFだのSYSTEM.INIだの)を追ってみても、やはりどれも間違っているわけです。

そこでしぶしぶC:\WINDOWS\SYSTEMを見に行ってみると、なんと確かにUSER.EXEだけ他のシステムファイルとタイムスタンプが乖離しています。具体的には、周りにあるファイルはみんな1994年のタイムスタンプなのに、こいつだけが2018年のタイムスタンプ。うん。インストールした日付ですわこれ。

恐る恐るバイナリエディタで開いて、文字コードをSJISにして検索してみると、確かにセットアップ時に入力した氏名と会社名不明USER.EXEの中に焼き込まれていたのでした……。

うん。VS Codeはまぁそりゃバイナリの中のSJISは検索引っかからないですよね……。

記載位置の詳細と書き換え

というわけで、僕の持っているバージョンの場合は0x02B72Cから氏名が書き込まれていました。どうやら30バイト固定長のレコードのようで、氏名の後ろは半角スペース(0x20)で埋められていました。その後にレコード区切り(0x1E)があって、その後に会社名不明が、やはり同様に30バイト固定長半角スペース埋めで埋め込まれ、その直後にはテキスト終端(0x03)のマーカーがついていました。

氏名の前にもレコード区切りが付いているんですが、その前の部分の意味はよくわかりません。見た感じ、NULLの塊でその前のテキストリソースから離れて配置されているので使用者名の開始位置マーカーだと思うんですが、水平タブ(0x09)で始まり、BOULAMITEと書かれてから、レコード区切り、氏名……と続いています。BOULAMITEっていったい何?

一方、終端側はテキスト終端の直後から3.16という文字列を挟んで、バージョン情報ダイアログで会社名の下に罫線で区切ってから書かれるシリアル番号は、Windowsディスク #1に印刷されています。が続き、その直後からNULL埋めでした。

というわけで、30バイトに収まる値を該当箇所に上書きして、(新しい文字列が元の文字列より短いと生じる)元のバイト列のままになっているところは半角スペースで塗りつぶし……と処理して上書き保存してやると、無事バージョン情報ダイアログの表示内容が修正できたのでした。めでたしめでたし。

……うん、この情報使うことあるかな?備忘録に残すほどの価値あるかな……?