hoge diary - January 12, 2007

[雑記] Administrators グループのユーザであるフリをするには (2)

Administrators グループのユーザであるフリをするにはの続きです.

あるインストーラの実行ファイル(msiexec.exe ではなく,単独の実行ファイル)を OllyDbg で調べていると,Shell32.dll 内にある IsUserAnAdmin() という API の存在を発見しました.
SHELL32.IsUserAnAdmin

「あれ? こんな関数呼んでたっけ? さっき見たときは無かったはず...」とか思いつつ dumpbin で当該実行ファイルのインポートテーブルを見直すと,序数 680 の非公開 API でした.

非公開 API なのになんで MSDN に載ってるんだろう,などと思いつつ見ていると,どうやらユーザが Administrators グループのメンバであれば TRUE を返すだけの関数のようです.

これでフックすべき関数を何とか 1 個見つけられたのですが... これが非公開ということは,世の中にある数多くのインストーラの中には,この API を使ってないものもあるかも知れません.そうなると置き換える API も多くなるわけで... 考えただけでも背筋が凍りつく思いです.

面倒なのでとりあえず IsUserAnAdmin() だけを置き換えてみることにします.もちろん常に TRUE を返す関数に...

さて,Windows において,自作した関数を呼ばせるには,インストーラの実行ファイルに手を加えずにやろうとするならば,以下の方法があります.

  1. 置き換える DLL が持っている全ての関数をエクスポートした同名のラッパー DLL を作成し,EXE と同じディレクトリに置く.
  2. EXE のロード後にメモリ上にあるインポートテーブルを書き換える.

1. は,Windows のローダが,指定した関数だけを置き換えることができないために,仕方なく全ての関数を含む DLL を作成する,というものです.何もしないラッパー DLL を作るツールがあるので,これでラッパーの雛形を作ってから,置き換えたい関数の実装部分を変更すれば問題ないでしょう.

ただし,1. で作成したラッパー DLL を本来の DLL より先にロードするためには,実行ファイルと同じディレクトリに配置する必要があります.というのも,Windows が DLL の検索する順序が以下の通りであるためです.

  1. アプリケーションのあるディレクトリ
  2. カレントディレクトリ
  3. システムディレクトリ (通常は C:\Windows\system32)
  4. 16 ビットシステムディレクトリ (通常は C:\Windows\system)
  5. Windows ディレクトリ (通常は C:\Windows)
  6. 環境変数 PATH の指すディレクトリ

インストーラ自身が実行可能ファイルであれば,ラッパーを置くのは簡単なのですが,最近良く見かける Windows Installer の場合は C:\Windows\system32\msiexec.exe が実際のインストーラであるため,上記 1. のルールに則って,真っ先に C:\Windows\system32 にある Windows 本来の DLL がロードされてしまうことになります.

そこで今回は,自分自身のスキル向上のためもあって,ロード直後にインポートテーブルを書き換える手段を使ってみようかと思います.

インポートテーブルを書き換えるといっても,ここでは起動中の別プロセスのものを書き換えるわけではなく,あくまでロード直後に書き換えられればよいので,愛甲さんのローダー(Loader)とパッカー(Packer)とカスタムリソースの話にあるサンプルプログラムのように,まずは適当な実行ファイルに対し,CREATE_SUSPENDED を指定して CreateProcess() を実行し,割り当てられたメモリイメージを本来実行したいファイルのものに差し替えて(ついでにインポートテーブルも変更して),実行を開始すればよさそうです.

というわけで早速実装開始です.

話は変わりますが,このサンプルプログラムのソースコードを見ていると,これってまるで execve(2) システムコールの Windows 版なんじゃないかと思いました.

コメント

名前(何でも可):

テキスト(http:// を含む内容は投稿できません):

トラックバック

トラックバック URI: https://www.pakunet.jp/hoge/trackback/2007011201

トラックバックはありません.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Thu Nov 01 01:17:11 JST 2007