./c0de/c/msndecrypt.txt

0.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
/*
 *  MSN Messenger v7.5 Password Decrypter Source Code for Windows XP & 2003
 *  (Compiled - VC++ 2005, Tested on WinXP SP2, MSN Messenger v7.5.0324)
 *      - Gregory R. Panakkal
 *        http://www.infogreg.com/
 */
 
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <WinCred.h>
#include <tchar.h>
 
#pragma comment(lib, "Crypt32.lib")
 
void showBanner()
{
    _tprintf(_T("MSN Messenger v7.5 Password Decrypter for Windows XP/2003\n"));
    _tprintf(_T("   - Gregory R. Panakkal, http://www.infogreg.com \n\n"));
}
 
////////////////////////////////////////////////////////////////////
int main()
{
    PCREDENTIAL* CredentialCollection = NULL;
    DATA_BLOB blobCrypt;
    DATA_BLOB blobPlainText;
    DATA_BLOB blobEntropy;
    DATA_BLOB blobDynEntropy;
    HKEY hKeyDynSalt = NULL;
    HKEY hKeyCreds = NULL;
    HKEY hKeyUserCred = NULL;
    DWORD dwRet = 0;
    DWORD dwType = 0;
    DWORD dwDataSize = 0;
    DWORD dwTemp = 0;
    PBYTE pDynamicSalt = NULL;
    PBYTE pEncPassword = NULL;
    TCHAR szMsgrUserName[MAX_PATH];
    DWORD dwCount = 0;
    REGSAM RegSAM = KEY_READ;
    WCHAR szEntropy[] = L"%GKP$^%^&LL(%^$^O&TR$^%^GV6;lxzd";
 
    ZeroMemory(&blobCrypt, sizeof(blobCrypt) );
    ZeroMemory(&blobPlainText, sizeof(blobPlainText) );
    ZeroMemory(&blobEntropy, sizeof(blobEntropy) );
    ZeroMemory(&blobDynEntropy, sizeof(blobDynEntropy) );
 
    showBanner();
 
    do
    {
        //
        // Allocate some memory!
        //
        pEncPassword = (PBYTE)malloc( MAX_PATH );
 
        if(NULL == pEncPassword)
        {
            _tprintf(_T("ERROR: malloc failed!"));
            break;
        }
 
 
        //
        // Fetch & Calculate Dynamic Salt
        //
        dwRet = RegOpenKeyEx(
                    HKEY_CURRENT_USER,
                    _T("SOFTWARE\\MICROSOFT\\IdentityCRL\\Dynamic Salt"),
                    0,
                    RegSAM,
                    &hKeyDynSalt
                    );
 
        if(ERROR_SUCCESS != dwRet)
        {
            _tprintf(_T("ERROR: Cannot opening dynamic salt reg key!"));
            break;
        }
 
        dwTemp = sizeof(dwDataSize);
 
        dwRet = RegQueryValueEx(
                    hKeyDynSalt,
                    _T("Size"),
                    NULL,
                    &dwType,
                    (LPBYTE)&dwDataSize,
                    &dwTemp
                    );
 
        if( ERROR_SUCCESS != dwRet ||
            REG_DWORD != dwType ||
            sizeof(DWORD) != dwTemp )
        {
            _tprintf(_T("ERROR: Cannot fetch dynamic salt data size!"));
            break;
        }
 
        pDynamicSalt = (PBYTE)malloc( dwDataSize );
 
        if(NULL == pDynamicSalt)
        {
            _tprintf(_T("ERROR: malloc failed!"));
            break;
        }
 
        dwTemp = dwDataSize;
 
        dwRet = RegQueryValueEx(
                    hKeyDynSalt,
                    _T("Value"),
                    NULL,
                    &dwType,
                    (LPBYTE)pDynamicSalt,
                    &dwTemp);
 
 
        if( ERROR_SUCCESS != dwRet ||
            REG_BINARY != dwType ||
            dwDataSize != dwTemp )
        {
            _tprintf(_T("ERROR: Cannot fetch dynamic salt data!"));
            break;
        }
 
        //Initial Crypt Blob
        blobCrypt.pbData = (LPBYTE)pDynamicSalt;
        blobCrypt.cbData = dwDataSize;
 
 
        //Initialize Entropy Blob
        blobEntropy.pbData = (LPBYTE)&szEntropy;
        blobEntropy.cbData = 0x40;
 
        if(FALSE == CryptUnprotectData(
                            &blobCrypt,
                            NULL,
                            &blobEntropy,
                            NULL,
                            NULL,
                            1,
                            &blobPlainText
                        ))
        {
            //something
            break;
        }
 
        //
        // Construct the 128 Char long Entropy value
        //
 
        memcpy(
            blobCrypt.pbData,
            blobEntropy.pbData, blobEntropy.cbData
            );
 
        memcpy(
            blobCrypt.pbData + blobEntropy.cbData,
            blobPlainText.pbData,
            blobPlainText.cbData
            );
 
        blobEntropy.cbData += blobPlainText.cbData;
        blobEntropy.pbData = blobCrypt.pbData;
 
 
        //Free memory & Zero-off Blob structure
        LocalFree(blobPlainText.pbData);
        ZeroMemory(&blobPlainText, sizeof(blobPlainText));
 
 
        //
        // Enumerate all the stored credentials in the registry
        //
 
        dwRet = RegOpenKeyEx(
                    HKEY_CURRENT_USER,
                    _T("SOFTWARE\\MICROSOFT\\IdentityCRL\\Creds"),
                    0,
                    RegSAM,
                    &hKeyCreds
                    );
 
        if(ERROR_SUCCESS != dwRet)
        {
            _tprintf(_T("ERROR: Cannot opening credential key!"));
            break;
        }
 
        while( true )
        {
            dwRet = RegEnumKey(
                        hKeyCreds,
                        dwCount,
                        (LPTSTR)&szMsgrUserName,
                        MAX_PATH
                        );
 
            if( ERROR_SUCCESS != dwRet )
            {
                break;
            }
 
            dwRet = RegOpenKeyEx(
                        hKeyCreds,
                        szMsgrUserName,
                        0,
                        RegSAM,
                        &hKeyUserCred
                        );
 
            if(ERROR_SUCCESS == dwRet)
            {
                dwTemp = MAX_PATH;
 
 
                //
                // Read encrypted passsword
                //
 
                dwRet = RegQueryValueEx(
                            hKeyUserCred,
                            _T("ps:password"),
                            NULL,
                            &dwType,
                            (LPBYTE)pEncPassword,
                            &dwTemp);
 
                if( ERROR_SUCCESS == dwRet &&
                    REG_BINARY == dwType )
                {
                    blobCrypt.pbData = (LPBYTE)pEncPassword;
                    blobCrypt.cbData = dwTemp;
 
                    //
                    // Decrypt & Display Credential Info!
                    //
                    if(TRUE == CryptUnprotectData(
                                        &blobCrypt,
                                        NULL,
                                        &blobEntropy,
                                        NULL,
                                        NULL,
                                        1,
                                        &blobPlainText
                                    ))
                    {
                        _tprintf(
                            _T("Username : %s\nPassword : %ws\n\n"),
                            szMsgrUserName,
                            blobPlainText.pbData
                            );
 
                        LocalFree(blobPlainText.pbData);
                    }
                }
 
                //Close User Cred Key
                RegCloseKey(hKeyUserCred);
                hKeyUserCred = NULL;
            }
 
            dwCount++;
        }
 
    }while(false);
 
 
    if(NULL != pDynamicSalt)
    {
        free(pDynamicSalt);
    }
 
    if(NULL != pEncPassword)
    {
        free(pEncPassword);
    }
 
    if(NULL != hKeyCreds)
    {
        RegCloseKey(hKeyCreds);
    }
 
    if(NULL != hKeyDynSalt)
    {
        RegCloseKey(hKeyDynSalt);
    }
}

Back