Advertisement
yorath

IEPassView

Sep 25th, 2012
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.80 KB | None | 0 0
  1. #include <windows.h>
  2. #include <UrlHist.h>
  3. #include <shlobj.h>
  4. #include <stdio.h>
  5. #include <wincrypt.h>
  6. #include <tchar.h>
  7.  
  8. #define UrlHistoryNum 5000
  9. #define MAX_VALUE_NAME 1024
  10.  
  11. #import "pstorec.dll" no_namespace
  12. #pragma comment(lib, "Crypt32.lib")
  13.  
  14. void EnumPStorage();
  15. void DecryptIEAutoCompletePwd();
  16. typedef HRESULT (WINAPI *FPPStoreCreateInstance)(IPStore **, DWORD, DWORD, DWORD);
  17.  
  18. WCHAR *URL[UrlHistoryNum];
  19.  
  20. int main()
  21. {
  22.     EnumPStorage();
  23.     DecryptIEAutoCompletePwd();
  24.     return 0;
  25. }
  26.  
  27. int EnumUrls()
  28. {
  29.     IUrlHistoryStg2* pUrlHistoryStg2 = NULL;
  30.     HRESULT hRes;
  31.     DWORD idx = 0;
  32.    
  33.     CoInitialize(NULL);
  34.     hRes = CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC_SERVER, IID_IUrlHistoryStg2, (void **)&pUrlHistoryStg2);
  35.     if (!FAILED(hRes))
  36.     {
  37.         IEnumSTATURL* pEnumURL;
  38.        
  39.         hRes = pUrlHistoryStg2->EnumUrls(&pEnumURL);
  40.         if (!FAILED(hRes))
  41.         {
  42.             STATURL suURL;
  43.             DWORD pceltFetched;
  44.             suURL.cbSize = sizeof(suURL);
  45.            
  46.             for (idx = 0; (idx < UrlHistoryNum) && (pEnumURL->Next(1, &suURL, &pceltFetched) == S_OK); ++idx)
  47.             {
  48.                 if (suURL.pwcsUrl != NULL)
  49.                 {
  50.                     WCHAR *p = NULL;
  51.                     DWORD dwLen = 2 * (wcslen(suURL.pwcsUrl) + 1);
  52.                     if ((p = wcschr(suURL.pwcsUrl, '?')) != NULL)
  53.                         *p = 0;
  54.                     URL[idx] = new WCHAR[dwLen];
  55.                     _wcslwr_s(suURL.pwcsUrl, wcslen(suURL.pwcsUrl) + 1);
  56.                     wcscpy_s(URL[idx], dwLen, suURL.pwcsUrl);
  57.                 }
  58.             }
  59.             pEnumURL->Release();
  60.         }
  61.         pUrlHistoryStg2->Release();
  62.     }
  63.     CoUninitialize();
  64.  
  65.     return idx;
  66. }
  67.  
  68. void GetURLHashString(DWORD idx, TCHAR *szHash, DWORD dwLen)
  69. {
  70.     *szHash = 0;
  71.     HCRYPTPROV hProv = NULL;
  72.     HCRYPTHASH hHash = NULL;
  73.  
  74.     if (CryptAcquireContext(&hProv, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
  75.     {
  76.         if (CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
  77.         {
  78.             if (CryptHashData(hHash, (BYTE *)(URL[idx]), 2 * (wcslen(URL[idx]) + 1), 0))
  79.             {
  80.                 DWORD dwHashLen = 20;
  81.                 BYTE Buffer[20];
  82.  
  83.                 if (CryptGetHashParam(hHash, HP_HASHVAL, Buffer, &dwHashLen, 0))
  84.                 {
  85.                     DWORD i;
  86.                     BYTE tail = 0;
  87.  
  88.                     for (i = 0; i < 20; ++i)
  89.                     {
  90.                         tail += Buffer[i];
  91.                         wsprintf(szHash + 2 * i, TEXT("%02X"), Buffer[i]);
  92.                     }
  93.                     wsprintf(szHash + 2 * i, TEXT("%02X"), tail);
  94.                 }
  95.             }
  96.             CryptDestroyHash(hHash);
  97.         }
  98.         CryptReleaseContext(hProv, 0);
  99.     }
  100. }
  101.  
  102. void DecryptIEAutoCompletePwd()
  103. {
  104.     TCHAR szIEStorageKey[] = TEXT("Software\\Microsoft\\Internet Explorer\\IntelliForms\\Storage2");
  105.     TCHAR szUrlHash[MAX_VALUE_NAME];
  106.     HKEY hKey;
  107.     TCHAR achValue[MAX_VALUE_NAME];
  108.     DWORD cchValue = MAX_VALUE_NAME;
  109.     DWORD dwUrl;
  110.     DWORD i = 0, j = 0;
  111.     DWORD dwType;
  112.     DWORD BufferLength;
  113.     BYTE *Buffer;
  114.  
  115.     dwUrl = EnumUrls();
  116.  
  117.     if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_CURRENT_USER, szIEStorageKey, 0, KEY_QUERY_VALUE, &hKey))
  118.         return;
  119.  
  120.     while (ERROR_NO_MORE_ITEMS != RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL))
  121.     {
  122.         for (j = 0; j < dwUrl; ++j)
  123.         {
  124.             GetURLHashString(j, szUrlHash, sizeof(szUrlHash));
  125.             if (lstrcmp(szUrlHash, achValue) == 0)
  126.             {
  127.                 RegQueryValueEx(hKey, achValue, 0, &dwType, 0, &BufferLength);
  128.                 Buffer = new BYTE[BufferLength];
  129.                 if (RegQueryValueEx(hKey, achValue, 0, &dwType, Buffer, &BufferLength) == ERROR_SUCCESS)
  130.                 {
  131.                     DATA_BLOB DataIn;
  132.                     DATA_BLOB DataOut;
  133.                     DATA_BLOB OptionalEntropy;
  134.  
  135.                     DataIn.pbData = Buffer;
  136.                     DataIn.cbData = BufferLength;
  137.                     OptionalEntropy.pbData = (BYTE *)URL[j];
  138.                     OptionalEntropy.cbData = 2 * (wcslen(URL[j]) + 1);
  139.  
  140.                     if (CryptUnprotectData(&DataIn, 0, &OptionalEntropy, NULL, NULL, 1, &DataOut))
  141.                     {
  142.                         DWORD dwHeaderSize = *((LPDWORD)(DataOut.pbData));
  143.                         DWORD dwSecretInfoSize = *((LPDWORD)(DataOut.pbData + 4));
  144.                         DWORD dwTotalSecrects = *((LPDWORD)(DataOut.pbData + 20)) / 2;
  145.  
  146.                         LPBYTE lpSection = DataOut.pbData + 36;
  147.                         LPBYTE lpData = DataOut.pbData + dwHeaderSize + dwSecretInfoSize;
  148.  
  149.                         if (DataOut.cbData < 36)
  150.                             continue;
  151.  
  152.                         while(dwTotalSecrects--)
  153.                         {
  154.                             WCHAR *wstrUserName, *wstrPassword;
  155.                             wstrUserName = (WCHAR *)(lpData + *((LPDWORD)lpSection));
  156.  
  157.                             lpSection += 16;
  158.                             wstrPassword = (WCHAR *)(lpData + *((LPDWORD)lpSection));
  159.  
  160.                             printf("%S:\n{\n\tUsername: %S\n\tPassword: %S\n}\n", URL[j], wstrUserName, wstrPassword);
  161.                            
  162.                             lpSection += 16;
  163.                         }
  164.  
  165.                         LocalFree(DataOut.pbData);
  166.                     }
  167.                 }
  168.                 delete []Buffer;
  169.                 break;
  170.             }
  171.         }
  172.         i++;
  173.         cchValue = MAX_VALUE_NAME;
  174.     }
  175.     RegCloseKey(hKey);
  176. }
  177.  
  178. void EnumPStorage()
  179. {
  180.     IPStorePtr PStore;
  181.     IEnumPStoreTypesPtr EnumPStoreTypes;
  182.     FPPStoreCreateInstance fpPStoreCreateInstance;
  183.    
  184.     HMODULE hModule = LoadLibrary(TEXT("pstorec.dll"));
  185.     fpPStoreCreateInstance = (FPPStoreCreateInstance)GetProcAddress(hModule, "PStoreCreateInstance");
  186.    
  187.     fpPStoreCreateInstance(&PStore, 0, 0, 0);
  188.     HRESULT hRes = PStore->EnumTypes(0, 0, &EnumPStoreTypes);
  189.     if (!FAILED(hRes))
  190.     {
  191.         GUID TypeGUID;
  192.         TCHAR szItemGUID[50];
  193.         TCHAR szItemName[512];
  194.         TCHAR szItemData[512];
  195.        
  196.         while (EnumPStoreTypes->raw_Next(1, &TypeGUID, 0) == S_OK)
  197.         {
  198.             IEnumPStoreTypesPtr EnumPStoreSubTypes;
  199.             GUID SubTypeGUID;
  200.            
  201.             wsprintf(szItemGUID, TEXT("%x"), TypeGUID);
  202.             PStore->EnumSubtypes(0, &TypeGUID, 0, &EnumPStoreSubTypes);
  203.             while (EnumPStoreSubTypes->raw_Next(1, &SubTypeGUID, 0) == S_OK)
  204.             {
  205.                 IEnumPStoreItemsPtr spEnumItems;
  206.                 LPWSTR itemName;
  207.                
  208.                 PStore->EnumItems(0, &TypeGUID, &SubTypeGUID, 0, &spEnumItems);
  209.                 while (spEnumItems->raw_Next(1, &itemName, 0) == S_OK)
  210.                 {
  211.                     DWORD cbData = 0;
  212.                     unsigned char *lpString = NULL;
  213.                     TCHAR checkingData[200];
  214.                     _PST_PROMPTINFO *lPSTInfo = NULL;
  215.                    
  216.                     wsprintf(szItemName, TEXT("%ws"), itemName);
  217.                     PStore->ReadItem(0, &TypeGUID, &SubTypeGUID, itemName, &cbData, &lpString, lPSTInfo, 0);
  218.                    
  219.                     if (strlen((char *)lpString) < cbData - 1)
  220.                     {
  221.                         DWORD i = 0, j = 0;
  222.                         for (i = 0; i < cbData; i += 2, ++j)
  223.                         {
  224.                             if (lpString[i] == 0)
  225.                                 szItemData[j] = ',';
  226.                             else
  227.                                 szItemData[j] = lpString[i];
  228.                         }
  229.                         szItemData[j - 1] = 0;
  230.                     }
  231.                     else
  232.                         wsprintf(szItemData, TEXT("%s"), lpString);
  233.                    
  234.                     lstrcmp(szItemGUID, TEXT("220d5cc1"));
  235.  
  236.                     // IE:Password-Protected sites
  237.                     if (lstrcmp(szItemGUID, TEXT("5e7e8100")) == 0)
  238.                     {
  239.                         if (_tcsstr(szItemData, TEXT(":")) != 0)
  240.                         {
  241.                             lstrcpy(checkingData, _tcsstr(szItemData, TEXT(":")) + 1);
  242.                             *(_tcsstr(szItemData, TEXT(":"))) = 0;
  243.                         }
  244.                         printf("%-50ws %-20ws %-15s %-15ws\n", szItemName, "PW-protected sites", szItemData, checkingData);
  245.                     }
  246.                    
  247.                     // msn
  248.                     if (lstrcmp(szItemGUID, TEXT("b9819c52")) == 0)
  249.                     {
  250.                         TCHAR msnid[100];
  251.                         TCHAR msnpass[100];
  252.                         DWORD i = 0, j = 0;
  253.                         for (i = 0; i < cbData; i += 2)
  254.                         {
  255.                             if (lpString[i] == 0)
  256.                             {
  257.                                 szItemData[j] = ',';
  258.                                 ++j;
  259.                             }
  260.                             else
  261.                             {
  262.                                 if (IsCharAlphaNumeric(lpString[i]) || lpString[i] == '@' || lpString[i] == '.' || lpString[i] == '_')
  263.                                 {
  264.                                     szItemData[j] = lpString[i];
  265.                                     ++j;
  266.                                 }
  267.                             }
  268.                         }
  269.                         szItemData[j - 1] = 0;
  270.                        
  271.                         TCHAR *p = szItemData +2;
  272.                         for (i = 0; i < lpString[4]; ++i)
  273.                         {
  274.                             lstrcpy(msnid, p + 1);
  275.                             if (_tcsstr(msnid, TEXT(",")) != 0)
  276.                                 *(_tcsstr(msnid, TEXT(","))) = 0;
  277.                             if (_tcsstr(p + 1, TEXT(",")) != 0)
  278.                                 lstrcpy(msnpass, (_tcsstr(p + 1, TEXT(","))) + 2);
  279.                             if (_tcsstr(msnpass, TEXT(",")) != 0)
  280.                                 *(_tcsstr(msnpass, TEXT(","))) = 0;
  281.                            
  282.                             // The binary code is wrong here
  283.                             p = _tcsstr(p + 1, TEXT(",")) + lstrlen(msnpass) + 9;
  284.                         }
  285.                     }
  286.                    
  287.                     // IE
  288.                     if (lstrcmp(szItemGUID, TEXT("e161255a")) == 0)
  289.                     {
  290.                         if (_tcsstr(szItemName, TEXT("StringIndex")) == 0)
  291.                         {
  292.                             if (_tcsstr(szItemName, TEXT(":String")) != 0)
  293.                                 *(_tcsstr(szItemName, TEXT(":String"))) = 0;
  294.                             lstrcpyn(checkingData, szItemName, 8);
  295.                             if (_tcsstr(checkingData, TEXT("http:/")) == 0 && _tcsstr(checkingData, TEXT("https:/")) == 0)
  296.                             {
  297.                                 // Nothing
  298.                             }
  299.                             else
  300.                             {
  301.                                 lstrcpy(checkingData, szItemData);
  302.                                 if (_tcsstr(checkingData, TEXT(",")) != 0)
  303.                                 {
  304.                                     lstrcpy(checkingData, _tcsstr(szItemData, TEXT(",")) + 1);
  305.                                     *(_tcsstr(szItemData, TEXT(","))) = 0;
  306.                                 }
  307.                                 printf("%-50ws %-20ws %-15ws %-15ws\n", szItemName, TEXT("Auto complete"), szItemData, checkingData);
  308.                             }
  309.                            
  310.                         }
  311.                     }
  312.                    
  313.                     ZeroMemory(szItemName, sizeof(szItemName));
  314.                     ZeroMemory(szItemData, sizeof(szItemData));
  315.                 }
  316.                 //if (spEnumItems != NULL)
  317.                     //spEnumItems->Release();
  318.             }
  319.             //if (EnumPStoreSubTypes != NULL)
  320.                 //EnumPStoreSubTypes->Release();
  321.         }
  322.         //if (EnumPStoreTypes != NULL)
  323.             //EnumPStoreTypes->Release();
  324.     }
  325.     //if (PStore != NULL)
  326.         //PStore->Release();
  327. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement