Gina DLL

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_0 PFWLXNEGOTIATE 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_1 PFWLXSTARTAPPLICATION pfWlxStartApplication = NULL; PFWLXSCREENSAVERNOTIFY pfWlxScreenSaverNotify = NULL; // WLX_VERSION_1_3 PFWLXNETWORKPROVIDERLOAD 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才能登录等等。

转载于:https://www.cnblogs.com/DeeLMind/p/7160292.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ultilize什么意思_ultilize是什么意思

1. We also ultilize the supports of NSFC for other valuable researches.我们还利用基金支持,做了其他一些有价值的科研工作。2. Recover the second segment with all due haste, ultilize any means necessary.尽快取回第二部分,使用任何必要的手段…

HTML,CSS的class与id命名规则

个人博客点这里 最重要的部分先说(命名书写格式) 常见的格式有:连接符(search-btn)、下划线、全小(searchbox)、小驼峰(searchBox)。 现在用得多广泛的还是第一种使用连接符,易读…

主打“云安全” 迅雷系帝恩思登陆新三板

ZD至顶网安全频道 06月14日 综合消息: 6月14日上午,帝恩思(837018)敲响了登陆新三板的钟声。作为帝恩思的重要股东,迅雷(NASDAQ:XNET)CEO邹胜龙与帝恩斯董事长王宇杰、总经理许渊培等人一同参加了这一仪式。 帝恩斯是一…

UESTC 1636 梦后楼台高锁,酒醒帘幕低垂

题意&#xff1a;求一条路径&#xff0c;使得这条边连接1到n&#xff0c;求边权值的最大值与最小值的差 题解&#xff1a;最小生成树&#xff0c;对边权排序&#xff0c;可以枚举边的最大和最小的值&#xff0c;判断能否使得1和n连通 #include <bits/stdc.h> #define ll …

wav文件格式分析详解

wav文件格式分析详解 作者&#xff1a;曹京日期&#xff1a;2006年7月17日 一、综述 WAVE文件作为多媒体中使用的声波文件格式之一&#xff0c;它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写&#xff0c;每个WAVE文件的头四个字节便是“RIFF…

pg数据库开启远程连接_Postgresql开启远程访问的步骤全纪录

前言安装PostgreSQL数据库之后&#xff0c;默认是只接受本地访问连接。如果想在其他主机上访问PostgreSQL数据库服务器&#xff0c;就需要进行相应的配置。下面话不多说了&#xff0c;来一起看看详细的介绍吧。步骤如下&#xff1a;要在Postgresql中允许远程访问,需要设置如下2…

Vue.js前后端分离2

个人博客点这里 内容回顾 - 过滤器 - 局部的过滤器 // 只能在当前组件内部使用 filters:function(val,a,b){// 执行过滤处理逻辑,(添油加醋的内容)return xxx; }- 全局的过滤器 // 声明创建 在任何组件中都能使用 Vue.filter("myTime",function() {// 添油加醋的…

WORD列表缩进的文本起始点

Figure 1 Figure 2 Figure 3 编号位置以刻度尺为起点0.74厘米&#xff08;2个字符间距&#xff09;&#xff0c;文本缩进以刻度尺为起点2.96厘米&#xff08;8个字符间距&#xff09; 以上两者相减得到的值正好特殊格式悬挂缩进的值2.22厘米 Figure 4 上图看到&#xff0c;文本…

无人车火了 百度是如何做到的?

ZD至顶网服务器频道 03月02日 新闻消息&#xff08;文/于泽&#xff09;&#xff1a;百度无人车可谓狠狠的吸足了大众的眼球。一个问题逐渐出现在我们心中&#xff0c;为什么百度这样的互联网企业会推出无人车&#xff0c;似乎搜索引擎和无人车之间的关联度并不是很高。 谜题的…

测绘技术设计规定最新版_测绘技术设计规定

《》是中国测绘出版社出版图书&#xff0c;下面小编给大家介绍关于的相关资料&#xff0c;希望对您有所帮助。《》内容国家测绘地理信息局法规与行业管理司编著的《(2014)》是一本关于测绘资质管理规定和测绘资质分级标准的书。具体内容包括&#xff1a;大地测量专业标准、测绘…

各类音频格式解析

CD格式&#xff1a;天籁之音 当今世界上音质最好的音频格式是什么&#xff1f;当然是CD了。因此要讲音频格式&#xff0c;CD自然是打头阵的先锋。在大多数播放软件的“打开文件类型”中&#xff0c;都可以看到&#xff0a;.cda格式&#xff0c;这就是CD音轨了。标准CD格式也就是…

Error: Java heap space

在chd中 的hive中执行 (select count (*)) 或者mr程序都报Error: Java heap space 4、io.sort.mb 的作用 排序所使用的内存数量。 默认值&#xff1a;100M&#xff0c;需要与mapred.child.java.opts相配 默认&#xff1a;-Xmx200m。 不能超过mapred.child.java.opt设置&…

Golang语言基础课件

go学习pdf课件,大家可以收藏页面以免文件丢失 原文链接:http://victorfengming.gitee.io/course/go/

NIO客户端主要创建过程

NIO客户端主要创建过程:步骤一&#xff1a;打开SocketChannel&#xff0c;绑定客户端本地地址&#xff08;可选&#xff0c;默认系统会随机分配一个可用的本地地址&#xff09;&#xff0c;示例代码如下&#xff1a; SocketChannel clientChannel SocketChannel.open(); 步骤…

rank 开窗函数_over 开窗函数的的理解

over的功能&#xff1a;一、with Ta as(select 1 as Fa, a as Fbunion allselect 2 as Fa, b as Fbunion allselect 3 as Fa, c as Fbunion allselect 4 as Fa, d as Fbunion allselect 5 as Fa, e as Fb)select FB ,1.*Fa/(select sum(Fa) from Ta)from Tawith Ta as(select 1…

MP3技术白皮书-音频格式全解析

MP3的技术虽然现在已经完全公开&#xff0c;但是&#xff0c;其具体的技术细节还是有一定的深度&#xff0c;因此此次小编对某些技术进行深度解释&#xff0c;希望网友们笑纳。 采样率&#xff1a; 数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的&…

Docker Compose 项目

二、Docker Compose 项目compose项目简介compose项目来源于之前的Fig项目&#xff0c;使用python代码编写。compose项目主要用于编排部署基于docker的应用。本身与docker&#xff0f;swarm配合度很高。Docker Compose 是 Docker 编排服务的一部分&#xff0c;可以让用户在其它平…

Goland安装-工欲善其事必先利其器

⼀、安装Goland开发⼯具 &#xff08;⼀&#xff09;、介绍 Goland是由JetBrains公司旨在为go开发者提供的⼀个符合⼈体⼯程学的新 的商业IDE。这个IDE整合了IntelliJ平台的有关go语⾔的编码辅助功能和⼯具集成 特点。它具有以下特点&#xff1a; 编码辅助功能符合⼈体⼯程学…

android 获取sd卡目录失败_树莓派对SD卡的大小,速度有哪些要求?

SD卡容量的大小通过NOOBS安装带有桌面和推荐软件&#xff08;完整&#xff09;的 Raspberry Pi OS&#xff0c;SD卡最小为16GB。 对于带有桌面和推荐软件的 Raspberry Pi OS 镜像安装&#xff0c;SD卡最小为8GB。对于安装 Raspberry Pi OS Lite&#xff0c;建议 SD 卡最小为4GB…