カーネル / VM Advent Calendar (2011年度) の参加記事です。
メインの内容はWindowsのDLLで遅延読み込みされるAPIを、Delay IATを書き換える方法でフックです。なんかぐぐっても見つからないので情報共有的な意味でも。
下記のような、Windowsのファイルマネージャーの検索バーみたいな半透明エディットボックスが欲しい!!

普通に、ウィンドウのガラス領域にエディットボックスをCreateWindowで作ってみたら、次のようになってしまって若干おかしい・・・・

いろいろぐぐってみたら、下記サイトに情報があった
http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx
情報のとおりにやってみたら、綺麗に描画できるようになった

しかし・・・

原因を調べると、次のようなことがわかった。

なので、良くあるWindowsのAPIフックを使い、再描画のタイミングを制御するためのコードを注入した。
自分は、http://ruffnex.oc.to/kenji/text/api_hook/ を参考にさせてもらった。

ただし、comctl32.dll からの DrawThemeBackground() APIの呼び出しは、dllの遅延インポート領域にかいてあるらしく、
直接フックはできないので、遅延インポート領域を初期化するのに使われるGetProcAddress() APIをフックして、そいつ経由で
コードを注入した

しかし、Windows Vista/7 はこの方法でいけたのだが、なぜかWindows8ではDrawThemeBackground() APIのフックに失敗する・・・・。

調べてみると、なんとDrawThemeBackground() APIを遅延インポートするのに、GetProcAddress() APIが使われていない・・・

誰だよ!勝手にアドレス書いたのは!!....orz

・・・ということで、こんどはきっちりメモリにはりついている、上図参照のqword ptr [__imp_DrawThemeBackground] を書き換えることにする。

なぜかネットにぜんぜん情報が無かったので、しょーがなくスタックオーバーフローの記事
http://stackoverflow.com/questions/3430718/thunk-table-in-import-address-tableとかそこにのってるリンク先とか色々見ながら自前で実装した
delay import address tableのベースアドレスをゲットできれば、あとは伝統的なIAT書き換えフックと要領は同じだった

これで実装してみたら、

トラックバックURL: http://www.lunaport.net/mt/mt-tb.cgi/35
コメントする