替換GINA.DLL實現自己的登錄界面

你可以通過編程替換掉微軟的MSGINA.DLL,用來實現自己的密碼登陸驗證功能,如圖,我就加入了兩個密碼驗證的功能。
一、原理
NT/2000 中交互式的登陸支持是由WinLogon調用GINA DLL實現的,GINA DLL提供了一個交互式的界面爲用戶登陸提供認證請求。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

二、程序實現
GINA DLL
要輸出下列函數(winlogon會調用)

(表一)GINA 函數一覽表

函數    描述
WlxActivateUserShell  
激活用戶外殼程序
WlxDisplayLockedNotice  
允許GINA DLL 顯示鎖定信息
WlxDisplaySASNotice    
當沒有用戶登陸時,Winlogon調用此函數
WlxDisplayStatusMessage   Winlogon
用一個狀態信息調用此函數進行顯示
WlxGetConsoleSwitchCredentials    Winlogon
調用此函數讀取當前登陸用戶的信任信息,並透明地將它們傳到目標會話
WlxGetStatusMessage    Winlogon
調用此函數獲取當前狀態信息
WlxInitialize    
針對指定的窗口位置進行GINA DLL初始化
WlxIsLockOk    
驗證工作站正常鎖定
WlxIslogoffOk    
驗證註銷正常
WlxLoggedOnSAS    
用戶已登陸並且工作站沒有被加鎖,如果此時接收到SAS事件,則Winlogon 調用此函數
WlxLoggedOutSAS    
沒有用戶登陸,如果此時收到SAS事件,則Winlogon 調用此函數, This indicates that a logon attempt should be made
WlxLogoff    
請求註銷操作時通知GINA DLL
WlxNegotiate    
表示當前的Winlogon版本是否能使用GINA DLL
WlxNetworkProviderLoad    
在加載網絡服務提供程序收集了身份和認證信息後,Winlogon 調用此函數
WlxRemoveStatusMessage    Winlogon
調用此函數告訴GINA DLL 停止顯示狀態信息
WlxScreensaverNotify    
允許GINA與屏幕保護操作交互
WlxShutdown    
在關閉之前Winlogon 調用此函數,允許GINA實現任何關閉任務,例如從讀卡器中退出智能卡
WlxStartApplication    
當系統需要在用戶的上下文中啓動應用程序時調用此函數
WlxWkstaLockedSAS  
當工作站被鎖定,如果接收到一個SAS,則Winlogon 調用此函數

爲了簡化編程,我們從MSGINA.DLL中動態獲取上述函數,在自定義的DLL(以下稱爲MyGina.DLL)中直接調用MSGINA.DLL的函數即可。現在我們要處理的就是WlxLoggedOutSAS函數:

view plainprint?

  1. int WINAPI WlxLoggedOutSAS(PVOID                pWlxContext,  
  2.          DWORD                dwSasType,  
  3.          PLUID                pAuthenticationId,  
  4.          PSID                 pLogonSid,  
  5.          PDWORD               pdwOptions,  
  6.          PHANDLE              phToken,  
  7.          PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,  
  8.          PVOID *              pProfile)  
  9. {  
  10. //=========================加入我的登陸=========================  
  11.     
  12.   
  13.   
  14.    Clogin login;  
  15.  if (login.DoModal()==IDCANCEL)  
  16.  {  
  17.    return WLX_SAS_ACTION_NONE;  
  18.  }  
  19.  if(login.bCLOSE==TRUE)  
  20.  {  
  21.   return WLX_SAS_ACTION_SHUTDOWN;  
  22.  }  
  23.  if(login.DoModal()==IDOK)  
  24.  {  
  25.   
  26.   char UserName[40];  
  27.   char PassWord[40];  
  28.   char PassWord2[40];  
  29.     
  30.   strcpy(UserName,theApp.MyUser);  
  31.   strcpy(PassWord,theApp.MyPass);  
  32.   
  33.  //在這裏,我爲了簡便,直接在程序裏面比較密碼,並且把默認管理員帳號設置爲自動登陸  
  34.   
  35. //自動登陸函數SetAutoLogon  
  36.         strcpy(PassWord2,theApp.MyPass2);  
  37.  //  AfxMessageBox(UserName);  
  38.  //  AfxMessageBox(PassWord);    
  39.   if(!strcmp(UserName,"Administrator"))  
  40.    if(!strcmp(PassWord,"123"))  
  41.     if(!strcmp(PassWord2,"456"))  
  42.     {  
  43.      SetAutoLogon("administrator","","123");  
  44.      return theApp.MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,  
  45.    pLogonSid,pdwOptions,phToken,pMprNotifyInfo,pProfile);  
  46.     }  
  47.   
  48.   
  49.  }  
  50.  AfxMessageBox("密碼或者用戶名錯誤!不能登陸!");  
  51.  return WLX_SAS_ACTION_NONE;  
  52.   
  53. }  


然後設計登陸框,實現自己的界面,具體實現就不再詳細說明了,可以參考代碼。

三、安裝和注意事項:

在編寫GIAN DLL中要注意,GINA DLL使用的是unicode

引用


【安裝】GINA DLL的安裝:
1.
添加註冊表
鍵名 : /HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Winlogon
變量名 : GinaDLL
變量類型 : [REG_SZ]
內容 : "你的GINA DLL的名稱" 如:"MyGina.DLL:

2.
將你的GINA DLL(MyGina.dll)拷貝到系統目錄下(system32);

3.
重啓機器,你的GINA DLL(MyGina.dll)就會運行。

【注意】
1.
如果出現進不了你的系統,那你進入DOS後,將msgina.dll拷貝成你的GINA DLL(MyGina.dll)就可進入了;或者進入安全模式,刪除掉那個鍵值( GinaDLL )

2. Console
程序如果想使用MFC類,必須包含,同時註釋掉。

3.
如果出現這種錯誤:“LINK : fatal error LNK1104: cannot open file "mfc42u.lib" ”,那麼說明 lib路徑的設置問題,你的鏈接器在指定的目錄下沒有找到這個的文件,你應該添加新的目錄以便編譯器找到所需的庫文件。具體位置:IDE中菜單Tools /Options/Directories/show directories for

4.
如果出現這種錯誤:“uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in main.obj ”或者“mfcs42ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in main.obj ”,那麼“See if you have _AFXDLL and _USRDLL in the preprocessor definitions. Try removing one of them”。具體位置:IDE 菜單Project / Setting / C/C++ / preprocessor definition

 

·                                       

 

發佈了20 篇原創文章 · 獲贊 4 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章