• <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>
            流量統(tǒng)計(jì):
            Rixu Blog (日需博客)
            日需博客,每日必需來踩踩哦..
            posts - 108,comments - 54,trackbacks - 0

            Windows的開機(jī)密碼認(rèn)證模塊一般是由Gina DLL完成的。在NT/2000中交互式的登陸支持是由WinLogon調(diào)用GINA DLL實(shí)現(xiàn)的,GINA DLL提供了一個(gè)交互式的界面為用戶登陸提供認(rèn)證請(qǐng)求。

            1.Gina原理
            WinLogon會(huì)和GINA DLL進(jìn)行交互,缺省是MSGINA.DLL(在System32目錄下)。微軟同時(shí)也為我們提供了接口,我們可以自己編寫GINA DLL來代替MSGINA.DLL。

            WinLogon初始化時(shí)會(huì)創(chuàng)建3個(gè)桌面:
            (1) winlogon桌面:主要顯示W(wǎng)indows 安全等界面,如你按下CTRL+ALT+DEL,登陸的界面等
            (2) 應(yīng)用程序桌面:我們平時(shí)見到的那個(gè)有我的電腦的界面
            (3) 屏幕保護(hù)桌面:屏幕保護(hù)顯示界面。

            在默認(rèn)情況下,GINA顯示登陸對(duì)話框,用戶輸入用戶名及密碼 。所以要獲得用戶名和密碼 ,則可以寫一個(gè)新的GINA DLL,其中提供接口調(diào)用msgina.dll的函數(shù)WlxLoggedOutSAS。

            2.Gina DLL導(dǎo)出函數(shù)

            在NT/2000 中交互式的登陸支持是由WinLogon調(diào)用GINA DLL實(shí)現(xiàn)的,GINA DLL提供了一個(gè)交互式的界面為用戶登陸提供認(rèn)證請(qǐng)求。GINA DLL要輸出下列函數(shù)(Winlogon會(huì)調(diào)用):

            (1) WlxActivateUserShell:激活用戶外殼程序。
            (2) WlxDisplayLockedNotice:允許GINA DLL顯示鎖定信息。
            (3) WlxDisplaySASNotice:當(dāng)沒有用戶登陸時(shí),Winlogon調(diào)用此函數(shù)。
            (4) WlxDisplayStatusMessage:Winlogon用一個(gè)狀態(tài)信息調(diào)用此函數(shù)進(jìn)行顯示。
            (5) WlxGetStatusMessage:Winlogon 調(diào)用此函數(shù)獲取當(dāng)前狀態(tài)信息。
            (6) WlxInitialize:針對(duì)指定的窗口位置進(jìn)行GINA DLL初始化。
            (7) WlxIsLockOk:驗(yàn)證工作站正常鎖定。
            (8) WlxIslogoffOk:驗(yàn)證注銷正常。
            (9) WlxLoggedOnSAS:用戶已登陸并且工作站沒有被加鎖,如果此時(shí)接收到SAS事件,則Winlogon 調(diào)用此函數(shù)。
            (10) WlxLoggedOutSAS:沒有用戶登陸,如果此時(shí)收到SAS事件,則Winlogon調(diào)用此函數(shù)。
            (11) WlxLogoff:請(qǐng)求注銷操作時(shí)通知GINA DLL。
            (12) WlxNegotiate:表示當(dāng)前的Winlogon版本是否能使用GINA DLL。
            (13) WlxNetworkProviderLoad:在加載網(wǎng)絡(luò)服務(wù)提供程序收集了身份和認(rèn)證信息后,Winlogon 調(diào)用此函數(shù)。
            (14) WlxRemoveStatusMessage:Winlogon調(diào)用此函數(shù)告訴GINA DLL停止顯示狀態(tài)信息。
            (15) WlxScreensaverNotify:允許GINA與屏幕保護(hù)操作交互。
            (16) WlxShutdown:在關(guān)閉之前Winlogon 調(diào)用此函數(shù),允許GINA實(shí)現(xiàn)任何關(guān)閉任務(wù),例如從讀卡器中退出智能卡。
            (17) WlxStartApplication:當(dāng)系統(tǒng)需要在用戶的上下文中啟動(dòng)應(yīng)用程序時(shí)調(diào)用此函數(shù)。
            (18) WlxWkstaLockedSAS:當(dāng)工作站被鎖定,如果接收到一個(gè)SAS,則Winlogon調(diào)用此函數(shù)。
            我們通過對(duì)上述的18個(gè)基本函數(shù)進(jìn)行重寫,來實(shí)現(xiàn)USB身份認(rèn)證系統(tǒng)的Windows登錄身份認(rèn)證。

            3. Gina DLL原型代碼

            // USBGina.cpp : 定義 DLL 應(yīng)用程序的導(dǎo)出函數(shù)。
            //
            #include "stdafx.h"
            #define REALGINA_PATH TEXT("MSGINA.DLL")
            // Winlogon函數(shù)分配表
            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應(yīng)用程序入口點(diǎn)
            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;
            }
            // 系統(tǒng)初始化,在WlxNegotiate中被調(diào)用
            BOOL MyInitialize(HINSTANCE hDll, DWORD dwWlxVersion)
            {
            // 系統(tǒng)初始化,從msgina.dll中HOOK WLX_VERSION_1_0中的函數(shù)
            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版本的新函數(shù)。
            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版本的新函數(shù)
            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新版本的函數(shù)
            // 所有的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)
            {
            // 用標(biāo)準(zhǔn)Windows的密碼方式登錄
            return pfWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid,
            pdwOptions, phToken, pMprNotifyInfo, pProfile);
            }
            BOOL WINAPI WlxActivateUserShell (PVOID pWlxContext, PWSTR pszDesktopName,
            PWSTR pszMprLogonScript, PVOID pEnvironment)
            {
            // 用標(biāo)準(zhǔn)Windows的密碼方式登錄,調(diào)用MSGINA.DLL中的函數(shù)
            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) 添加注冊(cè)表
            (2) 鍵名:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\
            (3) CurrentVersion\Winlogon\
            (4) 變量名:GinaDLL
            (5) 變量類型:[REG_SZ]
            (6) 內(nèi)容:Yourname.dll
            (7) 將Gina DLL(Yourname.dll)拷貝到系統(tǒng)目錄下(system32)。
            (8) 重新啟動(dòng)計(jì)算機(jī), Gina DLL(Yourname.dll)就會(huì)運(yùn)行。

            5. 結(jié)語

            以上,Gina DLL就完成,重啟之后就可以看到,盡管這個(gè)原型調(diào)用的是Windows的msgina.dll里面的函數(shù),但是事實(shí)上所有的函數(shù)已經(jīng)被我們Hook了,在調(diào)用系統(tǒng)函數(shù)之前必然會(huì)經(jīng)過我們的函數(shù)。以下是與本主題相關(guān)信息:
            (1)可以通過WlxLoggedOnSAS來屏蔽Windows操作系統(tǒng)下的Ctrl+Alt+Del。
            (2)可以在WlxLoggedOutSAS中截獲用戶登錄的用戶名以及密碼。
            (3)通過此原型,可以實(shí)現(xiàn)一些個(gè)性化的開機(jī)認(rèn)證,包括用指紋(例如ThinkPad筆記本電腦),以及特定的USB才能登錄等等。

            Logo
            作者:Gezidan
            出處:http://www.rixu.net    
            本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
            posted on 2011-08-03 13:41 日需博客 閱讀(1338) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C C++Windows技術(shù)文章轉(zhuǎn)載
            伊人久久大香线蕉精品不卡| 99久久亚洲综合精品网站| 久久这里有精品视频| 久久精品亚洲男人的天堂| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 亚洲国产精品无码成人片久久 | 欧美一级久久久久久久大片| 久久亚洲日韩看片无码| 囯产极品美女高潮无套久久久| 成人综合伊人五月婷久久| 久久久WWW成人免费毛片| 亚洲欧美日韩久久精品第一区| 久久亚洲高清观看| 久久综合给久久狠狠97色| 久久WWW免费人成—看片| 久久精品水蜜桃av综合天堂| 久久综合成人网| 久久99精品久久久久久秒播 | 午夜精品久久久久久久无码| 精品久久一区二区三区| 东方aⅴ免费观看久久av | 丁香五月网久久综合| 久久精品中文字幕一区 | 国产精品毛片久久久久久久| 久久成人小视频| 欧美日韩久久中文字幕| 久久男人中文字幕资源站| 狠狠色伊人久久精品综合网 | 久久综合久久综合九色| 午夜天堂av天堂久久久| 99久久精品九九亚洲精品| 久久精品国产影库免费看| 成人免费网站久久久| 人人狠狠综合久久亚洲婷婷| 久久久久国产一级毛片高清版| 狠狠色丁香婷婷久久综合不卡| 麻豆精品久久久一区二区| 青青草国产成人久久91网| 久久成人国产精品一区二区| 久久亚洲中文字幕精品一区四 |