Windows下实现USBkey桌面登录

2024-02-14 07:32

本文主要是介绍Windows下实现USBkey桌面登录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Gina程序使用描述

在系统启动时,Gina Dllwinlogon.exe装载。开发自定义的Gina Dll。必须实现并导出与winlogon.exe交互的18个标准函数接口,包括WlxNegotiateWlxInitializeWlxLoggedOnSAS等)。

WlxNegotiatewinlogon.exe调用的第一个接口函数,进行必要的版本判断;

WlxInitialize,主要完成winlogon.exe特定版本的函数分派表向Gina Dll的传递;

WlxLoggedOnSAS,当winlogon在登录成功状态下,接收到SAS事件,会调用该函数处理。对于不需处理的SAS事件则,直接返回WLX_SAS_ACTION_NONE即可。

Gina程序在注册表中的位置

Key Name: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Winlogon
Value Name: GinaDLL
Value Type: [REG_SZ]
Value: MyGina.dll

Gina所有的函数

函数

描述

WlxActivateUserShell

激活用户外壳程序

WlxDisplayLockedNotice

允许GINA DLL 显示锁定信息

WlxDisplaySASNotice

当没有用户登陆时,Winlogon调用此函数

WlxDisplayStatusMessage

Winlogon 用一个状态信息调用此函数进行显示

WlxGetStatusMessage

Winlogon 调用此函数获取当前状态信息

WlxInitialize

针对指定的窗口位置进行GINA DLL初始化

WlxIsLockOk

验证工作站正常锁定

WlxIslogoffOk

验证注销正常

WlxLoggedOnSAS

用户已登陆并且工作站没有被加锁,此时接收到SAS事件则调用此函数

WlxLoggedOutSAS

没有用户登陆,如果此时收到SAS事件,则Winlogon 调用此函数

WlxLogoff

请求注销操作时通知GINA DLL

WlxNegotiate

//Winlogon.exe调用的gina dll中的第一个函数

//使gina dll确认是否支持当前版本的Winlogon.exe

//传递给winlogon.exe需要那个版本的接口函数

WlxNetworkProviderLoad

在加载网络服务提供程序收集了身份和认证信息后,Winlogon 调用此函数

WlxRemoveStatusMessage

Winlogon 调用此函数告诉GINA DLL 停止显示状态信息

WlxScreensaverNotify

允许GINA与屏幕保护操作交互

WlxShutdown

在关闭之前Winlogon 调用此函数,允许GINA实现任何关闭任务,例如从读卡器中退出智能卡

WlxStartApplication

当系统需要在用户的上下文中启动应用程序时调用此函数

WlxWkstaLockedSAS

当工作站被锁定,如果接收到一个SAS,则Winlogon 调用此函数

//

//Winlogon.exe调用的gina dll中的第一个函数

//使gina dll确认是否支持当前版本的Winlogon.exe

//传递给winlogon.exe需要那个版本的接口函数

//

BOOL WINAPI WlxNegotiate(DWORD dwWinlogonVersion, DWORD *pdwDllVersion)

//

//函数目的: 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配表

//参数:

// lpWinsta : 工作台的名字

// hWlx] : Winlogon的句柄;gina程序可通过该句柄调用winlogon函数

// pvReserved] :

// pWinlogonFunctions : Winlogon提供的函数分发表, gina只需引用

// pWlxContext : 本工作台的GINA上下文地址,

//

BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, HANDLE hWlx, PVOID pvReserved, PVOID pWinlogonFunctions, PVOID *pWlxContext)

//

//用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程序

//

BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktop, PWSTR pszMprLogonScript, PVOID pEnvironment)

//

// 当系统处于锁定状态时,Winlogon.exe调用该函数

// 显示一些信息,如锁定者、锁定时间等

//

VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)

//

// 当没有任何用户登陆时,也可以理解为系统刚启动后的第一次登录

// 可以根据用户的动作模拟SAS事件的发送

//

VOID WINAPI WlxDisplaySASNotice(PVOID    pContext)

// 能否锁定工作台:true能锁,false不能锁

BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)

//能否注销:true能,false不能

BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)

//

//目的:系统登录后且没有被锁,WinLogon收到SAS消息;会调用该函数

//dwSasType: SAS消息[超时、key插入或移除、Ctrl_alt_del]

//返回值:

// ACTION_NONE:什么都不做直接返回正常桌面

// ACTION_LOCK_WKSTA : 锁定工作台等待下个SAS

// ACTION_LOGOFF : 用户注销

// ACTION_SHUTDOWN : 关闭计算机

// ACTION_SHUTDOWN_REBOOT : 重启计算机

// ACTION_SHUTDOWN_POWER_OFF : 用户退出、关闭计算机

// ACTION_PWD_CHANGED : 修改密码

// ACTION_TASKLIST : 调用任务列表

// ACTION_FORCE_LOGOFF : 强迫用户退出

//

int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)

//

// Winlogon.exe调用该函数,通知gina dll用户注销操作

// 允许gina dll做出相应的处理

//

VOID WINAPI WlxLogoff(PVOID pWlxContext)

//

// Winlogon.exe调用该函数,通知gina dll用户注销操作

//

VOID WINAPI WlxLogoff(PVOID pWlxContext)

//

//在系统关闭之前,Winlogon.exe调用该函数;允许gina dll处理一些系统关闭前的处理//

VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)

使用Key登录操作系统的流程

< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />

1 用户按下Ctrl+Alt+Del,激活Winlogon.exe程序

2 winlogon.exe检查注册表项;如果没有,默认为msgina.dll

3 winlogon.exe调用Gina

4 Gina检查用户的状态

5 如果用户是在未登录状态,弹出对话框让用户输入帐号口令

6 用户输入帐号口令

7 Gina传到LSA检查用户的帐号口令

8 LSASAM比较用户的帐号口令

9 如果匹配,返回用户的SID

10 Gina返回用户登录token

11 winlogon返回用户登录桌面

SAS消息介绍

WinlogonGINA 之间传递的SAS消息。GINA监听SAS消息,并通过WlxSasNotify方法通知Winlogon SAS消息,Winlogon收到SAS消息后,调用GINA相应的处理方法。(ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/secauthn/security/interaction_between_winlogon_and_gina.htm):

Workstation boot:

Winlogon calls the GINA's WlxNegotiate function to notify the GINA about the version of Winlogon in use.

Winlogon calls the GINA's WlxInitialize function to give the GINA the addresses of the support functions, a handle to Winlogon, and to obtain the context information for the GINA (to be used in all future calls to the GINA).

Winlogon is in the logged-out state.

No one is logged on:

(The GINA monitors devices for SAS events).

The GINA calls Winlogon's WlxSasNotify function when a SAS event has been received.

Winlogon calls the GINA's WlxLoggedOutSAS function, allowing the GINA to process a user's identification and authentication information.

When logon is successful, Winlogon is in the logged-on state.

Gina收到sas消息,gina程序调用winlogonWlxSasNotify函数winlogon在锁屏后会调用ginaWlxLoggedOutSAS函数,此时应出现密码框供输入。

The user is logged on:

(The GINA monitors devices for SAS events).

The GINA calls Winlogon's WlxSasNotify function when a SAS event has been received.

Winlogon calls the GINA's WlxLoggedOnSAS function, allowing the GINA to present options to the user who is currently logged on.

The user is logged on and wants to lock computer:

(The GINA monitors devices for SAS events). 用户在登录后希望锁计算机

The GINA calls the WlxSasNotify function.

Winlogon calls the GINA's WlxLoggedOnSAS function.

The GINA returns WLX_SAS_ACTION_LOCK_WKSTA.

Winlogon is in the workstation-locked state

用户在登录后,希望锁屏;gina程序调用WlxSasNotify通知winlogon程序,winlogon会调用ginaWlxLoggedOnSAS函数,如果gina程序返回WLX_SAS_ACTION_LOCK_WKSTA表示允许锁屏

The user is logged on; the workstation is locked; and the user wants to unlock computer:

(The GINA monitors devices for SAS events).

The GINA calls the WlxSasNotify function.

Winlogon calls the GINA's WlxWkstaLockedSAS function.

The GINA returns WLX_SAS_ACTION_UNLOCK_WKSTA.

用户在登录后且工作台被锁,用户需要解锁;gina调用winlogonWlxSasNotify函数,winlogon会调用ginaWlxWkstaLockedSAS函数,返回WLX_SAS_ACTION_UNLOCK_WKSTA表示要解锁。

The user is logged on, and the program calls the ExitWindowsEx function:

Winlogon calls the GINA's WlxLogoff function.

The user is logged on and wants to log off using SAS:

(The GINA monitors devices for SAS events).

The GINA calls the WlxSasNotify function.

Winlogon calls the GINA's WlxLoggedOnSAS function.

The GINA returns WLX_SAS_ACTION_LOGOFF.

Winlogon calls the GINA's WlxLogoff function.

The user is logged on and wants to log off and shut down using ExitWindowsEx:

Winlogon calls the GINA's WlxLogoff function.

Winlogon calls the GINA's WlxShutdown function.

The user is logged on and wants to log off and shut down using SAS:

(The GINA monitors devices for SAS events).

The GINA calls the WlxSasNotify function.

Winlogon calls the GINA's WlxLoggedOnSAS function.

The GINA returns WLX_SAS_ACTION_SHUTDOWN.

Winlogon calls the GINA's WlxLogoff function.

Winlogon calls the GINA's WlxShutdown function.

登录状态转化

2 域登录原理

3 实现USBkey证书登录

message=WM_DEVICECHANGE

lPar= (PDEV_BROADCAST_HDR)

USBkey插入事件

wPar=DBT_DEVICEARRIVAL

USBkey拔出事件

wPar=DBT_DEVICEREMOVECOMPLETE

RegisterDeviceNotification方法注册接收硬件的通知消息

实现流程

1 安装USBkey驱动,把USBkey的登录证书写入系统注册表

2 实现GINA,重写WlxLoggedOutSASWlxLoggedOnSAS等方法,GINA监听USBkey的插入或拔出事件。

USBkey插入时,判断当前状态是否log offlocked,通过WlxSasNotify方法通知WinlogonWLX_SAS_ACTION_LOGON消息

USBkey插入时,判断当前状态是否log offlocked,通过WlxSasNotify方法通知WinlogonWLX_SAS_ACTION_LOGON消息

3 安装GINA,修改注册表项MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDll

这篇关于Windows下实现USBkey桌面登录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的