有关当前HP BIOS的最烦人的功能之一就是其实施的白名单。引导时有问题的硬件的UUID。如果它与BIOS查找表中列出的任何可接受的硬件都不匹配,则将产生错误并拒绝引导。HP当前将WIFI和WWAN卡都使用白名单。这是安装未经授权的WIFI卡的常见错误:
我在1月份搜索带有内置蓝牙的WIFI卡时完全不知道这一点,该卡与hackintosh和aircrack完全兼容。这些要求导致我购买了Atheros AR9285和AR3001 BT组合卡。因此,一经安装,我的笔记本电脑HP dv7t-4100就会产生104不支持的无线网络设备错误。这次事件使我首先参与了Insyde BIOS的修改。正如我之前说过的那样,通常无法将这些教程保持为我所希望的通用。很少有两个不同的BIOS会以完全相同的方式实现此限制,因此不要指望按照本教程逐字删除特定BIOS中的白名单。让我们开始学习本教程。如果您想使用相同的BIOS,我跟着一起,那么这里就是你可以下载它。我假设到现在为止您已经阅读了其他一些教程,因此我不必再研究一些基本知识了。就像在所有其他软件中一样,打开BIOS安装程序的包装,以便您可以访问BIOS ROM。在Andy的工具中打开ROM,然后按“结构”按钮。我们要查找包含“ 104不支持”字符串的模块,因此让我们提取DXE Core模块并使用十六进制编辑器将其打开。您可以在此处获得与我使用的相同的十六进制编辑器HxD 。您还可以在此处获取最新版本的Andy工具。
请记住,Insyde BIOS在其字符串中使用Unicode字符,该字符长16位。这个额外的字节通常只是一个空字节,因此将要搜索的字符串中的所有字符分隔00秒。如果您查看我要搜索的内容,这将更有意义。它在偏移量0x323C2E处找到了它。
现在让我们搜索标记模块开始的字节序列,即4A 5D。这样,我们可以看到上一个模块的名称,即包含我们找到的字符串的模块的名称。
因此该字符串位于BiosLockPcie模块中。您的可能在其他模块中。让我们回到Andy的工具以找出该模块的GUID。我的是E62F9F2F-4895-4AB5-8F1A-399D0D9C6B90。
现在使用IDA Pro在由Andy工具生成的DUMP文件夹中打开该模块的相应文件。记住要打开最大的文件。如您所见,这里有几个E62F9F2F-4895-4AB5-8F1A-399D0D9C6B90文件,但我只打开了8 KB。
现在,让我们使用IDA Pro为我们确定的默认文件格式。我的是AMD64的可移植可执行文件。
最终成为我真正的小模块。这使我假设BiosLockPcie的唯一任务是强制执行BIOS WIFI白名单。将错误的地址加载到其中一个CPU寄存器后,很可能会进行此检查。让我们在此模块的数据部分中找到该字符串,然后查看从何处引用该字符串。我发现在IDA Pro的十六进制视图中更容易做到这一点。矿山的偏移量为0x18000120E。
现在切换回装配视图以查看引用此偏移量的对象。嗯...这很奇怪,没有东西引用这个偏移量。
因此,Insyde BIOS具有几种不同的受支持语言。为了优化这一点,他们使用的编译器将所有不同的语言字符串捆绑在一起。因此,现在任何代码都只引用该束的第一部分,然后由一个不同的变量确定该束中的哪个位置开始显示。因此,让我们向上滚动直到我们看到被引用的地址。当您找到一个时,您会知道,因为它的右边会有蓝色文本显示这些调用函数的偏移量。向上滚动大约50-100个字节后,我发现了它。
通常,我们会去所有不同的呼叫位置,但是由于只有一个,所以我们的工作现在要容易得多。双击蓝色文本跳到那里。让我们看一下调用此新函数的方式。右键单击它的名称,然后选择“外部参照”。通过查看弹出的图表,我们可以看到此函数由该模块的入口点直接调用。
我们如何看待该模块的入口点。双击IDA Pro功能窗口中的DllEntryPoint。与您将看到的大多数功能相比,此功能非常简单。既然我之前说过,此模块将在执行白名单检查之前先加载文本,然后让我们看看在加载文本之后调用了哪些功能。现在事实证明,有多种方式引用功能是IA-64组件。一种是调用它,另一种是跳转到它,第三种是使用lea操作码。Lea代表负载敏感地址,该地址可用于计算地址的表达式,然后将指向该值的指针移至指定的寄存器中。事实证明,加载文本后使用了几个lea命令。因此,这是我们所有可能的选择:
让我们消除一些可能性。第一个呼叫命令是呼叫qword ptr [rax + 80h]。这意味着它将在rax寄存器中的值的偏移量加上十六进制的80处调用函数。在使用Insyde BIOS几个月后,我确定它将进行这些类型的调用以访问其他模块中的功能。跟踪该调用的去向有些困难,因此在本教程中我将不介绍如何执行该操作。无论如何,我们知道白名单检查发生在此模块的代码中,而不是其他模块的代码中,因此无需查看该调用的去向。让我们看一下第二个调用函数,它调用0x180000D08。
因此,此函数在返回之前有两个lea命令和一个call命令。第一个lea命令到一个空位置,而call命令正在另一个模块中调用一个函数。因此,第二条lea命令可能是此功能的唯一线索,可能是我们的白名单。让我们检查一下0x180016A0是什么。
这个位置只是数据。因此,程序分为几个不同的段,但主要的段是文本段和数据段。文本包含运行的实际代码,数据包含该代码使用的数据。如果你不知道汇编语言什么,那么我强烈建议你阅读这本书。对于任何类型的软件逆向工程,您都需要了解目标应用程序所运行的处理器的汇编语言。由于我们的BIOS在Intel或Intel兼容处理器上运行,因此我们应该了解IA-64和IA-32组件。否则,这种BIOS修改工作将非常困难。所以去读那本书。返回本教程,因此此处没有实现白名单,因为它位于数据部分。因此,让我们回到切入点,以查看我们基于假设和我们检查的内容剩下的选项:
因此,白名单发生在这四个lea命令之一中。与调用或跳转命令相反,要使用lea实现此目的,它所引用的函数将必须包含一个无限循环。这样,当处理器尝试加载该函数结果的有效地址时,它将陷入无限循环,并且永远无法完成。因此,让我们检查每个lea命令的参数,以便我们可以消除更多选择。
因此,现在只有两种可能的选择。让我们选择0x1800004A8,因为它首先被引用。请记住,我们正在寻找一个无限循环,因此,如果在此函数中或在它导致的函数中找不到任何循环,那么这不是我们要寻找的循环。
基于我们在IDA Pro的图形视图中看到的内容,我们可以看到现在存在无限循环。同样,在查看了所有函数之后,我可以确认该函数中没有无限循环。让我们根据我们淘汰的原因来检查我们的最终选择。我们最后的希望是地址为0x1800003E8的函数。这是整个功能,因此我们可以更好地看到它:
和预期的一样,存在无限循环。因此,它在jnz语句之前调用的功能之一必须将我们的WIFI卡的UUID与白名单进行比较,如果未通过检查,它将非零值移动到al中。如果测试汇编命令的两个参数都等于零,那么它将设置零标志。由于我们正在尝试使用列表中未列出的WIFI卡,因此我们在分支的底部发送了无限循环。使用起来很幸运,因为在执行此功能后,我们有些选择了。因此,如图所示,让我们避免该分支。这将完全避免无限循环。让我们将其从不为零的跳转更改为从jnz到jmp的无条件跳转。那就是它将始终转到偏移量为0x1800004A0的分支。因此,该跳转的十六进制值为0F 85 9A 00 0000。前两个字节是跳转的类型,复位是跳转的位置。无条件跳转的十六进制值为E9。那只是一个字节,因此我们还需要在其中进行一次无操作90。因此,结果为90 E9 9A 00 0000。进入IDA Pro的十六进制视图,右键单击并选择编辑,应用更改,然后右键单击并按提交更改。IDA Pro实际上并未将这些更改写入原始文件,因此我们稍后必须使用十六进制编辑器来完成。这是实际的更改:
现在函数看起来像这样,它成功避免了无限循环。白名单终于删除了!
现在,将这些补丁应用到文件。下一部分与我之前的教程相同。我希望你们不要介意我只复制并粘贴它。通过转到文件|在IDA Pro中生成DIF文件。产生文件| 创建DIF文件。我建议您不要将其保存在DUMP文件夹中,因为在某些时候它很可能会被Andy的工具删除。DIF文件包含我们在IDA Pro中所做的偏移和更改。IDA Pro无法物理编辑文件,因此我们必须使用DIF文件中的信息和十六进制编辑器来应用更改。您可以立即关闭IDA Pro。在使用十六进制编辑器实际应用更改之前,请返回Andy的工具并按“高级”按钮。我们希望能够对模块进行修改。这些是我更改的设置。我还检查了No SLIC,因为否则我们将不得不选择SLIC表以重新打包更改。我的BIOS当前的SLIC表很好。
按“完成”返回到Andy工具的主屏幕。然后按执行按钮。出现此消息时,请不要按“确定”。
我们需要首先修改设置实用程序模块。因此,请打开我们用十六进制编辑器反汇编的同一文件,并根据DIF文件的说明应用更改。
保存文件。现在,您可以在Andy工具的消息上按“确定”,它将使用修改后的模块重新包装BIOS。让我们尝试一下。将Andy工具的输出文件重命名为mine的01448F13_SLIC.bin,重命名为mine的01448F13.bin。这将用修改后的rom替换原始rom。现在运行InsydeFlash.exe。按开始,等待其初始化,然后按确定。现在,它将使用修改后的BIOS刷新计算机,然后重新启动。现在,您可以安装所需的任何WIFI卡,而在启动时不会出现错误。尽管我想进一步了解WWAN白名单,因为我们已经处于这种思维定势中。现在,删除WWAN白名单的过程几乎相同。如果要删除它,请在DXE Core模块中搜索字符串105检测到不支持的无线宽带设备。我的WWAN白名单最终在GUID为7FA4AE0A-1404-4DCC-BE28-CE58029CF5D1的BiosLockUsb模块中实现。我执行了查找无限循环并避免无限循环的相同方法。即使我个人无法确认这确实删除了WWAN白名单,但我还是认为确实如此。我确实尝试使这些教程尽可能通用,但这通常会失败,因为没有两个BIOS完全相同。因此,在找到真正实现白名单的功能之前,我有目的地检查了每个不正确的功能。我希望你们看到更多有用的方法来处理反汇编代码,希望这些技术将帮助您从BIOS中删除白名单。希望您喜欢本教程。另外:我根据此方法修改G4系列,实测有效,修改模块为StartUpMenu模块,修改后刷新时要使用pojie后的去RSA验证的刷新程序,具体修改方法参考另外一帖