用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