analysis

呆雕浮长空,若鲤戏碧波,木林春葳蕤,鸡鸣桑树颠。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

取得保存在本机上的Msn密码程序

Posted on 2005-08-24 17:21  analysis  阅读(1977)  评论(1)    收藏  举报

    好像是去年年底的时候就看到了这段代码,不过当时想,得到保存在本机的密码这种东西应该是很多的啊,也就没注意。最近在网上又看到了这段代码,好像还挺流行啊,呵呵,现在把它编译一下,方便忘记密码的朋友。可要注意啊,Don't be evil(Google的企业信条)。

代码:Win32 SDK Console

#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>

#pragma comment(lib, "Crypt32.lib")

//Following definitions taken from wincred.h
//[available only in Oct 2002 MS Platform SDK /


typedef struct _CREDENTIAL_ATTRIBUTEA {
 LPSTR Keyword;
 DWORD Flags;
 DWORD ValueSize;
 LPBYTE Value;
}
CREDENTIAL_ATTRIBUTEA,*PCREDENTIAL_ATTRIBUTEA;

typedef struct _CREDENTIALA {
 DWORD Flags;
 DWORD Type;
 LPSTR TargetName;
 LPSTR Comment;
 FILETIME LastWritten;
 DWORD CredentialBlobSize;
 LPBYTE CredentialBlob;
 DWORD Persist;
 DWORD AttributeCount;
 PCREDENTIAL_ATTRIBUTEA Attributes;
 LPSTR TargetAlias;
 LPSTR UserName;
} CREDENTIALA,*PCREDENTIALA;

typedef CREDENTIALA CREDENTIAL;
typedef PCREDENTIALA PCREDENTIAL;

////////////////////////////////////////////////////////////////////

typedef BOOL (WINAPI *typeCredEnumerateA)(LPCTSTR,
            DWORD, DWORD *, PCREDENTIALA **);
typedef BOOL (WINAPI *typeCredReadA)(LPCTSTR, DWORD,
          DWORD, PCREDENTIALA *);
typedef VOID (WINAPI *typeCredFree)(PVOID);

typeCredEnumerateA pfCredEnumerateA;
typeCredReadA pfCredReadA;
typeCredFree pfCredFree;

////////////////////////////////////////////////////////////////////

void showBanner()
{
 printf("MSN Messenger Password Decrypter for Windows XP/2003\n");
 printf(" - Gregory R. Panakkal,http://www.infogreg.com \n\n");
}

////////////////////////////////////////////////////////////////////
int main()
{
 PCREDENTIAL *CredentialCollection = NULL;
 DATA_BLOB blobCrypt, blobPlainText, blobEntropy;

 //used for filling up blobEntropy
 char szEntropyStringSeed[37] =
  "82BD0E67-9FEA-4748-8672-D5EFE5B779B0"; //credui.dll
 short int EntropyData[37];
 short int tmp;

 HMODULE hDLL;
 DWORD Count, i;

 showBanner();

 //Locate CredEnumerate, CredRead, CredFree from advapi32.dll
  if( hDLL = LoadLibrary("advapi32.dll") )
  {
   pfCredEnumerateA =
    (typeCredEnumerateA)GetProcAddress(hDLL,
    "CredEnumerateA");
   pfCredReadA =
    (typeCredReadA)GetProcAddress(hDLL, "CredReadA");
   pfCredFree =
    (typeCredFree)GetProcAddress(hDLL, "CredFree");

   if( pfCredEnumerateA == NULL||
    pfCredReadA == NULL ||
    pfCredFree == NULL )
   {
    printf("error!\n");
    return -1;
   }
  }

  //Get an array of 'credential', satisfying the  filter
   pfCredEnumerateA("Passport.Net\\*", 0, &Count,
   &CredentialCollection);

  if( Count ) //usually this value is only 1
  {

   //Calculate Entropy Data
   for(i=0; i<37; i++) //    strlen(szEntropyStringSeed) = 37
   {
    tmp = (short int)szEntropyStringSeed[i];
    tmp <<= 2;
    EntropyData[i] = tmp;
   }

   for(i=0; i<Count; i++)
   {
    blobEntropy.pbData = (BYTE *)&EntropyData;
    blobEntropy.cbData = 74;
    //sizeof(EntropyData)

    blobCrypt.pbData =
     CredentialCollection[i]->CredentialBlob;
    blobCrypt.cbData =
     CredentialCollection[i]->CredentialBlobSize;

    CryptUnprotectData(&blobCrypt, NULL,
     &blobEntropy, NULL, NULL, 1, &blobPlainText);

    printf("Username : %s\n",
     CredentialCollection[i]->UserName);
    printf("Password : %ls\n\n",
     blobPlainText.pbData);
   }
  }

  pfCredFree(CredentialCollection);
}

    可执行文件如下:Win32 Console
    https://files.cnblogs.com/analysis/GetMsnPwd.rar