06-19-2019, 09:00 PM
我不记得是什么时候开始对固件感兴趣的。2015 年,我开始接触 coreboot. 我先买了台 X60,学会用 flashrom 刷固件。然后买了台 X201 学习用编程器刷固件,当时 ch341a 编程器还没被 flashrom 支持,我是在网上搜索发现了 ch341prog (https://github.com/setarcos/ch341prog),用它给我的 X201 刷机。开始的时候我还不知道写 flash 之前要先擦除,把机器刷砖了之后过了好长时间才知道怎么刷。后来在 BBS 上分享经验,才发现 ch341prog 的作者是我们社团的指导老师。
最早为 coreboot 贡献代码,是发现 coreboot 里面有一个工具在构建的时候还在用 svn,于是做了个小的修复 (https://review.coreboot.org/12710),在为 coreboot 贡献第一个补丁的过程中,我学会了使用 Gerrit Code Review. 那个时候还不知道 coreboot 有 make gitconfig 可以自动配置 git 使其可以在提交时添加 Change-Id,也不知道 git commit -s 可以自动添加 Signed-off-by. 后来学嵌入式,我的大作业选择了把 coreboot 移植到 CubieTruck,在此过程中发现当时上游的 coreboot 在 CubieBoard 1 中跑不起来,后来通过 bisect 发现了问题,进行了修复,于是有了我给 coreboot 的第二个补丁。
我开始给 coreboot 做功能上的改进和错误修复,是在我尝试给联想 ThinkPad T420 安装 Ivy Bridge 的 CPU,我相信 Sandy Bridge 的笔记本不能上 Ivy Bridge 的 CPU 只是固件的限制,用了自由的 coreboot 之后,就没这个限制了。在这过程中,我还尝试移植 coreboot 到 T420,后来有人提醒我 T420 的移植已经在 Gerrit 上了,于是我就用 Gerrit 上的代码。我买到一块 Ivy Bridge 的 CPU 之后,就开始刷机并测试,发现 USB 调试口可以看到调试信息,系统也能启动,但是操作系统启动之前显示不正常,检查代码之后,发现是因为代码假设 T420 用的是 Sandy Bridge 的 CPU,所以核显没有正确初始化,我就写了一个动态检测 CPU 类型,选择相应核显初始化代码的补丁。(https://review.coreboot.org/12087) 在使用的过程中,我发现插两条不同的内存的时候,dmidecode 出错,于是发现了 SMBIOS type 17 生成的代码出了问题,又提交了一个补丁。(https://review.coreboot.org/14008) 这两个补丁同时在 coreboot 的一个的 changelog 中被提及。(https://blogs.coreboot.org/blog/2016/03/...-march-15/)
在给 coreboot 贡献代码的时候,我还同时维护了 coreboot 中的一些部件,如 libpayload 相关 payload 的构建,工具链的更新等。后来我想做一些更有挑战性的项目,恰好 coreboot 有个 autoport 工具,于是开始做 coreboot 的移植。当时我手上有台 HP EliteBook 2760p,而 HP EliteBook 作为和联想 ThinkPad 一个定位的商务本,保有量也不小,因此做它的移植也很有意义。但是 HP EliteBook 的 EC 让我遇到了意想不到的麻烦,EC 固件和 BIOS 存在同一块 flash 里面,如果没有正确地放置,则笔记本没法上电。我到了 2017 年寒假的时候,花了几天的空闲时间进行实验分析,才分析出了 EC 固件的存放位置,和它使用的校验码。解决了启动的问题之后,就是解决 EC 风扇控制和 ACPI 的问题,在这过程中,我积累了不少 UEFI 逆向的经验。最终 HP EliteBook 的支持进入上游,是 2017 年暑假的时候了。
去年(2018年)年末的时候,我看到 coreboot 支持了 Haswell 平台的 ASRock H81M-HDS,于是我开始对 Haswell 平台感兴趣。我入了一套 ASRock H81M-HDS,做了一段时间 Haswell MRC 的逆向分析,后来由于要做毕业论文就没搞下去了。现在有了点时间,就把这些东西重新搞起来,在这期间,NSA 发布了他们的逆向工具 Ghidra,它的反编译器大大提高了我的逆向效率。同时,我还写了针对 Haswell 平台的 autoport,希望可以更容易地把 coreboot 移植到 Haswell 平台的机器上。
最早为 coreboot 贡献代码,是发现 coreboot 里面有一个工具在构建的时候还在用 svn,于是做了个小的修复 (https://review.coreboot.org/12710),在为 coreboot 贡献第一个补丁的过程中,我学会了使用 Gerrit Code Review. 那个时候还不知道 coreboot 有 make gitconfig 可以自动配置 git 使其可以在提交时添加 Change-Id,也不知道 git commit -s 可以自动添加 Signed-off-by. 后来学嵌入式,我的大作业选择了把 coreboot 移植到 CubieTruck,在此过程中发现当时上游的 coreboot 在 CubieBoard 1 中跑不起来,后来通过 bisect 发现了问题,进行了修复,于是有了我给 coreboot 的第二个补丁。
我开始给 coreboot 做功能上的改进和错误修复,是在我尝试给联想 ThinkPad T420 安装 Ivy Bridge 的 CPU,我相信 Sandy Bridge 的笔记本不能上 Ivy Bridge 的 CPU 只是固件的限制,用了自由的 coreboot 之后,就没这个限制了。在这过程中,我还尝试移植 coreboot 到 T420,后来有人提醒我 T420 的移植已经在 Gerrit 上了,于是我就用 Gerrit 上的代码。我买到一块 Ivy Bridge 的 CPU 之后,就开始刷机并测试,发现 USB 调试口可以看到调试信息,系统也能启动,但是操作系统启动之前显示不正常,检查代码之后,发现是因为代码假设 T420 用的是 Sandy Bridge 的 CPU,所以核显没有正确初始化,我就写了一个动态检测 CPU 类型,选择相应核显初始化代码的补丁。(https://review.coreboot.org/12087) 在使用的过程中,我发现插两条不同的内存的时候,dmidecode 出错,于是发现了 SMBIOS type 17 生成的代码出了问题,又提交了一个补丁。(https://review.coreboot.org/14008) 这两个补丁同时在 coreboot 的一个的 changelog 中被提及。(https://blogs.coreboot.org/blog/2016/03/...-march-15/)
在给 coreboot 贡献代码的时候,我还同时维护了 coreboot 中的一些部件,如 libpayload 相关 payload 的构建,工具链的更新等。后来我想做一些更有挑战性的项目,恰好 coreboot 有个 autoport 工具,于是开始做 coreboot 的移植。当时我手上有台 HP EliteBook 2760p,而 HP EliteBook 作为和联想 ThinkPad 一个定位的商务本,保有量也不小,因此做它的移植也很有意义。但是 HP EliteBook 的 EC 让我遇到了意想不到的麻烦,EC 固件和 BIOS 存在同一块 flash 里面,如果没有正确地放置,则笔记本没法上电。我到了 2017 年寒假的时候,花了几天的空闲时间进行实验分析,才分析出了 EC 固件的存放位置,和它使用的校验码。解决了启动的问题之后,就是解决 EC 风扇控制和 ACPI 的问题,在这过程中,我积累了不少 UEFI 逆向的经验。最终 HP EliteBook 的支持进入上游,是 2017 年暑假的时候了。
去年(2018年)年末的时候,我看到 coreboot 支持了 Haswell 平台的 ASRock H81M-HDS,于是我开始对 Haswell 平台感兴趣。我入了一套 ASRock H81M-HDS,做了一段时间 Haswell MRC 的逆向分析,后来由于要做毕业论文就没搞下去了。现在有了点时间,就把这些东西重新搞起来,在这期间,NSA 发布了他们的逆向工具 Ghidra,它的反编译器大大提高了我的逆向效率。同时,我还写了针对 Haswell 平台的 autoport,希望可以更容易地把 coreboot 移植到 Haswell 平台的机器上。