Safari 5.1 cookie格式规范



SAFARI的cookie存储方式在SAFARI 5.1中发生了变化他们还添加了一种完整性控制代码在文件的最后8个字节中:

文件是%APPDATA%Apple ComputerSafariCookiesCookies.binarycookies

有谁知道最后8个字节代表什么吗?

CRC32检查?

请帮

Cookie.binarycookies:

我想这会很有帮助。我用十六进制编辑器对文件进行反向工程,并开始更改cookie。

一般描述:

文件由几个页面组成,每个页面可以包含一个或多个cookie。每个页面都有一个标题,这是可变的,0x10, 0x14和0x1c是我们可以看到的常见值。

文件:

文件以一个4字节的头开始,这是不感兴趣的。

接下来的4个字节是真正感兴趣的,因为它们表示文件中有多少页。

然后我们得到每个页面的长度,也用一个4字节的数字表示。重要的是要知道所有这些数字都是以大端序书写的。因此,我们有4*页的字节数,然后是页数。

我们在末尾有8个字节,这也是我们不感兴趣的。

页面:

每个页面都有一个页眉,其长度可以在不同的页面之间改变。要知道报头的长度,我们必须丢弃前5个字节,接下来的4个字节将表示报头的长度。

在报头之后,我们将得到4字节表示的cookie的长度,以小端序排列!这个长度还包括表示长度所需的4个字节。

当这个cookie结束时,另一个cookie将开始,以此类推,直到页面结束。

饼干:

每个cookie的日期从0x2B开始。日期由4个字节组成,以小端序排列。日期是以秒表示的,但不是从epoch开始的,所以我们需要减去这个数字:1706047360。(它只适用于2017年的某一天)

下一个感兴趣的字段从0x38开始。这些字段是动态字段,因此它们由NULL"0x00"字节分隔,并按以下顺序排列:名称,值,url,路径。

例子:

http://i52.tinypic.com/2qcqix2.jpg

整个cookie的长度将是0x82。在此cookie的旁边,如果与页面长度相对应,将以完全相同的格式启动另一个cookie。

这并不能完全回答你的问题,但希望它能触及你想要做的事情的核心。

您可以使用NSHTTPCookieStorage类读取位于~/Library/Cookies/Cookies.binarycookies的二进制cookie文件的内容,如下面的代码片段所示:

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *c in [cookieStorage cookies])
{
    NSLog(@"%@", c);
}

我已经写了一个MacRuby脚本来做你正在寻找的:

https://gist.github.com/1385008

#!/usr/bin/env macruby
require 'csv'
framework 'Foundation'
CSV_Headers = %w[domain path expiresDate name value].to_csv
class NSHTTPCookie
  def to_csv
    [domain, path, expiresDate, name, value].to_csv
  end
end
store   = NSHTTPCookieStorage.sharedHTTPCookieStorage
cookies = store.cookies
raw_csv = cookies.map(&:to_csv)
puts CSV_Headers
puts raw_csv.join

你需要安装MacRuby,但是它会以CSV格式打印出你的cookies。它也可以很容易地与cookies.txt兼容。

我为Swift写了一个解析器,可以为你做这些。我需要这个,因为NSHTTPCookieStorage.sharedHTTPCookieStorage()不能让你访问全局cookie时,沙盒。

https://github.com/icodeforlove/BinaryCookies.swift

你可以这样使用

BinaryCookies.parse(NSHomeDirectory() + "/Library/Cookies/Cookies.binarycookies", callback: {
    (error:BinaryCookiesError?, cookies) in
    if let cookies = cookies {
        print(cookies);
    } else {
        print(error);
    }
});

目前有一些项目也可以在其他语言中实现此功能:

  • 节点(https://github.com/jlipps/node-binary-cookies)
  • python (https://github.com/mdegrazia/Safari-Binary-Cookie-Parser)

我刚得到一个url列表:$ strings Cookies.binarycookies | grep '^A.' | uniq

最新更新