用Vmware+Vista SDK进行Vista Credential Provider开发 (一)

来源:互联网 发布:linux phpmyadmin配置 编辑:程序博客网 时间:2024/04/28 22:10

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

 

原创粉丝点击