本帖最后由 cracker_007 于 2019-10-26 04:53 编辑
此贴算个教程贴,基于最新BIOS 2.54修改。不敢说100%原创,主要是参考了一个国外网友的帖子,我主要是翻译一下,顺便改进+实践操作。
另外,BIOS数据备份和刷入的一些操作细节请参考《【原创】T440P解锁Bios高级菜单》
工具: IDA Pro UEFITool WinHex
先用UEFITool打开备份出来的BIOS文件,找到LenovoWmaPolicyDxe,把PE32 Image提取出来,随便命名。 用IDA Pro打开提取出的文件。IDA会自动识别文件格式,不用改其他东西,直接点OK就好。
然后出现反汇编界面。
本人已将BIOS升级至最新2.54,如果是其他版本,左边的函数列表可能会不一样。进入options->general设置,将opcode宽度设置为16,这样反汇编界面就会显示HEX数据了, 比如这样。
按F5快捷键,进入C语言界面。里面的函数都不长,第二个函数sub_710就是打印错误信息的函数(Unauthorized network card is plugged in - Power off and remove thenetwork card),
在最上方sub_710函数上点右键查看函数在哪里被调用
弹出对话框
点OK确认就定位到了调用位置,是在sub_824中调用。Sub_824这个函数不算长,从代码逻辑上看,主体就是一个if-else,应该一个是判断网卡,一个是判断蓝牙。但如果不在白名单里,就会进入打印函数sub_710,然后卡在那里。
这里修改的方法就是,将LABEL_9放到划红色的那个语句上去,跳过错误打印函数。最开始做过测试,如果在判断白名单if-else之前就退出该函数,会导致开机进入系统后,无线网卡的初始化错误,无法修复。所以无论在不在白名单里,程序都要继续往后跑,继续其他的初始化工作。大家可以双击qword_2B0看看,这个东西在上面判断的时候用了很多次,里面放的就是白名单。点击“IDA View - A”视图,查看调用sub_824函数中调用sub_710的汇编。划横线call sub_710的就是调用点,最下面的那个红圈就是让BIOS卡住的while死循环。
要让程序继续跑,就不能让他进入sub_710,所以,我们要让他跳转到正确的地方。哪里是正确的地方呢?根据C语言和汇编语言的对照来看,那个“正确的地方”就是loc_945的逻辑块。
那个call sub_710的指令长度是5字节,而巧的是,jmp指令在这里不能用short(2 字节),所以也刚好是5字节,天助我也,开始打补丁!把鼠标光标放到call sub_710那一行,进入Edit菜单,Patch program->Assemble,在打开的对话框里输入jmp loc_945,点OK
然后关掉Assemble对话框。原来调用sub_710的逻辑块就编程了下面这样。
进入“Hex View - 1”视图,可以看到修改位置的偏移地址为08A8(从E8 63 FE FF FF变成了E9 98 00 00 00)。
如何修改到讲这里可以说是很明白了。关闭IDA什么都不要保存,用winhex打开提取出的LenovoWmaPolicyDxe二进制文件,然后定位到08A8,把E8 63 FE FF FF改成E9 98 00 00 00。
将改好的bin文件用UEFITool替换回去保存,然后用编程器把BIOS刷回去即可。
刷好后记得盖好盖子,开机会有5x2的报警声,我没有关闭什么security选项,直接进入BIOS按F10保存,后续重启不会再有报警声,一切正常。
9260ac可以被win10直接识别,ax200需要去intel官网下载驱动。
此法适用于任何BIOS版本,也可以做其他修改。发帖目的仅仅是出于技术共享,希望大家玩机开心
|