闲来无事,对Chrome浏览器的cookie进行了分析,发现Chrome浏览器的cookie是存放在一个Cookies的sqlite数据库文件中。
跟firefox浏览器cookie不同的是,Chrome浏览器的cookie多了一个加密以后的cookie值,字段为encrypted_value,因此在解析的时候,需要分类处理:①没有加密的情况下;②加密的情况下。
步骤:
1.获取Chrome浏览器Profile文件的路径;
2.找到Cookies的完整路径;
3.对Cookies进行解析。
下面看看主要代码:
1.获取Chrome浏览器Profile文件的路径
//获取Chrome浏览器的随机路径
WCHAR *GetCHProfilePath()
{
WCHAR appPath[MAX_PATH];
static WCHAR FullPath[MAX_PATH];
memset(appPath, 0, sizeof(appPath));
if (!SHGetSpecialFolderPathW(NULL, appPath, CSIDL_LOCAL_APPDATA, TRUE))
return NULL;
_snwprintf_s(FullPath, MAX_PATH, L"%s\\Google\\Chrome\\User Data\\Default", appPath);
return FullPath;
}
2.找到Cookies的完整路径
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);
//打开Chrome浏览器cookie存放数据库
rc = sqlite3_open(sqlPath, &db);
if (rc)
return 0;
//执行查询语句
sqlite3_exec(db, "SELECT * FROM cookies;", parse_sqlite_cookies, NULL, NULL);
//关闭数据库
sqlite3_close(db);
return 1;
}
3.对Cookies进行解析
//sqlite数据库解析 回调函数
int static parse_sqlite_cookies(void *NotUsed, int argc, char **argv, char **azColName)
{
char *host = NULL;
char *name = NULL;
char *value = NULL;
WCHAR enc_value[2048];
char enc_value_a[2048];
ZeroMemory(enc_value, sizeof(enc_value));
ZeroMemory(enc_value_a, sizeof(enc_value_a));
for(int i=0; i<argc; i++){
if(!host && !_stricmp(azColName[i], "host_key"))
host = _strdup(argv[i]);
if(!name && !_stricmp(azColName[i], "name"))
name = _strdup(argv[i]);
if(!value && !_stricmp(azColName[i], "value"))
value = _strdup(argv[i]);
if(!_stricmp(azColName[i], "encrypted_value") && argv[i] && argv[i][0]) {
DecryptPass(argv[i], enc_value, 2048);
_snprintf_s(enc_value_a, sizeof(enc_value_a), _TRUNCATE, "%S", enc_value);
}
}
//字符串分割
NormalizeDomainA(host);
//对感兴趣的cookie过滤
if (host && name && value && IsInterestingDomainA(host)) {
if (value[0]==NULL && enc_value_a[0]!=NULL) //cookie有加密的情况
//AddCookieA(host, name, enc_value_a);
printf("host=%s,\tname=%s,\tenc_value_a=%s\n",host,name,enc_value_a);
else //cookie没有加密的情况
printf("host=%s,\tname=%s,\tvalue=%s\n",host,name,value);
//AddCookieA(host, name, value);
}
SAFE_FREE(host);
SAFE_FREE(name);
SAFE_FREE(value);
return 0;
}
主要用到C++、sqlite,编译器是VS2010。
完整代码见附件---解压密码是pediy.com
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课