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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值