设为首页 收藏本站
查看: 1061|回复: 0

[经验分享] 用Vmware+Vista SDK进行Vista Credential Provider开发

[复制链接]

尚未签到

发表于 2015-4-6 08:24:10 | 显示全部楼层 |阅读模式
用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替代了。整个架构如下

DSC0000.jpg





我们要写的东西实际上是一个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.      实现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可能也可以设置,不过我没试成功。截两张图上来,有兴趣的可以试试。
DSC0001.jpg


Vista Boot Pro

DSC0002.jpg


msconfig 1

DSC0003.jpg


msconfig 2


3.4.2        虚拟机的设置
在虚拟机中添加一个Serial Port,配置如下图:

DSC0004.jpg

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,画面如下图所示

DSC0005.jpg


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-54211-1-1.html 上篇帖子: VMWARE workstation 9 收缩虚拟硬盘 下篇帖子: 在Ubuntu下安装VMware Tools的两种方式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表