window7 登陆机制 CredentialProvider

2024-09-07 15:08

本文主要是介绍window7 登陆机制 CredentialProvider,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面是我自己弄的一个例子,就是自定义window7登陆,

1.1 首先拦截了其余的登陆方式

这里写图片描述

1.2 简单的模拟智能卡登陆模式

这里写图片描述

1.3 模拟智能卡登陆失败,需要输入window登陆密码

才能进入
这里写图片描述

1.4 里面有俩个项目,看清楚了,下面是项目结构

这里写图片描述

1.5 关于自定义登陆的一些文章,有详细的介绍

http://baike.baidu.com/link?url=AIJWwcDTVUxlx0CTOPyQCu8UFxzRs-OeL5DI9DI2DQi8xAdBiOTLPrnelx1b1SYGMSToCfFCiklJbh3w0Y–o_
https://blog.leetsys.com/2012/01/02/capturing-windows-7-credentials-at-logon-using-custom-credential-provider/
https://kb.swivelsecure.com/wiki/index.php/Microsoft_Windows_Credential_Provider_Integration
https://github.com/LastSquirrelIT/MultiOneTimePassword-CredentialProvider

1.6项目下载 ,包括微软的五个例子

http://download.csdn.net/detail/li740207611/9497173
SSCredProvider__ 我的
Untitled Folder 微软的,里面有些我也修改了,没有原版得了

1.7使用 就是运行相应项目目录下面的 Register.reg

把登陆的dll 或者fileter 添加到注册表里面。然后把项目自带的或者生成的dll拷贝到
c/window/system32/ 目录下面
注意:这些是在32位的操作系统下面进行的,如果想兼容64位系统,首先需要使用vs生成属性平台改为64位,然后生成64位的dll,就可以了。如果是32位的dll是不行的。


细节

CSSCredential.h文件 控件的定义


CSSCredential.cpp文件

初始化

ISSUnknown_REF_IMPL(CSSCredential)CSSCredential::CSSCredential()
{SS_AUTO_FNC_TRACE;SSWACredProvAddRef();ISSUnknown_REF_INIT;m_cpus = CPUS_INVALID;m_dwCredUIFlags = 0;m_pCredentialProvider = NULL;m_pcpce = NULL;loginSuccess = 0;SS_AUTO_FNC_TRACE;int x = 0;for(x=0; x<_countof(m_pwszFieldStrings); x++){m_pwszFieldStrings[x] = NULL;::SHStrDupW(L"", &m_pwszFieldStrings[x]);}//在这里设置链接和登录的图标下面显示的字符::CoTaskMemFree(m_pwszFieldStrings[SSFI_LARGE_TEXT]);//设置显示的用户名::SHStrDupW(L"Logan", &m_pwszFieldStrings[SSFI_LARGE_TEXT]);::CoTaskMemFree(m_pwszFieldStrings[SSFI_COMMAND_LINK]);//设置显示的链接名字::SHStrDupW(L"your link", &m_pwszFieldStrings[SSFI_COMMAND_LINK]);::CoTaskMemFree(m_pwszFieldStrings[SSFI_SUBMIT_BUTTON]);//设置提交按钮显示::SHStrDupW(L"Submit", &m_pwszFieldStrings[SSFI_SUBMIT_BUTTON]);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

动态控件显示

STDMETHODIMP CSSCredential::SetSelected(BOOL *pbAutoLogon)
{SS_AUTO_FNC_TRACE;//在这里可以进行,登录界面图标的隐藏的切换,当点击登录或者Enter 键的时候if(loginSuccess == 1){//当window密码和pin码不一样的时候,就弹出密码框::MessageBox(::GetForegroundWindow(), TEXT("请在输入框输入Windows密码"), TEXT("Windows 密码错误"), MB_ICONQUESTION|MB_OK);//set SSFI_PASSWORD to visiablem_pcpce->SetFieldState(this,SSFI_PASSWORD,CPFS_DISPLAY_IN_SELECTED_TILE);/*设置提交按钮在密码框后面 SSFI_SUBMIT_BUTTON是提交按钮控件的id,后面的是密码的更详细的姐失控可以看msdn 都有解释*/m_pcpce->SetFieldSubmitButton(this, SSFI_SUBMIT_BUTTON, SSFI_PASSWORD);}*pbAutoLogon = FALSE;return S_OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

提交按钮控件

//修改提交按钮显示的位置,初始化的时候使用,动态显示需要在SetSelected 控制
STDMETHODIMP CSSCredential::GetSubmitButtonValue(DWORD index, DWORD *pdwAdjacentTo)
{SS_AUTO_FNC_TRACE;if(m_cpus == CPUS_CHANGE_PASSWORD){*pdwAdjacentTo = SSFI_NEWPASSWORD_CONFIRM;} else {//set submit keyboard follow the SSFI_PIN//::MessageBox(::GetForegroundWindow(), TEXT("pin"), TEXT("submit"), MB_ICONQUESTION|MB_YESNO);//设置提交按钮在哪个控件后面显示*pdwAdjacentTo = SSFI_PIN;}return S_OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

获取用户输入信息

CSSCredential::GetSerialization(CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr, CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs, PWSTR *ppwszOptionalStatusText, CREDENTIAL_PROVIDER_STATUS_ICON *pcpsi)
{SS_AUTO_FNC_TRACE;LPWSTR lpPasswordEncrypted = NULL;LPWSTR lpPasswordNewEncrypted = NULL;LPWSTR lpDomainUsername = NULL;BYTE *pRgb = NULL;DWORD cbRgb = 0;SS_LOG_V(LL_TRACE, _T("CredInfo : %s,%s"), m_pwszFieldStrings[SSFI_USERNAME], m_pwszFieldStrings[SSFI_PASSWORD]);//设置用户名 SSFI_USERNAME 是id ,在定义控件的地方看看都有SetStringValue(SSFI_USERNAME,L"logan");//下面是用户名 密码 还有pin码的获取PWSTR pin_psw = NULL;GetStringValue(SSFI_PIN, &pin_psw);::MessageBox(::GetForegroundWindow(), pin_psw, TEXT(" pin  "), MB_ICONQUESTION|MB_YESNO);CoTaskMemFree(pin_psw);loginSuccess = 1;//为了动态显示密码输入框 主要是为了测试PWSTR u_psw = NULL;GetStringValue(SSFI_USERNAME,&u_psw);::MessageBox(::GetForegroundWindow(), u_psw, TEXT(" usename"), MB_ICONQUESTION|MB_YESNO);CoTaskMemFree(u_psw);PWSTR psw = NULL;GetStringValue(SSFI_PASSWORD,&psw);::MessageBox(::GetForegroundWindow(), psw, TEXT(" password "), MB_ICONQUESTION|MB_YESNO);CoTaskMemFree(psw);//下面的是系统的,不用管}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

这篇关于window7 登陆机制 CredentialProvider的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145397

相关文章

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

Java中自旋锁与CAS机制的深层关系与区别

《Java中自旋锁与CAS机制的深层关系与区别》CAS算法即比较并替换,是一种实现并发编程时常用到的算法,Java并发包中的很多类都使用了CAS算法,:本文主要介绍Java中自旋锁与CAS机制深层... 目录1. 引言2. 比较并交换 (Compare-and-Swap, CAS) 核心原理2.1 CAS

Spring Boot 集成 mybatis核心机制

《SpringBoot集成mybatis核心机制》这篇文章给大家介绍SpringBoot集成mybatis核心机制,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值... 目录Spring Boot浅析1.依赖管理(Starter POMs)2.自动配置(AutoConfigu

Redis的安全机制详细介绍及配置方法

《Redis的安全机制详细介绍及配置方法》本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通... 目录1. 绑定 IP 地址2. 设置密码3. 保护模式4. 禁用危险命令5. 通过防火墙限制访问6.

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析