用Vmware+Vista SDK進行Vista Credential Provider開發 By MikeFeng

Vmware+Vista SDK進行Vista Credential Provider開發

By MikeFeng

1          前言

    Vista出來也有一段時間了,用戶跟着微軟的潮流用新功能,搞程序的就得被微軟牽着鼻子做Vista的移植。最典型的例子就是QQ2006標準版是不能在Vista上使用的,否則就等着點擊密碼框的時候藍屏吧。2007版大概改了鍵盤驅動的動態加載方法,現在可以用了。

  跑題了,轉回來。大家可能知道在XP下屏蔽或者修改三指禮(ctrl+alt+delete)響應時間的方法,就是重寫XP提供的Gina函數。出於安全性的考慮,在VistaGina的功能被Credential Provider替代了。整個架構如下

 

 

 

 

我們要寫的東西實際上是一個COM組建,它由一個叫LogonUI的進程調用。說白了還是自己寫一系列回調函數,交由LogonUI去調用。

 

 

2          準備環境

 

              打算在XP下開發的話用Vmware 5.5,在Vista下開發用Vmware 6.0

              Windows Vista SDK,其中包括windbg

              Vista任意版本

              Visual Studio 2005

              Microsoft網站上的Credential Provider文檔及實例

 

 

3          

 

3.3         COM組件開發的基本知識

1.      實現AddRefRelease:用於對於COM組建的引用計數

2.      實現QueryInterface:用於獲得COM指針

3.      實現CreateInstance:用於創建COM實例

4.      將編譯生成的COM DLL拷貝到系統system32目錄下

5.      爲生成的COM DLL編寫註冊表導入程序,以供其他程序調用

有以下注冊表路徑需要添加:

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/ Authentication/Credential Providers/{ GUID }

默認值爲該CP的名字

HKEY_CLASSES_ROOT/CLSID/{ GUID }

默認值爲該CP的名字

HKEY_CLASSES_ROOT/CLSID/{ GUID }/InprocServer32

“ThreadingModel"="Apartment

 

 

3.4         Windbg連虛擬機調試

 

可以參照著名的《藉助VMware實現單機使用WinDbg》(Jiurl著)。使用vmware+windbg開發Credential Provider的必要性是顯而易見的,因爲用VS 2005無法在用戶切換以及登錄的時候進行調試。當然,如果條件允許也可以兩條機器串口直連。這需要購買專用的連接線。

 

3.4.1        Vista調試模式的

Vista調試模式的設置方法和XP不同,需要通過命令行進行設置,我的設置代碼如下:

 

C:/>bcdedit /dbgsettings serial baudrate:115200 debugport:1

操作成功完成。

C:/>bcdedit /copy {current} /d DebugEntry

已將該項成功複製到 {f7d91743-cdd2-11da-9a96-000c29641053}

C:/>bcdedit /displayorder {current} {f7d91743-cdd2-11da-9a96-000c29641053}

操作成功完成。

C:/>bcdedit /debug {f7d91743-cdd2-11da-9a96-000c29641053} ON

操作成功完成。

 

完成後可以使用bcdedit當前配置。順便提一下,國外有人專門開發了一個Vista啓動管理工具,叫Vista Boot Pro,配合msconfig可能也可以設置,不過我沒試成功。截兩張圖上來,有興趣的可以試試。

 

Vista Boot Pro

 

 

msconfig 1

 

 

msconfig 2

 

3.4.2        虛擬機的設置

在虛擬機中添加一個Serial Port,配置如下圖:

 

 

3.4.3        編輯Windbg快捷方式

使快捷方式中命令帶上-k com:port=//./pipe/com_1,baud=11520,pipe的參數

例如:

"D:/Program Files/Debugging Tools for Windows/windbg.exe" -k com:port=//./pipe/com_1,baud=11520,pipe

 

3.4.4        調試Credential Provider

 

連上Vista虛擬機後應該如何調試呢?首先在要調試的地方添加一個int 3中斷,可以是DLLMain函數,也可以是你想要調試的任意函數。關鍵是要確認這個函數一定會被執行到,不要弄在邏輯分支裏就行了。如下:

__asm int 3;

這樣在調試模式下就會觸發中斷,Windbg收到中斷之後就可以進行調試了。

 

然後在Windbg中設定符號鏈接路徑。File菜單->Symbol File Path中將要調試的Source編譯出來的pdb文件所在路徑添加進來,以便調試。打開要調試的Source,下斷點,F10單步,F8跟進,F5繼續,配合查看變量的窗口,就可以進行調試了。具體命令請參照WindbgHelp

 

 

3.5         Vista Credential Provider相關知識

Vista SDK的幫助文檔中,Win32 and COM Development | User Interface | Windows Shell | Shell Reference | Shell Interfaces | ICredentialProvider* 是一些會用到的COM類,如果在具體編程中不明白某個接口的作用可以在這裏查到。

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/ Authentication/Credential Providers/路徑下可以看到Vista默認有幾個CP,包括常用的Password認證方式。還有SmartCard認證方式等。

    每一種認證方式在COM組件裏都對應一個Provider,即證書提供者。這個Provider下面可以有多個Credential,即證書。除了這兩個概念之外,還有一個Filter,用來過濾不需要起作用的證書。如果我們自己寫Credential Provider COM組件,並且使用這個組件登錄,我們可以利用Filter功能來屏蔽其他Provider的功能。

    由於這個COM組件是一個DLL,因此它必須有導出函數提供給它的調用者LogonUI來進行初始化等工作。在微軟提供的例子中我們看到.def中有兩個導出函數

EXPORTS

    DllCanUnloadNow                                 PRIVATE

    DllGetClassObject                               PRIVATE

    似乎不需要特別的更改。

 

 

 

3.6         關於Microsoft Credential Provider的說明文檔

在微軟的例子中,附帶了一個CP的說明文檔。雖然這個是爲Vista 5384設計的,對於6000RTM版仍然適用。

具體的例子在下面分析,這邊只說一下如果系統不穩定的情況下怎麼恢復。在文檔中介紹到,我們可以在啓動時按F8進入安全模式,在這個模式下一切其他的Credential Provider都不起作用,只有默認的Password認證模式。然後我們就可以通過例子附帶的unregister.reg或者手動更改註冊表Credential Provider相關內容進行恢復。如果萬一刪除了默認的3CP,在HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Authentication/Credential Providers路徑中保證以下內容的存在即可。

Provider

Key

GenericProvider

{25CBB996-92ED-457e-B28C-4774084BD562}

PasswordProvider

{6f45dc1e-5384-457a-bc13-2cd81b0d28ed}

Smartcard Credential Provider

{8bf9a910-a8ff-457f-999f-a5ca10b4a885}

修改完畢之後重啓。注:如果不再需要system32目錄下的COM DLL,也可將其刪除。

 

 

3.7         創建自己的CP項目

 

    微軟的文檔上推薦從SampleCredentialProvider這個例子開始學習。下面是以SampleCredentialProvider爲藍本,VS 2005中建一個Credential Provider項目的過程。

1.      VS 2005Tools | Options中設置好Vista SDKinclude, libs, executables

2.      打開SampleCredentialProvider 項目,將項目名字改爲”MyCredentialProvider”

3.      確保Vista SDK includelib目錄能被改項目使用(X:/Program Files/Microsoft SDKs/Windows/v6.0/IncludeX:/Program Files/Microsoft SDKs/Windows/v6.0/lib)。這個可以在1中做,也可以在項目的屬性菜單中添加

4.      打開samplecredentialprovider.def,將”SAMPLECREDENTIALPROVIDER.DLL”改爲”MYCREDENTIALPROVIDER.DLL”並保存

5.      打開guid.h,將GUID改爲由Tool | Create GUID菜單生成的GUID

6.      更改Register.reg,替換GUID,並且將”sampleprovider”改爲”MyCredentialProvider,將”SmapleCredentialProvider.dll”改爲”MyCredentialProvider.dll”,保存Register.reg

7.      打開Unregister.reg,更改方法和6類似

8.      編譯並將MyCredentialProvider.dll拷貝至目標機器(我們這裏是vista虛擬機)的System32目錄

9.      Register.reg拷貝指目標機器,並且運行。

10.  在開始菜單中選擇Switch Users,畫面如下圖所示

 

11.  可以用Administrator登錄,Guest賬戶能否登錄取決於本機安全設置

12.  如果要恢復原來的登錄界面,請將Unregister.reg拷貝至目標機器並運行。

 

 

3.8         自動化COM DLL的部署:

如果你的編譯環境就在測試機上,那麼可以在Configuration Properties | Build Events | Post-Build Event中添加以下代碼

copy "$(OutDir)/$(ProjectName).dll" %systemroot%/system32 /Y

              Register.reg

轉載於:https://www.cnblogs.com/MaxWoods/archive/2011/09/09/2172350.html

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章