ログイン前に任意のプログラムを実行する

CE概論という授業で、自分の好きなコンテンツについてプレゼンをするというのがあって、そこで所謂「ドングル」について話している人がいました

ドングルって話には聞くけど、実際はどういったもので、どういった原理で動いているのか知りたいなーって思ったので、それっぽいのを自作した話と、それを実現するためにログイン画面で任意のプログラムを実行させるための話を書きます

まず、今回作ったドングルもどきは「特定のUSBがWindowsに認識されている場合はログインし、認識されていない場合はログインできない」という感じです
流れ的には、「プログラムが起動→USBがあるか確認→ログイン」ですが、ここで問題となるのが、1つ目にログインする以前に任意のプログラムを起動させること、2つ目が特定のUSBをどうやって識別するのか、最後にどうやってログインするのか、です

まず、「特定のUSBをどうやって識別するのか」ですが、正直耐タンパ性とか良く分からなかったので、iSerialNumberというものが予め設定しておいた値と一致するかどうかで判断するようにしました
ここを参考にすればなんとかなると思います
USB機器の固有シリアル番号を取得しよう / USBViewビルド編 | fslashtの日記 | スラッシュドット・ジャパン

次に「どうやってログインするのか」ですが、単にユーザ名やパスワードをプログラム内やファイルに保存しておいて、そのデータをキー送信するだけでは全くセキュアではない気がします
折角ドングルを作るんだから、もっと「ぽい」感じでやりたいので、ログイン処理をバイパスすることにしました
このプログラムが非常に参考になります
http://www.st.rim.or.jp/~shio/tools/screen_unlock/

自分の環境で動かない(msv1_0.dllのバージョンが対応していない)場合はテキトーにmsv1_0.dll周りを解析して、再構築すれば大丈夫でしょう

これでログイン処理をバイパスすることが可能になります

最後に、「ログインする以前に任意のプログラムを起動させる」にはどうするかですが、これは幾つか方法があって、一番簡単なものは固定キー機能を利用することですが、これは如何せんスマートではないというか、ドングル刺した挙句shiftを5回押すとかかっこ悪いので、今回は別の方法、「AppInit_DLLs」を利用します

AppInit_DLLsというとウイルス関係を連想される方がいるかもしれませんが、今回は自作ドングルもどきですし、これで十分な気がするので…

「AppInit_DLLs は、システム上の各ユーザー モード プロセスに読み込む DLL のリストを自由に指定できるメカニズムです」
詳細はこちらをどうぞ
Windows 7 および Windows Server 2008 R2 における AppInit_DLLs

テキトーにDLLを書いて、DLL_PROCESS_ATTACHされたタイミングで任意のコードなり、プログラムを起動するようにすれば解決です


以上で組むことができるんですが、何ともビミョーな気がしないこともない…


完成したのはこんな感じ
http://てすと.arckty.org/dongle.webm



余計ドングルってなんだよって感じがしないこともないし…

もし実用するとしたらしっかり署名するなり、プログラムを書き換えられない機構を設けるとか色々と考えたほうが良さそうです…