Step to UEFI (231)直接修改 ROM 中的版本号

某些情况下,我们需要在没有源代码的情况下需要对BIOS ROM 进行直接修改。本文就以修改 OVMF.FD 为例介绍这个过程。

首先介绍一下这次修改的目标,使用下面的命令生成 Debug Log:

qemu-system-x86_64 -bios "ovmf.fd" -debugcon file:debug.log -global isa-debugcon.iobase=0x402

其中有下面这样一个错误:

SecCoreStartupWithStack(0xFFFCC000, 0x820000)
LABZ report checksum error!
Register PPI Notify: DCD0BE23-9586-40F4-B643-06522CED4EDE
Install PPI: 8C8CE578-8A3D-4F1C-9935-896185C32DD3
Install PPI: 5473C07A-3DCB-4DCA-BD6F-1E9689E7349A
The 0th FV start address is 0x00000820000, size is 0x000E0000, handle is 0x820000
Register PPI Notify: 49EDB1C1-BF21-4761-BB12-EB0031AABB39
Register PPI Notify: EA7CA24B-DED5-4DAD-A389-BF827E8F9B38
Install PPI: B9E0ABFE-5979-4914-977F-6DEE78C278A6

我们的目标就是通过修改 OVMF.FD 来去掉这个错误。

使用 UEFITool 打开 OVMF.FD ,使用搜索功能查找错误字符串,可以看到是位于 SecMain 中。这个文件没有压缩,对于我们搜索来说会很方便。

为了研究代码,还需要使用这个工具将SecMain 释放出来:

释放出来的文件是以  “MZ”开头的:

 使用 IDA 来分析解压出来的这个文件,特别注意,因为代码中含有64Bit的指令,必须使用 IDA-64 才能得到结果。

我们需要找到相关的代码,在菜单中选择 View->Open subviews->Strings

先用Ctrl+F 找到前面提到的字符串,在字符串上双击即可跳转到对应的代码:

新版本的 IDA 默认使用图形化反编译结果,看起来并不是很直接,右键切换到 Text View

这里就可以看的很清楚,比较 rax 和 rdx ,如果不相等就输出字符串,如果相等就跳过:

使用 Hex View 查看,74 0F就是 jz short loc_FFFCCE37 这个跳转语句,将这条语句修改为 jmp short loc_FFFCCE37 就不会输出错误提示了。

修改方法是:在 OVMF中搜索 FD FF FF 48 3B C2 74 0F (整个文件中只有一处),找到后将 74 修改为改成 EB (JMP)。这样修改后再次使用 QEMU 启动修改后的 OVMF.FD ,可以在 Debug.log 中看到之前的字符串已经消失。

本文使用的,修改之前的 OVMF 可以在这里下载:

这个信息是在 Omvf/Sec/SecMain.c 中加入如下代码生成的:

//
  // Find PEI Core entry point
  //
  Status = PeCoffLoaderGetEntryPoint ((VOID *) (UINTN) PeiCoreImageBase, (VOID**) PeiCoreEntryPoint);
  if (EFI_ERROR (Status)) {
    *PeiCoreEntryPoint = 0;
  }

//LABZ_Debug_Start
	if (((EFI_PHYSICAL_ADDRESS) FindImageBase -(EFI_PHYSICAL_ADDRESS) FindAndReportEntryPoints)!=0x0) {
		DEBUG ((EFI_D_ERROR, "LABZ report checksum error!\n"));
	}
//LABZ_Debug_End

  return;
}

《Step to UEFI (231)直接修改 ROM 中的版本号》有3个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注