我从电子邮件客户的记忆中找回了一封丢失的电子邮件

2020-05-03 21:55:38

我以前写过关于在桌面shell会话崩溃后如何通过dbus服务从GNOME文本编辑器(Gedit)恢复未保存的文档。这里有一个来自令人兴奋的桌面电子邮件应用程序世界的类似而令人兴奋的故事!

GNOME桌面项目的电子邮件和个人信息管理客户端Evolation存在严重的数据丢失漏洞。使用中的Signature Presets菜单更改签名后,有时会删除撰写窗口中的电子邮件正文文本。我不知道复制它的确切步骤,但在过去的两年里,它每月大约咬我两次。电子邮件的内容将被简单删除,除了新签名外,您将看到一条空消息。

更糟糕的是,撤消历史记录已被清除,因此我无法按Ctrl+Z来恢复草稿。在我开始写回信之前,我已经学会了通过更改签名来避免这种情况。有时我忘了,然后就是数据丢失的时候了!要么我丢了这封电子邮件,要么它就能正常工作。我从来没有输过一两个段落。

几天前,我丢失了一封花了我半个小时写的很长的电子邮件。我完全保持冷静,没有沮丧地离开电脑。(不是。)。如果我保持冷静并立即采取行动,我也许可以从草稿文件夹中恢复部分邮件。取而代之的是,它被一条空消息覆盖了。我必须在稍后查看我的电子邮件草稿文件夹的版本。

然而,并不是所有的希望都破灭了。引用一部备受喜爱的古生物奇幻电影:“这是Unix系统!我知道这个!里面有整个公园的所有档案。它告诉你一切!我必须找到正确的文件。“。

这一次,在虫子露出丑陋的面孔后,我没有关闭进化或撰写窗口。我的电子邮件的完整副本可能会保留在内存中。我的电脑有32 GB的内存,盲目地检查所有内存在技术上既有挑战性,也很耗时。

Linux在/proc/$pid/aps中维护进程内存分配的映射,其中$pid是正在运行的进程的进程标识符/编号。有多种工具可用于检索与这些地址对应的内存块,并将其保存到常规文件。

我决定组合使用pidof(作为procps-ng的一部分安装)来标识进程号,以及gcore(作为GDB(GNU调试工具套件)的一部分安装)来将进程的内存读取到文件中。以下是我使用的最后一个命令:

这产生了一个巨大的4 GB二进制内存转储文件。关于现代桌面应用程序如何耗费内存的评论被搁置一边;这仍然是大量的数据要处理。您可以使用一些专门的工具来分析此数据blob。但是,我决定使用Nanotext编辑器。它在处理海量文件时很“舒服”,当你用它来读取二进制数据时也不会卡住。我知道我感兴趣的数据将以UTF-8格式存储,因此文本编辑器应该.。

搜索这个巨大的文件花了很长时间。这里有大量的数据需要翻来覆去。我最初认为搜索独特的单词会是最好的方法。我找到的第一打匹配项是与拼写检查器相关的数据。然而,我改变了主意,转而寻找我能记住的部分句子片段。这种新方法将错过消息的任何可引用打印(RFC2045)表示,但会提供更少的零散匹配。..。

使用这种方法,我能够识别和检索完整电子邮件的纯文本副本。值得注意的是,当电子邮件内容从编辑窗口中消失时,我从RAM中检索到的副本有我选择的新签名。

我很高兴这次我设法找回了那封电子邮件。不过,我可能应该留出一些时间迁移到另一个电子邮件客户端。进化是伟大的!尤其是电子邮件编写器窗口,我遇到了多个问题。当我不能可靠地使用电子邮件客户端来写电子邮件时,它就没有真正的用处了。