Windowsで.(ピリオド) から始まるファイルをExplorer上で作れるようにするには

はじめに

Windowsでは、Explorerからでは .(ピリオド)から始まるファイル名をつけることができません。
(ただし、コマンドプロンプトからリネームをすると作成できます。)
今回の記事は、
Explorerからでも .(ピリオド)から始まるファイルを作成できるようにする方法
について書いてあります。

注意事項

システムファイルをいじります。試す場合は、自己責任でお願いします。
・PCが起動しなくなった!
・大事なデータが消えてしまった!
・頭がおかしくなった!

なんてことになっても、Dltnは一切の責任を負いません。


また、Windows利用規約著作権法などの法律に違反する可能性があるので、
実際に試す場合はその辺も踏まえて自己責任でお願いします。
その辺の機関から怒られたら、この記事はすぐ削除します。

対象

OSがWindowsXP Professional SP2の人向け。
それ以外の環境では試していないため、うまくいくかは分かりません。

必要なツール

OllyDbg のみ。バージョンは1.x。
フォントサイズを大きめに設定しておくと、見やすいです。
今回は、日本語化されている事を前提に説明しますので、日本語化していない方は適宜読み替えてください。

ファイルの書き換え

まず、OllyDbgで Shell32.dll を開きます。D&Dでもいいです。
すると、「LOADDLL.EXEを使用しますか?」みたいな事を聞かれるので、「はい」と答えます。
そうすると、なんかいろいろロードされます。


ウィンドウがいろいろあるかもしれませんが、落ち着いて「CPU」というウィンドウを探してください。


↑こんなの。


無事、上の写真のようなウィンドウが見つけられたら、


MOV EDI,EDI
PUSH EBP
MOV EBP,ESP
...


みたいなことがたくさん書かれてるところで、右クリックします。
すると、右クリックメニューが表示されます。
そしたら、メニューの中から


検索→ラベル名(現在のモジュール内)


を選びます。
すると、「ラベルネームshell32」という名前のウィンドウが表示されるはずです。



↑無事に表示されたでしょうか。


表示された方は、次のような項目を探してください。


SHLWAPI.PathRemoveBlanksW


見つけたら、その項目を選択して右クリックします。
すると、右クリックメニューが表示されるので、「参照を検索」を選びます。
うまくいった方は、下のような画像のウィンドウが表示されたと思います。



ここからちょっと難しくなります。
この参照データを、今度は1つ1つチェックしていく必要があります。
Dltnの環境では下から6番目でしたが、もしかすると他の環境では変わってくるかもしれません。


まず、参照データの項目をダブルクリックします。
すると、その参照データの付近の逆アセンブルコードが表示されます。
その際に、少し下に、「PathFindExtensionW」があれば、それが当たりです。
もし無かった方は、別の項目をどんどん試してみてください。



↑これが見つかればもう一息。


後は、「PathRemoveBlanksW」がCALLされている少ししたにある、
次のようなコードを見つけてください。



7D6B2E6E |. 33F6 XOR ESI,ESI
7D6B2E70 |. 66:39B5 F4FDFFFF CMP WORD PTR SS:[EBP-20C],SI
7D6B2E77 |. 0F84 33010000 JE shell32.7D6B2FB0
7D6B2E7D |. 66:83BD F4FDFFFF>CMP WORD PTR SS:[EBP-20C],2E
7D6B2E85 |. 0F84 00000000 JE shell32.7D6B2E8B


このコードでは、SS:[EBP-20C]には変更後のファイル名が入っています。
そのファイル名の先頭文字列がSI(これは直前にXORで0になっているので、NULL文字)だったり、
2E(これはピリオドの文字コード)だったりすると、それぞれの処理へ飛ばされてしまいます。
つまり、先頭文字列が2E(ピリオド)でも飛ばないようにすればいいわけです。


具体的な手順として、まずは2Eと比較した後のJE命令を選択し、右クリックします。
右クリックメニューが表示されるので、バイナリ→編集を選びます。
3バイト目から後を全部0にします。(これでジャンプ先が次の行になります。)
これで書き換えは完了です。後はファイルを保存します。
同様に右クリックしてメニューを出し、実行ファイルへコピー→全ての変更箇所を選びます。
すると、コピーしますか?的な事を聞かれるので、「全てコピー」を選びます。
新しいウィンドウがまたまた出てくるので、そこで右クリックしてメニューを出します。
メニューの中から「ファイル保存」を選んで、
適当にCドライブ直下などに場所に保存しましょう。


もしここで上書き保存してしまうと、WindowsXPの機能により、勝手に元のファイルに戻ります。
今までの作業が無駄になるので、上書きはしないでください。

ファイルの置き換え

ファイルの書き換えが完了したので、次は元のShell32.dllを、書き換えたShell32.dllに置き換えます。
とはいっても、普段はWindowsが使用している為、そのままでは置き換えられません。
そこで、WindowsXPのCDなどについている「回復コンソール」を使って、
コマンドプロンプトから書き換えます。


手順は至って簡単です。
まず、お手持ちのWindowsXPのCDをCD/DVDドライブに入れます。
そして、Windowsを再起動させると、勝手にCDを読み込んでくれると思います。
(読み込んでくれない場合は、BIOSの設定などからBootする優先順位を変更してください。)
後はメニューの指示に従って、回復コンソールを起動します。
うまく起動したら、適当にコマンドを打って置き換えてください。オリジナルのバックアップも忘れずに。


置き換えが完了したら、再起動してうまく作れるか試します。



↑こんな感じの表示になれば成功。

終わりに

Shell32.dllが.(ピリオド)で始まるファイルを作れないようにしているのは、
拡張子の問題だと個人的に考えていますが、調べてみたりしていないので真意は分かりません。
なので、もしかすると何か重大なセキュリティホールとかになる可能性もあるかもしれません。


この改造を行ったのはだいぶ前なので、微妙にうろ覚えですが、
今回はアプローチとして



ExplorerをOllyDbgでロード、実行

.をつけたファイル名をつけて、メッセージボックスを表示させる

一時停止、ユーザコードまで実行でメッセージボックスの場所を特定

そこからRETNで辿っていって、分岐を調査


みたいな感じで分岐を特定しました。
何かの参考になれば幸いです。