首页
社区
课程
招聘
[旧帖] [原创]获取Firefox浏览器cookie 0.00雪花
发表于: 2016-1-8 10:09 1368

[旧帖] [原创]获取Firefox浏览器cookie 0.00雪花

2016-1-8 10:09
1368
大家好,这是我第一次发帖。

闲来无事,对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。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//