现在的位置: 首页 > 综合 > 正文

用Vmware+Vista SDK进行Vista Credential Provider开发

2011年10月23日 ⁄ 综合 ⁄ 共 2797字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.