某些情况下,我们需要在没有源代码的情况下需要对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;
}
博主 最新 ida破解版能分享一下吗
我是 baidu 搜出来的 “ida x64 破解版”
好的 谢博主