Safari 5.1 cookie格式规范

时间:2011-09-25 13:46:04

标签: cookies safari

为SAFARI存储cookie的方式已经改变了SAFARI 5.1 并且他们添加了一种完整性控制代码 在文件的最后8个字节中:

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

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

CRC32检查?

请帮忙

5 个答案:

答案 0 :(得分:17)

Cookie.binarycookies:

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

一般说明:

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

文件:

文件以一个不感兴趣的4字节标头开头。

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

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

我们最后有8个字节,也没什么兴趣。

页:

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

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

当这个cookie结束时,另一个将开始,依此类推到页面的末尾。

曲奇:

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

下一个感兴趣的字段从0x38开始。这些字段是动态字段,因此它们由NULL“0x00”字节分隔,并按以下顺序排列:name,value,url,path。

实施例

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

我编写了一个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兼容。

答案 3 :(得分: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);
    }
});

目前有一些项目也可以用其他语言来完成:

答案 4 :(得分:0)

我刚收到一份网址列表:     $ strings Cookies.binarycookies | grep '^A\.' | uniq