一、原理   
GINA是WinLogon的可插入部件。Windows操作系统中Winlogon进程负责管理与登录和身份认证相关的安全性工作,包括处理用户的登录与注销、启动用户shell、输入口令、更改口令、锁定与解锁工作站等。Winlogon进程在系统初始化时,启动用户程序之前运行起来,以保证相关操作对其它进程不可见,避免其它进程取得登录敏感数据。启动过程中winlogon.exe会调用GINA,GINA(Graphical Identification and Authentication )是微软windows操作系统提供的安全登录认证和交互登录服务的组件,可为Winlogin提供用户身份识别和验证以及用户帐号和密码的反馈功能。我们在Windows登录过程中看到的欢迎屏幕和登录对话框就是GINA显示的。在系统中GINA是一个可以被替换的动态连接库。该动态连接库默认文件名为 msgina.dll,位于系统system32目录下,主要用以实现操作系统登录进程的验证和身份验证。为了支持更多的交互登录验证方式,GINA是可替换的,我们可以自己开发GINA 动态连接库以实现其它类型的身份验证方法,而且微软也提供了相关文档和例程。 
二、接口 
GINA作为一个图形化身份识别和验证的组件,充当系统交互式登录的入口.有些木马也利用GINA进行密码盗取。它们往往编写和系统GINA界面相同的 GINA,然后替换MSGINA.dll。最简单的GINA木马只需写一个接口和原始GINA一样的MSGINA.dll,需要实现的功能就是登录时将密码记录下来,其它所有函数的实现都是去调用原始MSGINA.dll内的同名函数。原始的GINA动态链接库会输出下列函数以供winlogon进程调用,因此在我们的GINA里要么自己实现这些函数,要么直接调用原始GINA DLL里的同名函数:
导出函数名                                       功能简介 
WlxActivateUserShell                         激活用户外壳程序 
WlxDisplayLockedNotice                         允许GINA DLL 显示锁定信息 
WlxDisplaySASNotice                         当没有用户登陆时,Winlogon调用此函数 
WlxDisplayStatusMessage                         Winlogon 用一个状态信息调用此函数进行显示 
WlxGetConsoleSwitchCredentials                Winlogon调用此函数读取当前登陆用户的信任信息,并透明地将它们传到目标会话 
WlxGetStatusMessage                         Winlogon 调用此函数获取当前状态信息 
WlxInitialize                                  针对指定的窗口位置进行GINA DLL初始化 
WlxIsLockOk        验证工作站正常锁定 
WlxIslogoffOk        验证注销正常 
WlxLoggedOnSAS        用户已登陆并且工作站没有被加锁,如果此时接收到SAS事件,则Winlogon 调用此函数 
WlxLoggedOutSAS        没有用户登陆,如果此时收到SAS事件,则Winlogon 调用此函数。(我们在这个函数中实现U盘开机锁的功能) 
WlxLogoff        请求注销操作时通知GINA DLL 
WlxNegotiate        表示当前的Winlogon版本是否能使用GINA DLL 
WlxNetworkProviderLoad        在加载网络服务提供程序收集了身份和认证信息后,Winlogon 调用此函数 
WlxRemoveStatusMessage        Winlogon 调用此函数告诉GINA DLL 停止显示状态信息 
WlxScreensaverNotify        允许GINA与屏幕保护操作交互 
WlxShutdown        在关闭之前Winlogon 调用此函数,允许GINA实现任何关闭任务 
WlxStartApplication        当系统需要在用户的上下文中启动应用程序时调用此函数 
WlxWkstaLockedSAS        当工作站被锁定,如果接收到一个SAS,则Winlogon 调用此函数
GINA除了要实现以上的函数功能外,也要调用Winlogon提供的一些函数,这些函数也具有相同的Wlx前缀,此处不再赘述。 
三、实现 
GINA函数通常的调用顺序如下:操作系统启动后,Winlogon会加载GINA并首先调用WlxNegotiate函数,该函数实现GINA和 Winlogon版本互相验证的功能。接着会调用WlxInitialize来做初始化操作。初始化完成后,在未有用户登录之前,Winlogon会调用 WlxDisplaySASNotice来显示登录提示,就是常见的"按Ctrl+Alt +Del键登录"的提示对话框。当用户按提示操作后,Winlogon会调用GINA中的下一个函数:WlxLoggedOutSAS。该函数具体实现对用户登录进行身份验证的功能。也是这次编程中主要需要修改的函数。接下来如果用户身份验证通过,GINA会向Winlogon返回一个标记句柄,以便 Winlogon为该用户配置专用登录会话和默认桌面。接着Winlogon会调用 WlxActivateUserShell,GINA会启动用户shell并返回给Winlogon。这时,用户就可以成功登录到系统中了。本程序主要是在WlxLoggedOutSAS函数中实现U盘的检测、U盘ID的获取和ID值比较等功能。为了不具体实现每一个GINA的导出函数,其余需要被 Winlogon调用的函数采均用直接调用原始GINA动态连接库中的函数的方法来实现,以保证我们的GINA动态链接库具有和原始GINA一样的功能,即使在WlxLoggedOutSAS函数中实现完我们添加的功能后,我们同样要调用原始GINA内的该同名函数,以便将数据正确返回Winlogon。主要代码如下:

导入原始的GINA动态链接库:hMsDll =LoadLibrary(L"msgina.dll");
获得原始DLL的导出函数地址指针,如:
if (hMsDll != NULL)
{
MyWlxNegotiate = (NEGOTIATE) GetProcAddress(hMsDll,"WlxNegotiate");
MyWlxInitialize=(INITIALIZE)GetProcAddress(hMsDll,"WlxInitialize");
... ...;
}
Winlogon需要调用的GINA函数以如下方式实现:
BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
{
return  theApp.MyWlxNegotiate(dwWinLogonVersion,pdwDllVersion);
}
U盘检测和ID读取比较等验证功能在上一期文章中已经交待清楚,这里就不再赘述。
整个软件实现的功能就是当用户开机登录系统时,弹出要求检测U盘锁的对话框,当用户将U盘插入后,我们编写的GINA会检测该U盘ID与所存ID是否一致,如果一致则跳到用户名密码输入的登陆页面,否则拒绝登录。程序在第一次使用时,会读取U盘ID并存到系统文件夹下,以便之后判断比较。U盘检测比较的实现逻辑与上一期所述完全一致。
四、安装
安装过程非常简单,先将生成好的GINA动态连接库拷入系统system32目录下,然后在注册表中添加如下信息:
键值: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows   NT\CurrentVersion\Winlogon
变量名 : GinaDLL
变量类型: [REG_SZ]
内容: "生成的GINA DLL文件的名称"
最后重启机器,U盘锁登录界面就会出现。当然,整个安装过程也可以编程自动实现。大家可以利用这个GINA程序
作为模板来随意改变系统的登录认证方式,有兴趣的朋友可以自己动手试试。

利用GINA实现U盘开机锁相关推荐

  1. 通过编写自定义的gina.dll实现U盘开机锁

    simples.c 编译为可执行程序simples.exe 下面的程序编译为ginafuncs.dll并用它替换c:\windows\system32下的msgina.dll 开机时ginafuncs ...

  2. VC++实现U盘开机锁

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 请见代码 ...

  3. 如何通过Win10系统的密码重置盘来重置电脑开机锁屏密码?

    我们在使用电脑时总会设置一下开机/锁屏密码来防止个人隐私泄露,这个密码其实就是用户帐户密码.如果我们哪天突然忘记了这个登录密码就麻烦了,所以我们要未雨绸缪. 所幸Win10系统就提供了这样的功能,可以 ...

  4. vivo S16/S15/S12/S10 PRO卡刷线刷系统升级降级推荐成功解决屏幕锁不记得开机锁成功刷好的有效方案

    vivo S16/S15 PRO,vivo S12/S10 PRO怎么解锁呢.忘记密码了看了一些刷机解锁视频不拆机能解锁的方法修改密码清除锁定升级更新降版本固件系统资料原方包刷机教程太卡怎么降级到原来 ...

  5. 服务器u盘安装系统读条蓝屏,利用U极速u盘启动盘装win7系统后出现蓝屏现象原因及解决办法...

    U极速u盘装win7系统蓝屏怎么办?近日,小编为大家带来了多篇利用U极速u盘启动盘装系统的教程,其中就有U极速u盘装win7系统教程,使用U极速U盘启动盘装机方法来进行电脑系统的安装,相信很多小伙伴都 ...

  6. 重装系统:全网最详细的重装windows10系统(纯净版)方法:利用微软官方U盘制作工具,制作系统启动U盘并重装系统

    全网最详细的重装windows10系统[纯净版]方法:利用微软官方U盘制作工具,制作系统启动U盘并重装系统 前提声明: 一·写这篇教程原因: 二·那么如何制作系统启动U盘? 第一步: 第二步:在一台能 ...

  7. android锁屏流程_Android开机锁屏流程分析

    Android开机锁屏流程: 首先:手机开机时,在SystemServer类的init2()方法中会启动线程类ServerThread的run方法如下: WindowMan Android开机锁屏流程 ...

  8. linux下用u盘安装xp系统安装教程,利用Ubuntu启动U盘安装DOS和WindowsXP

    没有光驱和软驱,利用Ubuntu启动U盘安装DOS和WindowsXP. 如果有一台电脑,没有光驱和软驱,或者有光驱但是没有安装光盘,又或者光驱坏了,当WindowsXP系统出故障了,甚至不能启动了, ...

  9. Android系统永不熄屏和取消开机锁屏功能

    Android系统取消开机锁屏功能和永不熄屏 源码 frameworks/base/packages/SettingsProvider/src/com/android/providers/settin ...

最新文章

  1. python 字符串补齐
  2. 打包无法识别lombok
  3. 20211201 二范数的导数小于等于导数的二范数(导数存在情况下)
  4. 深入理解JVM类加载机制
  5. php修改数组元素,php数组特定元素修改方法
  6. wordpress插件feed count中文版
  7. 经典面试题(21):以下代码将输出的结果是什么?
  8. leetcode —— 654. 最大二叉树
  9. 【报告分享】华为:汽车大势所趋,赋能者到引领者.pdf(附下载链接)
  10. 第十八篇 JS传参数
  11. 苹果市值突破2万亿美元;华为推出PC版HMS“擎云生态”;Android11将强制应用使用内置相机 | 极客头条
  12. 使用Presto SQL一些常见问题总结
  13. vue项目通讯录_vue组件--通讯录
  14. react报错:Uncaught Error: Element type is invalid: expected a string (for built-in components) or a ..
  15. 自行车平衡java小游戏_自行车水上平衡赛
  16. 1个10年工程师的心路路程(二)
  17. 阿里获取银行卡信息接口
  18. php webmail,10个基于Ajax的PHP Webmail客户端
  19. 睿智的法杖v8.28ti
  20. 开源之夏 2022 开启,提交项目当导师

热门文章

  1. 鸿蒙系统有希望像ios一样流畅,华为鸿蒙系统或继承了“IOS系统”大量优点,流畅性不输对手!...
  2. win10改计算机名后开机有两个用户,win10系统取消开机密码后出现两个账户的解决方法...
  3. 随机森林模型构建--在凯斯西储(CWRU)数据上的简单测试(1)
  4. deeplinux 热点_deepin使用笔记,安装steam客户端
  5. html单选按钮for,HTML如何实现RadioButton单选按钮
  6. table 'mysql.proc' doesn't exist问题解决
  7. shell脚本基础.md
  8. android studio mac 连接手机,Mac上Android Studio调试Android手机
  9. vue2 使用 cesium 【第二篇-相机视角移动+添加模型】
  10. 实例讲解:拼团活动如何设计?