你是否有过想要把某件东西拆开来看的冲动? 你是否有过想要把某段二进制代码弄个明白的欲望? 你是否有过要紧急恢复一篇无法打开的文档的窘境?

这就是你需要反向工程的时候。

软件开发,特别是为专有软件开发自由替代的时候,在没有文档说明的条件下,人们只能通 过反向工程去了解通信协议、分析算法逻辑、匹配文档格式乃至发现恶意软件。当然,反向 工程需要消耗比已知需求的正向开发多得多的资源和精力。不过,本文的目的不是探讨如何 让硬件厂商公开其设计资料以便大家开发自由的驱动程序。本文意在通过学习一篇网上非常 流行的博客文章:

Reverse Engineering the source code of the BioNTech/Pfizer SARS-CoV-2 Vaccine

来和大家一起欣赏反向工程思想的妙处。以上博客已有中文翻 译

本文的优点均归于原作者,而缺点和错误皆有本作者承担。

新冠病毒虐已久,大家一年来都不得安生。所幸病毒激发了科学的进步——欧美科学家全力开 发出了新型的 mRNA 疫苗。本文的主角就是 BioNTech/Pfizer(辉瑞)开发的 SARS-CoV-2 疫苗:BNT162b2,又称 Tozinameran 或 Comirnaty。

BNT162b2 是一种 mRNA 疫苗,其编码由遗传物质 RNA 组成。世界卫生组织给出了该疫苗长 度为 4282 的编码(不幸的是,世卫使用的不是自由文档格式;所幸的是,LibreOffice 可 以打开该专有格式):

[[…imag]]

BNT162b2 疫苗的前一段

这个可以看做是疫苗的可执行文件二进制代码。因为没有专业的知识和指令识别,普通人根 本无法理解这短短的天书说得是什么、要干什么事。

原作者利用基本的生物学知识(中国中学生就懂的知识)加上逆向工程的思想,一步一步地 分析了该疫苗各个代码的意义,很有发人深思的理由。以下是原作者思想的简述。

  1. 基础知识

计算机一般都是二进制编码的,编码的最小单位是比特;比特只有 0 和 1 两种元素。

人类基因的遗传物质是 DNA,它也是一种数字编码,其最小单位是核苷酸;核苷酸有四种: A、C、G、T。

新冠病毒是一种 RNA 病毒,它的基因组以 RNA 为遗传物质,RNA 也是数字编码,其最小单 位和 DNA 差一点:A、C、G、U。

无论是 DNA,还是 RNA,自然界都是以 3 个核苷酸为最小单位进行编码的。就像电脑中最 小以 8 个比特为单位构成有意义的字节,遗传物质最小以 3 个核苷酸为单位构成密码子。 一个密码子相当于有 3 个位置,每个位置都可以放置 4 种核苷酸的一种。这样一共就有

4x4x4 = 64

种不同的密码子。

  1. 疫苗的代码要干什么

疫苗就是要让我们的免疫系统学会对付病原体,但是又不真的得病。

以往的疫苗都是使用减弱或灭活的病毒制成的——中国研制的新冠疫苗就是这种。这种疫苗研 发周期长,而且成功的概率较低,一般来说有效率也有限。

mRNA 疫苗完全不同,是一种新的疫苗技术。它的针对性非常强——对新冠病毒来说, BNT162b2 针对的就是新冠病毒的 SARS-CoV-2 刺突蛋白。免疫系统只要学会了对付该刺突 蛋白,就是学会了对付新冠病毒。

mRNA 疫苗并不需要人体里有新冠病毒——人们注射了 mRNA 疫苗之后,该疫苗会巧妙地利用 人体细胞制造一定量的 SARS-CoV-2 刺突蛋白引发人体免疫系统的实战学习。这种疫苗具有 开发周期短,针对性强,有效率高的特点。一般来说,由于这种疫苗成分清楚,它也更安全。

  1. 疫苗代码分析

首先,我们看一下世卫在文档中给出的一个说明图片。

[[…image]]

图片的最左边是一个帽子的形状——cap。这个相当于计算机程序的调用规则,比如 BASH 脚 本的开头都是 #!。如果没有这个开头,程序就不会执行。疫苗的帽子是 GA。它告诉人 体细胞,我们是合法的。

接下来是 5'-UTR。这是一个未翻译区(UTR)。翻译是指通过 RNA 合成蛋白质的过程。

GAAΨAAACΨAGΨAΨΨCΨΨCΨGGΨCCCCACAGACΨCAGAGAGAACCCGCCACC

这里,我们看到了 Ψ,它并不是我们上面说到的核苷酸之一。这个 Ψ 是该疫苗的精 彩之一:它把核苷酸 U 稍加改造,做成 Ψ——既骗过了人体免疫系统的识别,又可以被 细胞当成 U 来使用。正如安全系统中使用类似的技巧,发送稍加变异的信息骗过通信拦 截进入系统。但是,请注意,自然界并没有制造 Ψ 的能力,而疫苗很快就在人体里被降 解了,所以不必担心有病毒会利用 Ψ 来制造麻烦。

5'-UTR 虽然不参与蛋白质的具体制造,但是它相当于一个同步帧——告诉细胞翻译应该在 什么时候开始。

接下来的 sig 是要参与蛋白质制造的,而且它带有蛋白质目的地的信息——类似函数调用 的返回地址。仔细看一下 sig 的代码就知道它基本上就是病毒的代码——疫苗用了更多的 CG——这是疫苗的另一个高明之处:

           3   3   3   3   3   3   3   3   3   3   3   3   3   3   3   3
Virus:   AUG UUU GUU UUU CUU GUU UUA UUG CCA CUA GUC UCU AGU CAG UGU GUU
Vaccine: AUG UUC GUG UUC CUG GUG CUG CUG CCU CUG GUG UCC AGC CAG UGU GUG
               !   !   !   !   ! ! ! !     !   !   !   !   !           !

CG 越多,制造蛋白质的效率越高。

以后疫苗中的 3777 个密码子就是用于翻译刺突蛋白的编码,其中也大量使用了 CG 来提高效率。当然制造出来的刺突蛋白还要通过一系列高精尖的技术让它们在适当的位 置保持适当的姿态。这个学问太高,大家去看具体的文献,我学艺不精,别带偏了。

在蛋白编码的最后,实际上是结束编码:

          V   L   K   G   V   K   L   H   Y   T   s
Virus:   GUG CUC AAA GGA GUC AAA UUA CAU UAC ACA UAA
Vaccine: GUG CUG AAG GGC GUG AAA CUG CAC UAC ACA UGA UGA
          V   L   K   G   V   K   L   H   Y   T   s   s
               !   !   !   !     ! !   !          !

它告诉大家蛋白质编码到此结束。

然后就是 3'-UTR。这段代码的功能还没有特别清楚的研究明白。但是它的作用不容忽视, BNT162b2 疫苗对这段代码的选择也特别提高了蛋白制造的稳定性和效率,值得称赞。

最后,BNT162b2 疫苗以

                                     ****** ****
UAGCAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAGCAUAU GACUAAAAAA AAAAAAAAAA
AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAA

结尾。好多的 A,关于这段代码也有不少理论解释,总之是提高蛋白质翻译的效率和稳定 性。

  1. 总结

疫苗制造和反向工程有这么多的内在联系,是我以前没有想到的事情。BNT162b2 疫苗运用 替换技巧骗过免疫系统,以及替换同等效果的核苷酸提高效率的方法与现代计算机安全防范 技术有异曲同工之妙。

新春将至,愿疫苗为人类带来更好的春天。