从文件中删除所有 Base64 块

从文件中删除所有 Base64 块

我正在尝试将大约 20 年的 Usenet 档案上传到 archive.org,但我的第一批档案被拒绝,因为某些档案包含以 Base64 编码的木马。由于我有大约 400GB 的文件需要处理,手动修复是不可能的。所有文件均为 mbox 格式,即纯文本。我的第一个想法是查找并替换 mbox 文件中包含“Content-Type: application/x-msdownload”的所有消息。这可能相当困难。我现在认为更简单的暴力方法是删除所有 Base64 块。

这个问题,我发现可以使用 grep 找到 base64 块,但我不知道如何使用 sed 设置相同的东西,这就是我问的原因。谢谢!

编辑:到目前为止我尝试过的

根据这个^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$应该是查找 base64 文本所需的正则表达式,但是当我尝试将其与 sed 一起使用时,它实际上不起作用,或者至少没有达到我的预期。

例子:

cat clari.local.california.sfbay.biz.mbox | sed -e '#^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$#d' > clari.local.california.sfbay.biz.mbox.test

clari.local.california.sfbay.biz.mbox.test 仍包含 base64 文本。

答案1

邮件用户代理mutt(MUA) 可以按 MIME 类型从邮箱中删除邮件。您甚至可以编写此脚本。

具有编码附件的邮件可以mutt与搜索表达式相匹配~M application。这与包含字符串 的 MIME 类型的任何消息匹配application,通常指示附件已编码(可能采用 base64)。application/x-msdownload如果您愿意,您显然可以使用更具体的内容。

如果邮箱被调用,您可以删除其中包含包含命令行messages.mbox字符串的附件的所有邮件,如下所示:application

mutt -e 'push <delete-pattern>"~M application"<enter><quit>"y"' -f messages.mbox

请注意,从邮箱中删除邮件之前不会要求任何确认(最后是对退出前是否删除邮件的"y"问题的答复)。mutt您可能希望将邮件移至单独的邮箱中:

mutt -e 'push <tag-pattern>"~M application"<enter><tag-prefix><save-message>bad.mbox<enter>"y"<quit>"y"' -f messages.mbox

这会标记与给定搜索表达式匹配的所有邮件,将它们保存到 邮箱bad.mbox,并在从原始邮箱中删除它们后退出。

答案2

看看procmailformail、 和mimencode。您可以使用这些轻松设置复杂的自动邮箱处理,例如

查找并替换 mbox 文件中包含“Content-Type: application/x-msdownload”的所有邮件。

答案3

(?:...)是 Perl 正则表达式的一部分,而不是标准 POSIX 正则表达式的一部分。 ERE 等效项(对于grep -Esed -E)应该是:

^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

为什么我的正则表达式在 X 中有效但在 Y 中无效?

正则表达式还将匹配任何具有以下内容的行:任何长度为四个字符的倍数的字母数字字符串(没有其他字符),因此类似question,congrats或一行中单独的任何四个字母的脏话或四个字母的问候语都会匹配。此外,它不允许在两端有任何空格,如果您只删除单独的行,您可能会得到消息,其中后面剩下的内容毫无意义。

不管怎样,你可以做这样的事情,至少需要五组,每组四个字符。这应该不太可能匹配随机单词。

^([A-Za-z0-9+/]{4}){5,}([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

相关内容