Daily Archives: 2011年1月15日

UltraVNCの小技(5) — cad.exe の自作

UltraVNC で「Ctrl-Alt-Del」を可能にするための「cad.exe」ですが、残念ながらソースコードが付いていません(大人の事情で)。

「cad.exe」は簡単に自作する事が出来ます(動作環境にやや制約がでますが)。
これで、オープンソースになります。

《参考リンク》http://blogs.msdn.com/b/itasupport/archive/2009/09/16/sendsas-step-by-step.aspx

ここに出てくる SAS は「secure attention sequence 」の略で、デフォルトは「Ctrl-Alt-Del」キーの同時押しです。Windows 7(2008 R2も) では、SAS をシミュレートするための SendSAS という API と、これを実現する sas.dll を最初から内蔵しており、追加ソフトウェア無しで API を利用できます( この記事 を参照)。

自作の cad.exe のソースコードは、実質1行です。

// (my)cadexe.cpp

#include "stdafx.h"
#include <windows.h>

#include<sas.h>

int _tmain(int argc, _TCHAR* argv[])
{
SendSAS(false); // サービスから呼び出す場合は、false を渡す。
return 0;
}

更に、SendSAS API を適切に実行するためには、UAC に関して適切な設定でビルドした上に、出来たバイナリに対して署名をしなければなりません。

所謂「オレオレ証明書」を使ってお手軽に作る手順は、下記のようになります。

  1. ソリューションを用意し、上記のソースコードをビルドする準備を整えます。
  2. マニフェストの設定を行います。
    1. 「UACの実行レベル」を「requireAdministrator」に設定します。
    2. 「UACによるUI保護のバイパス」を「True」に設定します。
  3. ビルドし、EXEファイルを作成します。
  4. 「オレオレ証明書」ファイル(.cer)を作成します。Visual Studio コマンドプロンプトを起動し、下記を実行します。
     >makecert -r -pe -n "CN=Test Certificate - For SendSAS Use Only" -ss MY testcert.cer
  5. 「オレオレ証明書」ファイルを、開発用マシンにインストールします。
    >certmgr.exe -add testcert.cer -s -r localMachine root
    
  6. 実行ファイルに署名します
    >SignTool sign /v /s MY /n "Test Certificate - For SendSAS Use Only" /t http://timestamp.verisign.com/scripts/timestamp.dll "cad.exe"
    
  7. UltraVNC(サーバ)を実行するマシンの「信頼されたルート証明機関」証明書ストアにも、先ほど作成した「オレオレ証明書」をインストールします。
  8. 自作した cad.exe を、オリジナルのそれと入れ替えます。

「Ctrl-Alt-Del」を試しましょう。期待した動作になりましたでしょうか。 Continue reading

UltraVNCの小技(4) — cad.exe の導入

改造した UltraVNC を使っていて、一つ不便な事があります。
「Ctrl-Alt-Del」キーを押した時の動作はどうでしょうか(vncviewer上では「Send Ctrl+Alt+Del to host」ボタンを押した時の動作)。「Ctrl-alt-del require service, no permission」というダイアログが出て、受け付けてもらえないと思います。UltraVNC をサービスとして実行している時がそうです(正式版を使っている場合は、ログオンダイアログが表示されたり、画面が切り替わったりするでしょう)。
次は、この問題を解決します。

  1. 「cad.exe」(UltraVNC が利用する追加モジュール)を入手
      正式版のインストーラを使ってインストールする際に、「Download Vista addons files now」にチェックを入れればインストールされます。ライセンスは これ )。
      入手したら、UltraVNC の実行ファイルがあるフォルダに置きます。
  2. ファイルの配置場所の確認
      UltraVNC のファイル群が、Program Files 配下にあるか確認します。
      サービスから「あの」画面を呼ぶ為には、ファイル群は特権のあるフォルダ配下に置かなければなりません。
  3. グループポリシーの設定
      グループポリシーエディタを起動し、「コンピューターの構成」−「管理用テンプレート」−「Windows コンポーネント」−「Windows ログオンのオプション」を開きます。
      Vista/7 では、「ソフトウェアの Secure Attention Sequence を無効または有効にする」という項目があります。
      「状態」を「有効」に、「オプション」を「サービスとコンピューターの簡単操作アプリケーション」に設定します。

もう一度、「Ctrl-Alt-Del」キーを試しましょう。期待した動作になったのではないでしょうか。

Continue reading

UltraVNCの小技(3) — VNC Serverのビルド(1.0.8.2)

ここまで触れてませんでしたが、UltraVNC(のサーバ)をソースコードからビルドしてみます。

私が幾つかの点で躓いたので、そのメモです。
以下は、Windows 7(32bit版) 上で、VisualStudio 2008 の環境でビルドしています。

  1. ソースコードの取得
      UltraVNCのサイトからダウンロードします。
      一つ前の安定版である 1.0.8.2 を取得します。
      私は、最新バージョンの 1.0.9.5 は上手くビルドすることが出来ませんでした(必要なファイルが幾つか無いようです)。
      (バージョンの 1.0.9.5 のビルドは こちら を参照)

      http://www.uvnc.com/download/1082/
  2. ソリューションを開く
      ソースコードを解凍したら、VisualStudioより、winvnc¥winvnc.sln を開きます。
      いきなり、一部読み込めないプロジェクトがある旨のエラーが出ますが、無くても何とかなります。ソリューションを開いた後で削除してしまいましょう。

      また、デバッグに備えて、winvnc をスタートアッププロジェクトに指定しておきます。

  3. ビルド
      ソリューションのビルドを実行します。

      「ファイルが使用中で書き込めない」旨のエラーが発生した場合は、めげずに再度ビルドを実行します。
      何度かビルドを実行すれば、実行ファイル等が生成されるでしょう(競合の理由は謎です…)。

  4. デバッグ(の前に幾つか設定)
      ビルドが通せるようになっても、更に UAC 関連の設定が必要です(設定してないと「開始できません。アプリケーション構成が正しくないため、このアプリケーションの開始に失敗しました」エラーが出ます)。
      winvnc のプロパティページから「リンカ」−「マニフェスト ファイル」の設定を開きます。
      「UACの実行レベル」が「asInvoker」になっているので「requireAdministrator」に変更します。
      「winvnc.exe」の manifest ファイルと requestedExecutionLevel が一致しない旨の警告が出る場合は、これも「requireAdministrator」に変更します。

      ちなみに、私の環境では、「winvnc.exe.x64.manifest」が使われたりして、アーキテクチャが「AMD64」になってて更に怒られるので、ここらも「X86」に変更しました(プラットフォームは 「Win32」 になっているのに何故?)。尚、可能であれば、winvncリソース中の名前を「winvnc.exe.x86.manifest」に変更した上で、修正した方がよいでしょう。

      再度ビルドしたら、VisualStudio 上でデバッグできるようになっています。「デバッグ開始」しましょう。

    p.s. VNCViewer は、ビルドに関して引っ掛かる部分はありません。サクッとビルドできます。