用Vmware+Vista SDK進行Vista Credential Provider開發
By MikeFeng
1 前言
Vista出來也有一段時間了,用戶跟着微軟的潮流用新功能,搞程序的就得被微軟牽着鼻子做Vista的移植。最典型的例子就是QQ,2006標準版是不能在Vista上使用的,否則就等着點擊密碼框的時候藍屏吧。2007版大概改了鍵盤驅動的動態加載方法,現在可以用了。
跑題了,轉回來。大家可能知道在XP下屏蔽或者修改三指禮(ctrl+alt+delete)響應時間的方法,就是重寫XP提供的Gina函數。出於安全性的考慮,在Vista中Gina的功能被Credential Provider替代了。整個架構如下
我們要寫的東西實際上是一個COM組建,它由一個叫LogonUI的進程調用。說白了還是自己寫一系列回調函數,交由LogonUI去調用。
2 準備環境
打算在XP下開發的話用Vmware 5.5,在Vista下開發用Vmware 6.0
Windows Vista SDK,其中包括windbg
3 準備知識
3.3 COM組件開發的基本知識
1. 實現AddRef和Release:用於對於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繼續,配合查看變量的窗口,就可以進行調試了。具體命令請參照Windbg的Help。
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設計的,對於6000的RTM版仍然適用。
具體的例子在下面分析,這邊只說一下如果系統不穩定的情況下怎麼恢復。在文檔中介紹到,我們可以在啓動時按F8進入安全模式,在這個模式下一切其他的Credential Provider都不起作用,只有默認的Password認證模式。然後我們就可以通過例子附帶的unregister.reg或者手動更改註冊表Credential Provider相關內容進行恢復。如果萬一刪除了默認的3個CP,在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 2005的Tools | Options中設置好Vista SDK的include, libs, executables
2. 打開SampleCredentialProvider 項目,將項目名字改爲”MyCredentialProvider”
3. 確保Vista SDK 的include和lib目錄能被改項目使用(X:/Program Files/Microsoft SDKs/Windows/v6.0/Include和X:/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