12月4日
Xbox 360コントローラの有志ドライバとか
Windows 7発売でx64環境に移行した人が多いようで、「署名のないドライバ」とか「Xbox360 コントローラ 64bit」とかで飛んでくる方が多いようです
んー、自己責任だということと、出所不明の物をカーネルモードで起動することの危険性さえしっかり理解していれば、別に隠す必要もないかなぁってことで、手順明かし
まず、必要なもの、以下のいずれか
まぁ、お手軽なのはWindows SDKですかね
んで、いずれかを署名作業用のPCにインストール
署名作業用のPCは、Windows 7が動いているターゲットPCでもいいし、他のWindows XPなマシンでもOK
インストールが完了したら、Windows SDKもしくはWDKのコマンドプロンプトを管理者権限で開きます
別に全ての作業に管理者権限が必要なわけじゃないけど、まぁ、めんどうなのでね
Windows SDK v7.0の場合: スタートメニュー→すべてのプログラム→Microsoft Windows SDK v7.0→CMD Shell
DDK 7600.16385.0の場合: スタートメニュー→すべてのプログラム→Windows Driver Kits→WDK 7600.16385.0→Build Environments→Windows 7→x64 Free Build Environment
普通のコマンドプロンプトを管理者権限で開いてもいいけど、PATHの設定とかは自分でやってねってことで
Step 1 署名用の鍵を作成
鍵の作成には、以下のようなコマンドを実行します(これは別に管理者権限なくてもOK)
makecert -r -pe -ss my -n CN=<通常名> <公開鍵ファイル名>
<通常名>および<公開鍵ファイル名>は、各自適切なものに置き換えてください
なお、<公開鍵ファイル名>の拡張子は.cerにしておきましょう
続いて、鍵が作成されたことの確認と、将来のために鍵のエクスポートを行います
以下のコマンドを実行します
certmgr.msc
拡張子の違うcertmgr.exeというコマンドもある(後ほど出てきます)ので、きちんと拡張子まで入力しましょう
なお、certmgr.exeはSDKやDDKに付いてくるツールですが、certmgr.mscの方はOSに最初から入っているツールです
上の画像は、既に信頼されたルート証明機関や信頼された発行元にも登録してある状態なので、多少見栄えが違うと思いますが、個人のところにCNで指定した<通常名>の証明書ができていれば大丈夫
鍵ファイルのエクスポートは、証明書を右クリックしてコンテクストメニューを開き、すべてのタスク→エクスポートと選ぶと、証明書のエクスポート ウィザードが開くので、指示に従っていけばよいです
その際に注意することは、
- 秘密鍵をエクスポートする内容に含めること
- 証明書ストアにある個人証明書の秘密鍵はこれから使うので、エクスポート後に秘密鍵を削除しないこと
- 秘密鍵は名前の通り秘密なので、パスワードはしっかり厳重に
といったところでしょうか
エクスポートしてできた*.pfxファイルは、OSの再インストール等で個人証明書ストアがまっさらになった際に、新しい鍵を作り直すことなくインポートするのに使います
その際、証明書のエクスポート ウィザードで入力したパスワードが求められます
OS再インストール等の際に、鍵作り直して署名しなおすからいいやーって人は別に証明書をエクスポートする必要はないですが、*.cerと*.pfx、署名済みバイナリがあればSDKとか入れなくてもテスト署名を有効化できるので、エクスポートしておいた方がいいかなぁって思う
Step 2 信頼されたルート証明機関と信頼された発行元に公開鍵を登録する
makecertで作成した*.cerファイルをダブルクリックして、証明書のインポートウィザードから「信頼されたルート証明機関」と「信頼された発行元」に登録してもよいですし、以下のようなコマンドラインでも登録できます
‘ [信頼されたルート証明機関]に登録
certmgr.exe -add <公開鍵ファイル名> -s -r localMachine root
’ [信頼された発行元]に登録
certmgr.exe -add <公開鍵ファイル名> -s -r localMachine trustedpublisher
この作業が終わったら、certmgr.mscで証明書の状態に問題がないことを確認しましょう
個人証明書をダブルクリックしてみて、信頼されてない云々が出ていなければ大丈夫です
Step 3 テスト署名されたドライバを有効にする
管理者権限で以下のコマンドを実行するだけです
bcdedit.exe /set TESTSIGNING ON
Step 4 ドライバモジュールに署名する
署名の方法は、カタログファイルを用意する方法と、ドライバモジュールそのものに署名してしまう方法がありますが、今回は後者を選びます
何でかというと、カタログファイルを用意するのが面倒だからです
カタログファイルを使用した署名を行う場合、inf2catというツールでカタログファイルが作成できますが、そのためには*.infファイルの内容をキッチリ用意しなければいけません
また、インストーラが用意されていて、自動的に署名のないドライバをインストールしてくれてしまうようなケースでは、カテゴリファイルの作成は*.infファイルを探すところから始まるため、更に面倒です
しかし、ドライバモジュールそのものへの署名であれば、署名すべきドライバモジュールさえ特定すればOKです
ドライバモジュールの特定は、デバイスマネージャからドライバの詳細を見れば概ね見当がつきます
ドライバの詳細で出てくるファイルのうち、Windows\system32\Driversにある*.sysファイルに署名しておけばだいたいOK?
で、実際に署名する際のコマンドラインですが、個人証明書ストアに秘密鍵がある場合は、以下のようになります
signtool sign -v -s my -n <通常名> <署名対象モジュールのパス>
秘密鍵をエクスポートした*.pfxファイルを使って署名する場合は、以下のようになります
signtool sign -v -f <*.pfxファイルのパス> -p <エクスポート時に入力したパスワード> <署名対象モジュールのパス>
ちなみに、Xbox360 ワイヤレスコントローラーレシーバーの有志ドライバの場合、署名すべきモジュールは以下の通りです
%SYSTEMROOT%\System32\drivers\x360wchm.sys
署名前のドライバモジュールは、OSからロードが拒否されている状態なので、セーフモードに入ったりしなくても、管理者権限さえあれば署名できます
つまり、まずは強引に未署名のドライバをインストールしてしまい、再起動して署名、そして再度再起動すれば、OSに認識されるようになります
なお、signtool自体の実行には管理者権限は不要ですので、別の作業ディレクトリであらかじめ署名しておき、drivers下にアクセスする際のみに管理者権限で操作するというのが理想でしょう