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.pswp.cn/news/455189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455189.shtml
英文地址,請注明出處:http://en.pswp.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…