这个帖子在『临时会员版』已经发表了,但是那个时候没有添加附件,现在添加完整的代码附件!
闲来无事,对firefox浏览器的cookie进行了分析,发现firefox浏览器的cookie是存放在一个cookies.sqlite的sqlite数据库文件中。
步骤:
1.获取firefox浏览器Profile文件的路径;
2.找到cookies.sqlite的完整路径;
3.对cookies.sqlite进行解析。
下面看看主要代码:
1.获取firefox浏览器Profile文件的路径
//获取firefox浏览器的随机路径
WCHAR *GetFFProfilePath()
{
static WCHAR FullPath[MAX_PATH];
WCHAR appPath[MAX_PATH];
WCHAR iniFile[MAX_PATH];
WCHAR profilePath[MAX_PATH];
DWORD pathSize = MAX_PATH;
memset(appPath, 0, sizeof(appPath));
memset(profilePath, 0, sizeof(profilePath));
GetEnvironmentVariableW(L"APPDATA", appPath, MAX_PATH);
// Get firefox profile directory
_snwprintf_s(iniFile, MAX_PATH, DeobStringW(L"%9\\D5OZyyH\\aZEIM5S\\PE5MZyI9.Z1Z"), appPath); //"%s\\Mozilla\\Firefox\\profiles.ini"
GetPrivateProfileStringW(DeobStringW(L"3E5MZyIj"), L"Path", L"", profilePath, sizeof(profilePath), iniFile); //"Profile0"
_snwprintf_s(FullPath, MAX_PATH, DeobStringW(L"%9\\D5OZyyH\\aZEIM5S\\%9"), appPath, profilePath); //"%s\\Mozilla\\Firefox\\%s"
return FullPath;
}
2.找到cookies.sqlite的完整路径
//开始解析感兴趣的cookie
int static DumpSqliteCookies(WCHAR *profilePath, WCHAR *signonFile)
{
sqlite3 *db;
char *ascii_path;
CHAR sqlPath[MAX_PATH];
int rc;
//转换编码
if (!(ascii_path = GetDosAsciiName(profilePath)))
return 0;
sprintf_s(sqlPath, MAX_PATH, "%s\\%S", ascii_path, signonFile);
SAFE_FREE(ascii_path);
//打开firefox浏览器cookie存放数据库
if ((rc = sqlite3_open(sqlPath, &db)))
return 0;
//执行查询语句
sqlite3_exec(db, "SELECT * FROM moz_cookies;", parse_sqlite_cookies, NULL, NULL);
//关闭数据库
sqlite3_close(db);
return 1;
}
3.对cookies.sqlite进行解析
//sqlite数据库解析 回调函数
int static parse_sqlite_cookies(void *NotUsed, int argc, char **argv, char **azColName)
{
char *host = NULL;
char *name = NULL;
char *value = NULL;
for(int i=0; i<argc; i++){
if(!host && !_stricmp(azColName[i], "host"))
host = _strdup(argv[i]);
if(!name && !_stricmp(azColName[i], "name"))
name = _strdup(argv[i]);
if(!value && !_stricmp(azColName[i], "value"))
value = _strdup(argv[i]);
}
//字符串分割
NormalizeDomainA(host);
if (host && name && value && IsInterestingDomainA(host))
printf("host=%s,\tname=%s,\tvalue=%s\n",host,name,value);
SAFE_FREE(host);
SAFE_FREE(name);
SAFE_FREE(value);
return 0;
}
主要用到C++、sqlite,编译器是VS2010。
完整代码见附件---解压密码是pediy.com
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)