Sleipnir 2.9.4 において特定サイトのソースが表示できない不具合の原因を究明しようとしてみた

友人から、

http://ow.ly/url/shorten-url
このページ、Sleipnir 2.9.4 でソースが表示できない!なんで!気になる!

と言われて、気になって気になって夜も眠れなかったので、調べてみた。
普段使っているブラウザは次のような感じで、Sleipnir以外はちゃんと見られた。


今回はリバースエンジニアリングによるバグの原因究明を行った。
んで、一アプローチとして流れを書いてみた、というわけ!

現象の詳細

  • 特定のサイトにおいて、右クリックメニューからのソース表示及びメニューバーから表示→ソースの表示を選んでも、ソースが表示されない現象が発生している。
  • 今回確認したのは、次の2つのサイトのみ。
  • ソースが表示できないサイトはなかなか見つからなかった。

原因究明のアプローチ

  1. 外部エディタを起動しているので、外部プログラムを起動するAPIを使っているはずである。
  2. 外部プログラムを起動するAPIは次の3つがぱっと考えられる。
    • ShellExecute
    • CreateProcess
    • WinExec
  3. SleipnirIEコンポーネント(?)を使っているので、Sleipnirの実行モジュールの他、ieframeみたいな名前のモジュール等の上記API呼び出しにもブレークポイントをしかけて、ソースが表示できるサイトでソース表示を行う。
  4. 今度はShellExecuteが定義されているモジュールに直接ブレークポイントを仕掛ける。
    • 成功。
  5. そこからソースが表示できるサイトとできないサイトでの相違を確かめるべく、リバーストレース。
  6. ここからしばらくは 気合 努力 根性
    • mshtml 637A031B ソースが表示されない場合はジャンプしている
    • mshtml 637807F6 失敗するとソースが開かない
  7. 結果、キャッシュファイルをCreateFileWする際に失敗していることが分かった。
  8. GetLastError及びFormatMessageからエラー内容を特定するために、まったく同じ呼び出し処理をC++で書く。
  9. どうやらファイルが存在していないらしい。
  10. そりゃ存在しないファイルは開けないわな、ということで原因箇所特定完了。

なぜサイトによって存在しないキャッシュファイル名になるのか

  1. IEのキャッシュファイルの命名規則について推測してみたところ、どうやらファイルの種類によって拡張子を決めているらしい。
  2. しかし、ファイルの種類が不明のサイトがある。(上記のソースが表示できないサイトも種類が不明である。)
  3. その際は、IEではキャッシュファイルの名前に拡張子をつけないようだが、Sleipnirからソースを表示しようとすると.htm或いはURLから拡張子をとってつける。
  4. 結果、そのようなファイルは存在せず、開けない。

結論

以下は、上記の解析結果からの推論である。

  • 今回のバグの原因
    • Sleipnirは種類が利用不可のドキュメントに対して、勝手に拡張子をつけるため、そのキャッシュファイルが見つからず、ソースを表示することができない。
  • 解決策
    • 種類が利用不可能のドキュメントに対して、勝手に拡張子をつけるのをやめて、或いはすでに拡張子がついているファイルについては拡張子を除去すればよい。

あくまで推論です。

まとめ