首页
社区
课程
招聘
[原创]获取Chrome浏览器cookie
发表于: 2016-1-9 12:24 14197

[原创]获取Chrome浏览器cookie

2016-1-9 12:24
14197
闲来无事,对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直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (11)
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
大部分网站的cookie生命周期很短, 而且临时cookie关了浏览器就没了
2016-1-9 15:15
0
雪    币: 22
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Good job!
2016-1-9 19:33
0
雪    币: 986
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好东西,研究一下!!
2016-1-11 12:52
0
雪    币: 53
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
嗯。这是肯定的。但这是个思路,可以做其他事
2016-1-12 12:51
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很好,学习了!!
2016-1-12 22:13
0
雪    币: 1991
活跃值: (1506)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
这。。。。。。。。。。。。。。。。。。。。。。
2016-1-14 16:40
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
有了cookies也没什么用啊,密码账号还是找不到
2016-3-7 21:22
0
雪    币: 53
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
cookie都有了,可以用cookie自动登录....
2016-3-10 11:15
0
雪    币: 17
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
666,我要研究研究这个
2016-4-3 19:23
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
很好学习了,能获取到。有没有设置cookie的案例。
2017-10-30 11:47
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
12
然而有个扩展叫EditThisCookie
2017-10-31 08:28
0
游客
登录 | 注册 方可回帖
返回
//