Safari 5.1的Cookie格式规范

10

随着Safari 5.1的推出,SAFARI存储cookie的方式发生了变化,并且在文件的最后8个字节中添加了一种完整性控制代码:

该文件位于%APPDATA%\Apple Computer\Safari\Cookies\Cookies.binarycookies

有人知道最后8个字节对应什么吗?

CRC32检查吗?

请帮忙解答。


除了预定的校验和之外,您是否有关于该格式的详细规格说明,还是只是逆向工程?在我的计算机上,最后四个字节始终为07 17 20 05(HEX),似乎与文件中的cookie数量和类型无关。前面的字节似乎属于最后一个cookie条目。 - stracktracer
这2个字节不属于cookie,它们的目的是其他任何东西,比如控制代码。 - user382591
希望有人能找出它们是如何生成的。 - user382591
提供赏金以获取Safari 5.1 cookie格式的完整规格。 - stracktracer
5
仅仅在HEX编辑器中查看cookie文件并不被称为反向工程。这只是研究部分。当你得到与Safari创建cookie完全相同的算法时,才被称为反向工程。 - mahen23
显示剩余5条评论
6个回答

18

Cookie.binarycookies:

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

一般描述:

该文件由几个页面组成,每个页面可以包含一个或多个cookie。每个页面都有一个标题,它是可变的,常见值为0x10、0x14和0x1c。

文件:

文件以4字节标头开头,没有实际意义。

接下来的4个字节非常重要,因为它们指示文件中有多少页。

然后我们有每个页面的长度,也由4个字节表示。重要的是要知道所有这些数字都是以big-endian格式编写的。因此,我们有4*页数的字节数,然后是页面。

最后我们有8个字节,也没有实际意义。

页面:

每个页面都有一个标题,其长度可以从一个页面到另一个页面不同。要知道标题的长度,我们必须丢弃前五个字节,接下来的4个字节将指示标题的长度。

在标题之后,我们将有用4字节表示的cookie长度,在little-endian中排序!此长度还包括表示长度所需的4个字节。

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

Cookie:

每个cookie的日期从0x2B开始。日期由4个按little-endian排序的字节组成。该日期以秒表示,但不是自时代以来的秒数,因此我们需要减去这个数字:1706047360。(它只适用于2017年之前的某一天)

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

示例:

整个cookie的长度将为0x82。 如果符合页面长度,接下来会以完全相同的格式开始另一个cookie。

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


很抱歉以这种方式发布图片,但由于我是一个声望少于10分的新用户,无法上传图片! - AGG88
好的,谢谢。文件末尾的最后8个字节是什么? - user382591
它们很有趣,因为如果你只是更改它们并重新启动Safari,它会抱怨完整性。这就是问题所在。 - user382591
谢谢,这是关于我逆向工程的内容,但是底部的“校验和”信息缺失了... - stracktracer
1
哦我的天啊...大端、页面大小、记录大小、未使用的字节?这不就像主机使用的可变记录长度格式吗? - Leonardo Herrera
2
以下博客文章将此格式描述为“有用但错误”,并继续提供详细的替代方案:http://it.toolbox.com/blogs/locutus/understanding-the-safari-cookiesbinarycookies-file-format-49980。 - lambshaanxy

3

我虽然不能完全回答你的问题,但是希望能够切中你想要做的事情。

你可以使用NSHTTPCookieStorage类读取二进制cookie文件的内容,该文件位于~/Library/Cookies/Cookies.binarycookies。以下代码片段展示了如何使用该类:

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

这个能在Windows上使用吗? - stracktracer
1
太棒了!我创造了一个简单的命令行工具,将Cookies.binarycookies中的Cookie导出为cookies.txt格式。您可以在这里找到它:https://github.com/talkative/exportCookies(二进制文件可在下载中获取) - iceydee

3
我写了一个 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格式打印出您的Cookie。它可以轻松地转换为与cookies.txt兼容的格式。


1
欢迎来到Stackoverflow。最好确保答案能够独立存在,因此我添加了你链接答案中的代码。 - Conrad Frix
我需要了解%APPDATA%\Apple Computer\Safari\Cookies\Cookies.binarycookies文件中最后8个字节的含义是什么... - user382591

1

我刚刚从以下命令中得到了一个URL列表: $ strings Cookies.binarycookies | grep '^A\.' | uniq


1
我为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);
    }
});

目前也有其他语言的几个项目可以实现这一功能:


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接