Windows开机登录认证与Gina DLL
来源:互联网 发布:崇州行知中学 编辑:程序博客网 时间:2024/05/19 23:55
Windows的开机密码认证模块一般是由Gina DLL完成的。在NT/2000中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。
1.Gina原理
WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供了接口,我们可以自己编写GINA DLL来代替MSGINA.DLL。
WinLogon初始化时会创建3个桌面:
(1) winlogon桌面:主要显示Windows 安全等界面,如你按下CTRL+ALT+DEL,登陆的界面等
(2) 应用程序桌面:我们平时见到的那个有我的电脑的界面
(3) 屏幕保护桌面:屏幕保护显示界面。
在默认情况下,GINA显示登陆对话框,用户输入用户名及密码 。所以要获得用户名和密码 ,则可以写一个新的GINA DLL,其中提供接口调用msgina.dll的函数WlxLoggedOutSAS。
2.Gina DLL导出函数
在NT/2000 中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。GINA DLL要输出下列函数(Winlogon会调用):
(1) WlxActivateUserShell:激活用户外壳程序。
(2) WlxDisplayLockedNotice:允许GINA DLL显示锁定信息。
(3) WlxDisplaySASNotice:当没有用户登陆时,Winlogon调用此函数。
(4) WlxDisplayStatusMessage:Winlogon用一个状态信息调用此函数进行显示。
(5) WlxGetStatusMessage:Winlogon 调用此函数获取当前状态信息。
(6) WlxInitialize:针对指定的窗口位置进行GINA DLL初始化。
(7) WlxIsLockOk:验证工作站正常锁定。
(8) WlxIslogoffOk:验证注销正常。
(9) WlxLoggedOnSAS:用户已登陆并且工作站没有被加锁,如果此时接收到SAS事件,则Winlogon 调用此函数。
(10) WlxLoggedOutSAS:没有用户登陆,如果此时收到SAS事件,则Winlogon调用此函数。
(11) WlxLogoff:请求注销操作时通知GINA DLL。
(12) WlxNegotiate:表示当前的Winlogon版本是否能使用GINA DLL。
(13) WlxNetworkProviderLoad:在加载网络服务提供程序收集了身份和认证信息后,Winlogon 调用此函数。
(14) WlxRemoveStatusMessage:Winlogon调用此函数告诉GINA DLL停止显示状态信息。
(15) WlxScreensaverNotify:允许GINA与屏幕保护操作交互。
(16) WlxShutdown:在关闭之前Winlogon 调用此函数,允许GINA实现任何关闭任务,例如从读卡器中退出智能卡。
(17) WlxStartApplication:当系统需要在用户的上下文中启动应用程序时调用此函数。
(18) WlxWkstaLockedSAS:当工作站被锁定,如果接收到一个SAS,则Winlogon调用此函数。
我们通过对上述的18个基本函数进行重写,来实现USB身份认证系统的Windows登录身份认证。
3. Gina DLL原型代码
// USBGina.cpp : 定义 DLL 应用程序的导出函数。//#include "stdafx.h"#define REALGINA_PATH TEXT("MSGINA.DLL")// Winlogon函数分配表PWLX_DISPATCH_VERSION_1_0 g_pWinlogon;// DLL地址HINSTANCE hDllInstance;// Winlogon的句柄HANDLE hGlobalWlx;// WLX_VERSION_1_0PFWLXNEGOTIATE pfWlxNegotiate;PFWLXINITIALIZE pfWlxInitialize;PFWLXDISPLAYSASNOTICE pfWlxDisplaySASNotice;PFWLXLOGGEDOUTSAS pfWlxLoggedOutSAS;PFWLXACTIVATEUSERSHELL pfWlxActivateUserShell;PFWLXLOGGEDONSAS pfWlxLoggedOnSAS;PFWLXDISPLAYLOCKEDNOTICE pfWlxDisplayLockedNotice;PFWLXWKSTALOCKEDSAS pfWlxWkstaLockedSAS;PFWLXISLOCKOK pfWlxIsLockOk;PFWLXISLOGOFFOK pfWlxIsLogoffOk;PFWLXLOGOFF pfWlxLogoff;PFWLXSHUTDOWN pfWlxShutdown;// WLX_VERSION_1_1PFWLXSTARTAPPLICATION pfWlxStartApplication = NULL;PFWLXSCREENSAVERNOTIFY pfWlxScreenSaverNotify = NULL;// WLX_VERSION_1_3PFWLXNETWORKPROVIDERLOAD pfWlxNetworkProviderLoad = NULL;PFWLXDISPLAYSTATUSMESSAGE pfWlxDisplayStatusMessage = NULL;PFWLXGETSTATUSMESSAGE pfWlxGetStatusMessage = NULL;PFWLXREMOVESTATUSMESSAGE pfWlxRemoveStatusMessage = NULL;// DLL应用程序入口点BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: hDllInstance = hModule; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;}// 系统初始化,在WlxNegotiate中被调用BOOL MyInitialize(HINSTANCE hDll, DWORD dwWlxVersion){ // 系统初始化,从msgina.dll中HOOK WLX_VERSION_1_0中的函数 pfWlxNegotiate = (PFWLXNEGOTIATE) GetProcAddress(hDll, "WlxNegotiate"); if (!pfWlxNegotiate) { return FALSE; } pfWlxInitialize = (PFWLXINITIALIZE) GetProcAddress(hDll, "WlxInitialize"); if (!pfWlxInitialize) { return FALSE; } pfWlxDisplaySASNotice = (PFWLXDISPLAYSASNOTICE) GetProcAddress(hDll, "WlxDisplaySASNotice"); if (!pfWlxDisplaySASNotice) { return FALSE; } pfWlxLoggedOutSAS = (PFWLXLOGGEDOUTSAS) GetProcAddress(hDll, "WlxLoggedOutSAS"); if (!pfWlxLoggedOutSAS) { return FALSE; } pfWlxActivateUserShell = (PFWLXACTIVATEUSERSHELL) GetProcAddress(hDll, "WlxActivateUserShell"); if (!pfWlxActivateUserShell) { return FALSE; } pfWlxLoggedOnSAS = (PFWLXLOGGEDONSAS) GetProcAddress(hDll, "WlxLoggedOnSAS"); if (!pfWlxLoggedOnSAS) { return FALSE; } pfWlxDisplayLockedNotice = (PFWLXDISPLAYLOCKEDNOTICE) GetProcAddress(hDll, "WlxDisplayLockedNotice"); if (!pfWlxDisplayLockedNotice) { return FALSE; } pfWlxIsLockOk = (PFWLXISLOCKOK) GetProcAddress(hDll, "WlxIsLockOk"); if (!pfWlxIsLockOk) { return FALSE; } pfWlxWkstaLockedSAS = (PFWLXWKSTALOCKEDSAS) GetProcAddress(hDll, "WlxWkstaLockedSAS"); if (!pfWlxWkstaLockedSAS) { return FALSE; } pfWlxIsLogoffOk = (PFWLXISLOGOFFOK) GetProcAddress(hDll, "WlxIsLogoffOk"); if (!pfWlxIsLogoffOk) { return FALSE; } pfWlxLogoff = (PFWLXLOGOFF) GetProcAddress(hDll, "WlxLogoff"); if (!pfWlxLogoff) { return FALSE; } pfWlxShutdown = (PFWLXSHUTDOWN) GetProcAddress(hDll, "WlxShutdown"); if (!pfWlxShutdown) { return FALSE; } // HOOK WLX_VERSION_1_1版本的新函数。 if (dwWlxVersion > WLX_VERSION_1_0) { pfWlxStartApplication = (PFWLXSTARTAPPLICATION) GetProcAddress(hDll, "WlxStartApplication"); if (!pfWlxStartApplication) { return FALSE; } pfWlxScreenSaverNotify = (PFWLXSCREENSAVERNOTIFY) GetProcAddress(hDll, "WlxScreenSaverNotify"); if (!pfWlxScreenSaverNotify) { return FALSE; } } // HOOK WLX_VERSION_1_3版本的新函数 if (dwWlxVersion > WLX_VERSION_1_2) { pfWlxNetworkProviderLoad = (PFWLXNETWORKPROVIDERLOAD) GetProcAddress(hDll, "WlxNetworkProviderLoad"); if (!pfWlxNetworkProviderLoad) { return FALSE; } pfWlxDisplayStatusMessage = (PFWLXDISPLAYSTATUSMESSAGE) GetProcAddress(hDll, "WlxDisplayStatusMessage"); if (!pfWlxDisplayStatusMessage) { return FALSE; } pfWlxGetStatusMessage = (PFWLXGETSTATUSMESSAGE) GetProcAddress(hDll, "WlxGetStatusMessage"); if (!pfWlxGetStatusMessage) { return FALSE; } pfWlxRemoveStatusMessage = (PFWLXREMOVESTATUSMESSAGE) GetProcAddress(hDll, "WlxRemoveStatusMessage"); if (!pfWlxRemoveStatusMessage) { return FALSE; } } // HOOK新版本的函数 // 所有的HOOK都成功 return TRUE;}BOOL WINAPI WlxNegotiate(DWORD dwWinlogonVersion, DWORD * pdwDllVersion){ HINSTANCE hDll = NULL; if (!(hDll = LoadLibrary(REALGINA_PATH))) { return FALSE; } if(MyInitialize(hDll, dwWinlogonVersion) == TRUE) { return pfWlxNegotiate(dwWinlogonVersion, pdwDllVersion); } return FALSE;}BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, HANDLE hWlx, PVOID pvReserved, PVOID pWinlogonFunctions, PVOID * pWlxContext){ g_pWinlogon = (PWLX_DISPATCH_VERSION_1_0) pWinlogonFunctions; hGlobalWlx = hWlx; return pfWlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, pWlxContext);}void WINAPI WlxDisplaySASNotice(PVOID pWlxContext){ pfWlxDisplaySASNotice(pWlxContext); g_pWinlogon->WlxDialogBoxParam(hGlobalWlx, hDllInstance, (LPTSTR) MAKEINTRESOURCE(IDD_LOGON_DLG), NULL, LogonDlgProc, 0);}int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, PVOID * pProfile){ // 用标准Windows的密码方式登录 return pfWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile);}BOOL WINAPI WlxActivateUserShell (PVOID pWlxContext, PWSTR pszDesktopName, PWSTR pszMprLogonScript, PVOID pEnvironment){ // 用标准Windows的密码方式登录,调用MSGINA.DLL中的函数 return pfWlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript, pEnvironment);}int WINAPI WlxLoggedOnSAS (PVOID pWlxContext, DWORD dwSasType, PVOID pReserved){ return pfWlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);}void WINAPI WlxDisplayLockedNotice(PVOID pWlxContext){ pfWlxDisplayLockedNotice(pWlxContext); wcscpy(account.strUsername, TEXT("")); wcscpy(account.strPassword, TEXT("")); account.bLogonStatus = FALSE; g_pWinlogon->WlxDialogBoxParam(hGlobalWlx, hDllInstance, (LPTSTR) MAKEINTRESOURCE(IDD_LOGON_DLG), NULL, LogonDlgProc, 0);}BOOL WINAPI WlxIsLockOk(PVOID pWlxContext){ return pfWlxIsLockOk(pWlxContext);}int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType){ return pfWlxWkstaLockedSAS(pWlxContext, dwSasType);}BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext){ return pfWlxIsLogoffOk(pWlxContext);}void WINAPI WlxLogoff(PVOID pWlxContext){ pfWlxLogoff(pWlxContext);}void WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType){ pfWlxShutdown(pWlxContext, ShutdownType);}// WLX_VERSION_1_1版BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL * pSecure){ return pfWlxScreenSaverNotify(pWlxContext, pSecure);}BOOL WINAPI WlxStartApplication(PVOID pWlxContext, PWSTR pszDesktopName, PVOID pEnvironment, PWSTR pszCmdLine){ return pfWlxStartApplication(pWlxContext, pszDesktopName, pEnvironment, pszCmdLine);}// WLX_VERSION_1_3版BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo){ return pfWlxNetworkProviderLoad(pWlxContext, pNprNotifyInfo);}BOOL WINAPI WlxDisplayStatusMessage (PVOID pWlxContext, HDESK hDesktop, DWORD dwOptions, PWSTR pTitle, PWSTR pMessage){ return pfWlxDisplayStatusMessage(pWlxContext, hDesktop, dwOptions, pTitle, pMessage);}BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext, DWORD * pdwOptions, PWSTR pMessage, DWORD dwBufferSize){ return pfWlxGetStatusMessage(pWlxContext, pdwOptions, pMessage, dwBufferSize);}BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext){ return pfWlxRemoveStatusMessage(pWlxContext);}
4. Gina DLL安装
(1) 添加注册表
(2) 键名:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\
(3) CurrentVersion\Winlogon\
(4) 变量名:GinaDLL
(5) 变量类型:[REG_SZ]
(6) 内容:Yourname.dll
(7) 将Gina DLL(Yourname.dll)拷贝到系统目录下(system32)。
(8) 重新启动计算机, Gina DLL(Yourname.dll)就会运行。
5. 结语
以上,Gina DLL就完成,重启之后就可以看到,尽管这个原型调用的是Windows的msgina.dll里面的函数,但是事实上所有的函数已经被我们Hook了,在调用系统函数之前必然会经过我们的函数。以下是与本主题相关信息:
(1)可以通过WlxLoggedOnSAS来屏蔽Windows操作系统下的Ctrl+Alt+Del。
(2)可以在WlxLoggedOutSAS中截获用户登录的用户名以及密码。
(3)通过此原型,可以实现一些个性化的开机认证,包括用指纹(例如ThinkPad笔记本电脑),以及特定的USB才能登录等等。
- Windows开机登录认证与Gina DLL
- Windows开机登录认证与Gina DLL
- Windows开机登录认证与Gina DLL
- 如何编写自己的Windows登录认证模块Gina
- 替换GINA DLL实现智能卡登录--DayDayUp
- 通过修改Gina.dll Windows指纹登录程序完成了-2
- 通过修改Gina.dll Windows指纹登录程序完成了-3
- 通过修改Gina.dll Windows指纹登录程序完成了-4
- windows 登录模块GINA开发参考
- Gina.DLL被破坏,无法调用winlogin登录界面
- 替换GINA.DLL实现自己的登录界面
- windows gina
- windows gina
- Winlogon登录和GINA
- 通过编写自定义的gina.dll实现U盘开机锁
- windows 登录认证函数
- Windows认证登录
- GINA.dll 各函数介绍
- sync/fsync/fdatasync的简单比较
- Bus System (Floyd最短路)
- 摄像头视频采集压缩及传输
- 项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website autom
- Transform img to 1/2
- Windows开机登录认证与Gina DLL
- 项目管理实践【六】自动同步数据库【Using Visual Studio with Source Control System to synchronize database automaticall
- linux笔记十( Linux 账号管理)
- rabbitmq 安装配置
- hive中间接实现不等值连接
- 几种编码格式——————————————————————待整理
- Python如何获得本程序的执行时间
- 移植uboot2010.12到飞凌6410
- Hadoop计算文件大小