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

 

用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

              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可能也可以设置,不过我没试成功。截两张图上来,有兴趣的可以试试。

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

已标记关键词 清除标记
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管理平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页