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才能登录等等。

时间: 2024-10-10 04:38:51

Gina DLL的相关文章

Windows开机登录认证与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桌面:主要显示Wi

C#拦截系统消息

看到个软件蛮好玩的,叫做ULOGON,它可以让你只有插入了正确的U盘系统才能工作.其实我们也可以简单的用C#来实现这个功能,本文首先来讨论如何拦截系统的U盘插入消息.     以前写EFFECTIVEKEY软件的时候就要拦截系统键盘按键消息,但是那时是直接网上拉过来用了,没有仔细研究.今天期末考完了就好好分析下.     首先我们看下有哪几种拦截系统消息的方法: /**//*C#截取系统消息 */   //一.截取系统消息 //方法一: //添加监视消息 private void Form_Lo

Windows会话登录流程

Windows 结构图 Windows系统核心结构和组件 以上截图清晰的表现了Windows的主要结构,使我们对系统的构成有个大概的认识,下面介绍一下Windows会话登录大致流程: 1.内核模式的系统线程初始化Windows执行体和内核,最后阶段Smss(会话管理)进程. 2.Smss负责完成一系列操作,如打开额外页面文件,创建系统环境变量等,并将Csrss.exe(子系统进程)和Winlogon启动,Winlogon进程依次创建其他系统进程. 3.Smss的主线程负责监视Csrss和winl

深入解析Windows操作系统笔记——CH2系统结构

2.系统结构 本章主要介绍系统的总体结构,关键部件之间的交互,以及运行在什么环境. 2.系统结构... 1 2.1 需求和设计目标... 1 2.2 操作系统模型... 2 2.3 总体结构... 2 2.3.1 可移植性... 3 2.3.2 对称多处理... 3 2.3.3 可伸缩性()5 2.3.4 客户和服务器版本的区别... 5 2.3.5 版本检查... 5 2.4 关键的系统组件... 5 2.4.1 环境子系统和子系统dll6 2.4.1.1 Windows子系统... 7 2.

SYSTEM32 下的几乎所有文件的简单说明(原由无忧启动论坛老毛桃出)

SYSTEM32 下的几乎所有文件的简单说明(原由无忧启动论坛http://bbs.wuyou.com老毛桃出): clui.dll .....Security Descriptor Editor,没有它,注册表编缉器会无法运行 ACTIVEDS.DLL .....(ADs 路由层 DLL). 没有它, 打开事件查看器会出错 ADSLDPC.DLL ......ADs LDAP 提供程序 C DLL ADVAPI32.DLL .....(高级 Windows 32 基本 API)...这个 av

MT.EXE程序测试报告

MT.EXE是一个网络管理方面的软件,依照yy3的说法,也就是 “七拼八凑来的,纯粹是图个方便.”可是这个方便个真的是太方便了,有了这40K的一个程序,可以删除我们电脑里面多达几M的程序,让我们先来看看这个程序的真面目吧:D:\>mt.exe Usage: mt.exe <Opintion>Opintion : -filter ---Change TCP/IP filter to on/off status. -addport ---Add ports to the filter' al

Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决

前天PHP7.0.0正式版发布了,有一些比较好的改进,官方也说速度比php5.6快了两倍,性能上有了很大提升,并且也发布了从php5.x向php7迁移的问题,所以今后php网站迁移后能够大幅度的提升网站性能,所以为了尝鲜我也去php官网下载了7.0的版本,通过命令行进行独立的测试,下载zip包后解压出来,下载后进入目录,将php.ini-development改为php.ini其余的参数暂时不用修改,然后在当前目录下新建test.php,输入简单的代码: 1 <?php 2 echo "H

win7 64位系统 PB连接oracle数据库出现“oracle library oci.dll could not be loaded”问题的解决方法

今天与大家分享一个自己的学习笔记,希望能给遇到同样问题的人带来帮助. 不知道大家在win7 64位系统下用 PB连接oracle数据库时,是否遇到过“oracle library oci.dll could not be loaded”问题. 今天,在win7 64位系统下用 PB连接oracle数据库时,一直出现上述错误,在百度上找了很久,都没有找到一个完整的解决方案,咨询了很多人,(他们都说是我的PB和oracle没装好,但我装的时候没出现任何问题,一切都很顺利,而且PB和oracle都能正

c#解决dll调用的问题

在做一个c#中间程序时,调用第三方的dll安装路径"Program Files" 和"Program Files (x86)"的问题,经过一段时间的研究,找到了下面的解决方案: 思路: 1.配置dll的加载路径 2.监控dll 3.dll加载失败判断操作系统位数(x86.x64) 4.动态加载dll 解决方案: 1.在config中添加dll引用配置: <runtime> <assemblyBinding xmlns="urn:schem