5年前,我开始逐渐意识到自己的数据占用空间,因此开始使用Signal。大约在同一时间,我关闭了我的Facebook和Instagram帐户,后来又关闭了我的Google帐户。
Signal使得备份,导出或迁移消息数据变得非常困难,在大多数情况下甚至是不可能的。信号小组坚称,这些限制旨在保护用户的隐私。但是,每个官方Signal客户端的备份和迁移策略都不同,有时彼此矛盾。
例如,虽然iOS没有提供官方的备份过程,但Android备份已内置到应用程序中。同时,iOS用户可以将其数据迁移到新设备上(只要他们的电话号码没有更改),但这在Android上是不可能的。同时,解密来自桌面客户端的消息很简单,但是链接手机和桌面客户端只能同步消息的及时转发。
导出我的数据的道路漫长,令人沮丧,充满了死胡同–花费了一年多的时间才能到达这里。奇怪的是,别人的手机竟然是我数据的钥匙。
近年来,我将大部分对话都转移到了Signal上,包括与家人和密友的对话。我们开始约会后不久,我让我的伴侣改用Signal,自此以后我们就一直使用它。在某些时候,我认为导出我们的对话历史记录(这是我们关系的一个时间囊)会很好。 “容易。”我想。我错了。
自从我们开始约会以来,我已经从OnePlus 2切换到iPhone XS Max。而且由于无法从Android迁移到iOS,因此部分对话历史记录已锁定在我的旧手机上。越狱iPhone成为不可能,因为我的iOS版本尚未越狱。 Signal Desktop客户端可以提供一种轻松的方式来解密我们的聊天记录,但是有几个月的时间我没有将iPhone链接到Signal桌面客户端。
我在2019年6月的信号社区论坛上打开了一个与此相关的话题。很快就很明显,备份我的信号数据将是一场艰苦的战斗。
幸运的是,我的伴侣有一部iPhone 7,最近她换成了公司电话。她的旧iPhone将我们的整个消息历史记录集中在一处,而且容易越狱。头奖
在此过程中,我学到了重要的一课:要确保访问对话历史记录,请在开始使用Signal时立即安装桌面客户端并将其链接到移动设备。 Signal数据库和加密密钥都可以在计算机上访问,从而可以轻松解密。稍后链接桌面客户端将仅在设备链接后及时同步消息。
如果您尚未链接桌面客户端,并且提取iOS数据库是您的唯一选择,则本指南适合您。如果您决定踏上这一旅程,这里有一些建议。
越狱iOS的最佳机会是在较旧的固件版本上。关闭自动更新和拒绝提示以更新iOS。
SHSH Blob是Apple生成并用于个性化每个iOS设备的iOS固件文件的数字签名。 Apple在发行后的有限时间内仅签署固件更新。方便使用这些签名后,一个人可以在Apple停止对它们进行签名后再安装iOS版本,例如当该版本可以越狱时。在某些情况下,您可以将iOS降级到以前的版本。
每次Apple发行新版本的iOS(例如14.0、14.1、14.1.1)时,备份SHSH都会出现问题。我个人使用了blobsaver应用程序,但是TSS Saver是一个受欢迎的替代方案。
开发人员和黑客一直在努力打破iOS的安全性,而越狱iPhone的新方法经常被公之于众。遵循/ r / jailbreak subreddit随时了解有关越狱版本的信息。
按设备和iOS版本列出的越狱兼容性详尽列表也是一个很好的资源。
根据您的iPhone,您可能永远无法越狱或从iOS钥匙串中提取Signals解密密钥。苹果使越狱iOS设备变得越来越困难-硬件和软件的改进为黑客提供了更少的破解机会。
本指南说明了如何在装有iOS 13.6.1的iPhone 7上从Signal的加密SQLite数据库中备份和提取数据。
对于iPhone 7上的iOS 13.6.1,我使用了checkra1n,它提供了直接的半连接式越狱功能。根据iPhone设备和iOS版本的不同,越狱可能会或可能不会。
Cydia通常附带安装并启用了OpenSSH,从而允许通过IP或USB进行外壳访问。如果未激活SSH访问,请启动Cydia并安装OpenSSH。
如果iPhone和主机在同一网络上,请使用其IP地址通过SSH进入手机。可以在手机的WiFi设置中找到它。
如果无法通过SSH进行无线传输,则可以选择USB。但是,这涉及在主机上启用代理服务。
现在应该可以通过端口2222上的USB SSH进入iPhone。 登录到iPhone的外壳后,请安装以下软件包,因为它们会派上用场。 与macOS相似,iOS将应用程序数据存储在类库目录中。 在iOS 13中,其位于/ private / var / mobile / Containers / Shared / AppGroup /。 Signal的数据目录包含./grdb/signal.sqilte中的加密SQLite数据库文件以及附件,例如./Attachments中的图像和视频。 可以通过在文件系统中搜索Signal的加密数据库文件signal.sqlite来找到数据目录。 建议压缩整个目录,不仅是数据库文件,因为它还包含图像和其他消息附件。 这个档案可以达到数GB。 在主机上的新终端会话中,使用scp复制备份。
这是此操作中最复杂的部分,有助于基本了解iOS核心开发概念。
权利是授予可执行程序特定功能的权利或特权。例如,一个应用需要拥有HomeKit权利以及明确的用户同意才能访问用户的家庭自动化网络。应用程序将其权利存储为嵌入在其二进制可执行文件的代码签名中的键值对。
我们将使用Keychain-Dumper尝试提取Signal加密密钥。它要求有权访问任何特定应用程序的钥匙串数据。
通过阅读Keychain-Dumper的GitHub问题,我了解到权限在iOS 13.5中已更改-在此版本之前,可以为应用程序提供通配符权利。 13.5中的更改使得应用程序需要特定的权利。幸运的是,即使是二进制文件,也可以更新可执行文件的权利。
GitHub回购中包含的keychain_dumper二进制文件具有通配符权利。我们需要对其进行更新,以使其有权解密Signal密钥。
返回iPhone,下载并解压缩keychain_dumper二进制文件,并将其移至/ usr / bin。
有必要创建一个bash脚本,该脚本将浏览手机上安装的应用程序并赋予keychain_dumper权利以访问它们。在撰写本文时,存储库中包含的updateEntitlements.sh脚本未考虑iOS 13.5中的更改。
#!/ bin / bashKEYCHAIN_DUMPER_FOLDER = / usr / binENTITLEMENT_PATH = $ KEYCHAIN_DUMPER_FOLDER / ent.xmlecho"<?xml version = \" 1.0 \" encoding = \" UTF-8 \"?>" > $ ENTITLEMENT_PATHecho"<!DOCTYPE plist PUBLIC \"-// Apple // DTD PLIST 1.0 // EN \" \" http://www.apple.com/DTDs/PropertyList-1.0.dtd \">" >> $ ENTITLEMENT_PATH回声"< plist version = \" 1.0 \">" >> ENTITLEMENT_PATH回声" < dict>" >> $ ENTITLEMENT_PATH回显" < key>钥匙串访问组< / key>" >> $ ENTITLEMENT_PATH回显" < array>" >> $ ENTITLEMENT_PATH用于/ var / mobile / Containers / Shared / AppGroup / *中的d;做cd $ d;回声" < string> $(plutil -MCMMetadataIdentifier .com.apple.mobile_container_manager.metadata.plist)< / string>" >> $ ENTITLEMENT_PATH; cd ..;完成#修改/ private / var / containers / Bundle / Application / *中d的应用程序特定应用程序标识符;做cd $ d / *。app /; executeName =`plutil -CFBundleExecutable Info.plist`; CheckingPath =`pwd`;回声"正在检查... $ checkingPath" ; #提取文件ldid -e" $ {executableName}"的当前MachO权利。 >> ent.xml; applicationIdentifier = $(plutil-应用程序标识符ent.xml);回声" < string> $ applicationIdentifier< / string>" >> $ ENTITLEMENT_PATH; #清理rm ent.xml; cd ../../; doneecho" < / array>"> $ ENTITLEMENT_PATH回显" < key>平台应用程序< / key> < true />"> $ ENTITLEMENT_PATH回显" < key> com.apple.private.security.no-container< / key> < true />"> $ ENTITLEMENT_PATH回显" < / dict>"> $ ENTITLEMENT_PATH回显" / plist>"> $ ENTITLEMENT_PATHcd $ KEYCHAIN_DUMPER_FOLDERldid -Sent.xml keychain_dumper
updateEntitlements.sh脚本使用了默认情况下未安装在iOS中的名为plutil的工具。幸运的是,Cydia在apt.binger.com存储库中提供了与iOS兼容的版本。
root#plutil用法:plutil选项文件...-帮助打印此消息-打印完整的选项列表-详细显示详细输出-显示属性列表数据键-列出顶级字典键-创建新的空属性列表- key keyname恢复密钥的值。多次使用可生成keypath-value值设置keypath-remove的值删除keypath-type typeid的值设置key时要使用的类型。有效类型为int,float,bool,json和string(默认值)。使用json定义数组和字典转换格式将每个属性列表文件转换为选定格式。格式为xml1,binary1和json。注意json文件保存到filename.json
为了使keychain_dumper正常工作,它需要所有这三种权利。如果缺少组权限,它将不起作用。
通用密码----------------服务:GRDBKeyChainServiceAccount:GRDBDatabaseCipherKeySpecEntitlement组:U68MSDN6DR.org.whispersystems.signalLabel :(空)可访问属性:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly,保护级别4描述:(空)注释: (null)可同步:0常规字段:(null)钥匙串数据(十六进制):0xabbe15b2bc59d74a7fbb21ee74a13a6e2f097d38fc61e3b9b879b82325ae4542d46c339ae3c092e3e00a2a74ec5c8be
您的私钥Keychain Data(Hex)应该是一个以0x开头的99字节的字符串。如果钥匙串数据看起来像这样+ 62BnrvZ18x \ / uyHudKE61i8JfTj8auO5uHm4IyWu1ULMbDOb484S4 + AKoq3Oxc3L,则可能意味着密钥未正确解密。
最坏的过去了。有了加密的数据库文件和加密密钥,就可以解密数据。为此,需要sqlcipher(一种为数据库文件提供加密的SQLite扩展)。
$ sqlcipher< signal backup> /grdb/signal.sqliteSQLite版本3.33.0 2020-08-14 13:23:32(SQLCipher 4.4.2社区)输入" .help" 用法提示。sqlite> 在sqlite>中输入以下命令。 提示,使用您的私钥进行更新。 重要的是,请从私钥的开头删除字符0x,这只是表明该密钥为十六进制格式。 sqlite> 附加数据库' signal_decrypted.sqlite' AS signal_decrypted KEY'&#39 ;; sqlite> SELECT sqlcipher_export(' signal_decrypted'); sqlite> 分离数据库signal_decrypted; 在后续文章中,我将解释Signal的数据库结构以及如何将消息历史记录导出为可用格式。