随着Safari 5.1的推出,SAFARI存储cookie的方式发生了变化,并且在文件的最后8个字节中添加了一种完整性控制代码:
该文件位于%APPDATA%\Apple Computer\Safari\Cookies\Cookies.binarycookies
有人知道最后8个字节对应什么吗?
CRC32检查吗?
请帮忙解答。
随着Safari 5.1的推出,SAFARI存储cookie的方式发生了变化,并且在文件的最后8个字节中添加了一种完整性控制代码:
该文件位于%APPDATA%\Apple Computer\Safari\Cookies\Cookies.binarycookies
有人知道最后8个字节对应什么吗?
CRC32检查吗?
请帮忙解答。
Cookie.binarycookies:
我认为这会很有帮助。我用十六进制编辑器对文件进行了反向工程并开始更改cookie。
该文件由几个页面组成,每个页面可以包含一个或多个cookie。每个页面都有一个标题,它是可变的,常见值为0x10、0x14和0x1c。
文件以4字节标头开头,没有实际意义。
接下来的4个字节非常重要,因为它们指示文件中有多少页。
然后我们有每个页面的长度,也由4个字节表示。重要的是要知道所有这些数字都是以big-endian格式编写的。因此,我们有4*页数的字节数,然后是页面。
最后我们有8个字节,也没有实际意义。
每个页面都有一个标题,其长度可以从一个页面到另一个页面不同。要知道标题的长度,我们必须丢弃前五个字节,接下来的4个字节将指示标题的长度。
在标题之后,我们将有用4字节表示的cookie长度,在little-endian中排序!此长度还包括表示长度所需的4个字节。
当此cookie结束时,另一个cookie将开始,直到页面结束。
每个cookie的日期从0x2B开始。日期由4个按little-endian排序的字节组成。该日期以秒表示,但不是自时代以来的秒数,因此我们需要减去这个数字:1706047360。(它只适用于2017年之前的某一天)
兴趣的下一个字段从0x38开始。这些字段是动态字段,因此它们由NULL“0x00”字节分隔,并按以下顺序排列:名称、值、URL、路径。
整个cookie的长度将为0x82。 如果符合页面长度,接下来会以完全相同的格式开始另一个cookie。
我虽然不能完全回答你的问题,但是希望能够切中你想要做的事情。
你可以使用NSHTTPCookieStorage
类读取二进制cookie文件的内容,该文件位于~/Library/Cookies/Cookies.binarycookies
。以下代码片段展示了如何使用该类:
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *c in [cookieStorage cookies])
{
NSLog(@"%@", c);
}
#!/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兼容的格式。
我刚刚从以下命令中得到了一个URL列表:
$ strings Cookies.binarycookies | grep '^A\.' | uniq
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);
}
});
目前也有其他语言的几个项目可以实现这一功能: