Kanasan.JS JavaScript 第5版読書会#7に参加しました

 先日の日曜日、4月12日(日)に開催された「Kanasan.JS JavaScript 第5版読書会#7」に参加しました。

 今回の一番の収穫は「IETester」でしょうか。浅学ゆえ、このソフトウェアの存在を知りませんでした。こんな便利な物があったとは!

IETesterについて調べてみる

 IETesterの概要やインストール方法などは、豊富に情報があるので省くとして、気になる仕組みを簡単に調べてみました。果たしてどのようにして、複数バージョンのInternet Explorerの結果を表現するのか。

 まずは、インストール先のディレクトリを覗いてみました。デフォルトのままなので「C:\Program Files\Core Services\IETester」。

> dir /w
[.]                [..]               5hdoclc.dll        5HDOCVW.DLL
5ininet.dll        5ISPEX.DLL         5NETCPLC.DLL       5RLMON.DLL
5ROWSELC.DLL       5ROWSEUI.DLL       5SCRIPT.DLL        5SHTML.DLL
5SHTMLED.DLL       5SHTMLER.DLL       5XTMSFT.DLL        5XTRANS.DLL
6bscript.dll       6hdoclc.dll        6hdocvw.dll        6ininet.dll
6ispex.dll         6psp2res.dll       6rlmon.dll         6ROWSELC.DLL
6rowseui.dll       6script.dll        6shtml.dll         6shtmled.dll
6xtmsft.dll        6xtrans.dll        7bscript.dll       7eframe.dll
7eframe.dll.mui    7ertutil.dll       7eui.dll           7eui.dll.mui
7hdocvw.dll        7hlwapi.dll        7ininet.dll        7ininet.dll.mui
7netcpl.cpl.mui    7nseng.dll         7nseng.dll.mui     7ormaliz.dll
7rlmon.dll         7rlmon.dll.mui     7rowseui.dll       7script.dll
7shtml.dll         7shtml.dll.mui     7shtmled.dll       7shtmled.dll.mui
7shtmler.dll       7shtmler.dll.mui   7xtmsft.dll        7xtrans.dll
8bscript.dll       8eframe.dll        8ertutil.dll       8eui.dll
8eui.dll.mui       8hdocvw.dll        8hlwapi.dll        8ininet.dll
8ininet.dll.mui    8netcpl.cpl.mui    8rlmon.dll         8rlmon.dll.mui
8script.dll        8shtml.dll         8shtml.dll.mui     8shtmled.dll
8shtmler.dll       8shtmler.dll.mui   8srating.dll       8srating.dll.mui
8xtmsft.dll        8xtrans.dll        IETester.exe       [Languages]
Uninstall.exe

 ん?なんだか見た事があるようなファイル名・・・。

 次に、Internet Explorer 7(iexplore.exe)とIETester(IETester.exe)のそれぞれのプロセスにVisualStudio 2005のデバッガでアタッチし、ロードされているモジュールの一覧を取得。

 ・・・思った通り、IETesterに含まれているDLLファイル群は、IE関連のDLLファイル一式でした。例えば、Internet Explorer 7の場合、下記のような箇所にあるファイルが、1文字目をバージョン番号に変更されてIETesterに含まれています。(実際には英語版が含まれているので、ja-JPではありませんが)

7bscript.dll C:\WINDOWS\system32\vbscript.dll
7eframe.dll C:\WINDOWS\system32\ieframe.dll
7eframe.dll.mui C:\WINDOWS\system32\ieframe.dll.mui
7ertutil.dll C:\WINDOWS\system32\iertutil.dll
7eui.dll C:\WINDOWS\system32\ieui.dll
7eui.dll.mui C:\WINDOWS\system32\ja-JP\ieui.dll.mui
7hdocvw.dll C:\WINDOWS\system32\shdocvw.dll
7hlwapi.dll C:\WINDOWS\system32\shlwapi.dll
7ininet.dll C:\WINDOWS\system32\wininet.dll
7ininet.dll.mui C:\WINDOWS\system32\ja-JP\wininet.dll.mui
7netcpl.cpl.mui C:\WINDOWS\system32\ja-JP\inetcpl.cpl.mui
7nseng.dll C:\WINDOWS\system32\inseng.dll
7nseng.dll.mui C:\WINDOWS\system32\ja-JP\inseng.dll.mui
7ormaliz.dll C:\WINDOWS\system32\normaliz.dll
7rlmon.dll C:\WINDOWS\system32\urlmon.dll
7rlmon.dll.mui C:\WINDOWS\system32\ja-JP\urlmon.dll.mui
7rowseui.dll C:\WINDOWS\system32\browseui.dll
7script.dll C:\WINDOWS\system32\jscript.dll
7shtml.dll C:\WINDOWS\system32\mshtml.dll
7shtml.dll.mui C:\WINDOWS\system32\ja-JP\mshtml.dll.mui
7shtmled.dll C:\WINDOWS\system32\mshtmled.dll
7shtmled.dll.mui C:\WINDOWS\system32\ja-JP\mshtmled.dll.mui
7shtmler.dll C:\WINDOWS\system32\mshtmler.dll
7shtmler.dll.mui C:\WINDOWS\system32\ja-JP\mshtmler.dll.mui
7xtmsft.dll C:\WINDOWS\system32\dxtmsft.dll
7xtrans.dll C:\WINDOWS\system32\dxtrans.dll

 もちろん、ファイル名を変更すると正しくダイナミックリンクできなくなってしまうので、DLL内のインポートテーブルも書き換えられています。ちなみにリソースセクションのバージョン情報には、元ファイルのファイル名や著作権情報、ファイルバージョン番号がそのまま含まれているようです。これらはDependency Walkerで確認しました。

 けれども、ファイル名とインポートテーブルを書き換えるだけでは正しく動作するとは思えないので、他にも書き換えている箇所があるのかも知れません。

 ところで「shlwapi.dll」って再配布できないファイルですよね。しかも、バイナリの書き換えまで。これは明らかにライセンス違(以下略)