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

相关文章

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

Python实现中文文本处理与分析程序的示例详解

《Python实现中文文本处理与分析程序的示例详解》在当今信息爆炸的时代,文本数据的处理与分析成为了数据科学领域的重要课题,本文将使用Python开发一款基于Python的中文文本处理与分析程序,希望... 目录一、程序概述二、主要功能解析2.1 文件操作2.2 基础分析2.3 高级分析2.4 可视化2.5

Java实现预览与打印功能详解

《Java实现预览与打印功能详解》在Java中,打印功能主要依赖java.awt.print包,该包提供了与打印相关的一些关键类,比如PrinterJob和PageFormat,它们构成... 目录Java 打印系统概述打印预览与设置使用 PageFormat 和 PrinterJob 类设置页面格式与纸张

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟