• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            流量統計:
            Rixu Blog (日需博客)
            日需博客,每日必需來踩踩哦..
            posts - 108,comments - 54,trackbacks - 0

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

            Logo
            作者:Gezidan
            出處:http://www.rixu.net    
            本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
            posted on 2011-08-03 13:41 日需博客 閱讀(1321) 評論(0)  編輯 收藏 引用 所屬分類: C C++Windows技術文章轉載
            亚洲欧美日韩精品久久亚洲区 | 中文字幕精品久久久久人妻| 99久久国产主播综合精品 | 久久九九久精品国产免费直播| 久久婷婷色综合一区二区| 久久久无码精品亚洲日韩按摩| 国内精品免费久久影院| 久久精品99久久香蕉国产色戒 | 久久天天躁狠狠躁夜夜躁2O2O| 久久久精品波多野结衣| 久久夜色精品国产噜噜噜亚洲AV | 久久久久一级精品亚洲国产成人综合AV区| 人人狠狠综合久久88成人| 亚洲国产成人久久综合碰碰动漫3d| 人人狠狠综合88综合久久| 大蕉久久伊人中文字幕| 一本色道久久88加勒比—综合| 亚洲综合久久夜AV | 国产精品青草久久久久福利99 | 久久久久久久久久久| 久久99精品国产| 99久久人妻无码精品系列蜜桃| 国产午夜福利精品久久2021| 狠狠色丁香久久婷婷综合图片 | 久久这里只有精品视频99| 久久精品国产亚洲AV无码偷窥| 久久伊人影视| 久久人人爽人人澡人人高潮AV| 国产精品久久一区二区三区| 久久99精品国产99久久6男男| 99精品国产99久久久久久97| 麻豆AV一区二区三区久久| 国产一区二区久久久| 99精品国产免费久久久久久下载 | 久久精品国产亚洲av影院| 国产免费久久精品99re丫y| 亚洲欧美另类日本久久国产真实乱对白 | 大美女久久久久久j久久| 色综合久久综合网观看| 久久免费视频一区| 久久亚洲AV无码西西人体|