因为一些原因,把笔记本bios升级到了A07,但是我又想把bios降级回原来的低版本时发现不行,最开始我使用的那个软件对bios的备份文件竟然无法恢复(因为升级的时候太想尽快搞定所以没有仔细看,可能是因为程序根本不适用该笔记本的主板型号导致的)!尝试了网上的各种刷bios的软件和方法(包括用dos下的AFUDOS.exe等等),全部失败,对我造成不小的挫败感和郁闷感。我先查看了另一台相同型号的电脑的bios版本是A03,因此我从dell官网上下载了A03版本的bios更新程序(2420A03.EXE),然而当你要更新bios,他会提示“YouareabouttoflashyourbiostoanolderBiosversion.DelldoesnotrecommendflashingyourBiostoanolderversion.PressOKbuttontoexit.”当你点击确定,程序就退出了,让人对此相当的气愤,dell你这个程序凭什么自作主张呢,为什么禁止用户降级bios?我在尝试了所有办法均告失败后,看起来那些网上的工具在此时全部不给力(大概是因为这个笔记本型号比较新的原因使得网上工具统统不适用),我不得不考虑一个最可靠最稳妥地方法,用Dell官网上的bios更新程序刷回去(因为官网可以明确的下载到和机器型号严格匹配的bios更新)。很显然,因为我的bios版本已经被我刷至A07,我想刷回的是版本更低的A03,我知道这个程序执行到最后会弹出那个超级脑残让人绝望的提示,然后退出。因此身处绝境之中这时候唯一想法就是:修改这个程序!找到弹出这个MessageBox的代码然后逆转他的逻辑!这是我此时最后一根救命稻草,也是唯一的希望,如果依然失败我不得不接受这个让我郁闷的现实(那就是将就着用吧),但这最后的救命稻草终将拯救我于危难。于是开工。启动IDA,打开2420A03.exe这个程序,等待一会让IDA分析完毕。让我感到高兴的好消息是,这个程序没有任何的加密和自我保护。很显然它是被直接写出来的程序(从未考虑过防止有人会去修改它而采取保护手段),我又查看了这个程序的资源,感觉里面有一些对话框,仿佛这个程序是对ALUWINGUI程序的一种“封装”,因为里面都是一些ALUWINGUI程序的印记,例如对话框等等。但是我运行网上下载的ALUWINGUI这个程序却总是出现死机状态,所以不得把注意力继续转会到反汇编分析2420A03.exe这个程序上。弹出这个MessageBox的代码非常容易定位,因为这个MessageBox的文本内容是明文放在.rdata的,非常容易就定位到弹出这个MessageBox的代码的位置,找到它们以后,继续向前追踪程序跳转的关键节点,很快就找到位于(.text)地址00466E21处,代码如下:查看文本打印1.1.text:00466E002.2.text:00466E00loc_466E00:;CODEXREF:sub_466D40+9Fj3.3.text:00466E00;sub_466D40+B7j4.4.text:00466E00pushoffsetaWarning_4;WARNING5.5.text:00466E05leaeax,[ebp+Caption]6.6.text:00466E0Bpusheax;LPSTR7.7.text:00466E0Ccallds:wsprintfA8.8.text:00466E12addesp,89.9.text:00466E15movecx,[ebp+var_10C]10.10.text:00466E1Bcmpecx,[ebp+var_214]11.11.text:00466E21jnbloc_466EF0;【重要】要修改的指令!12.12.text:00466E27movzxedx,word_5072F813.13.text:00466E2Eandedx,80h14.14.text:00466E34jzshortloc_466E9315.15.text:00466E36pushoffsetaWarning_5;WARNING!!16.16.text:00466E3Bleaeax,[ebp+Caption]17.17.text:00466E41pusheax;LPSTR18.18.text:00466E42callds:wsprintfA19.19.text:00466E48addesp,820.20.text:00466E4BpushoffsetaYouAreAboutToF;YouareabouttoflashyourBIOStoan...21.21.text:00466E50leaecx,[ebp+Text]22.22.text:00466E56pushecx;LPSTR23.23.text:00466E57callds:wsprintfA24.24.text:00466E5Daddesp,825.25.text:00466E60push31h;uType26.26.text:00466E62leaedx,[ebp+Caption]27.27.text:00466E68pushedx;lpCaption28.28.text:00466E69leaeax,[ebp+Text]29.29.text:00466E6Fpusheax;lpText30.30.text:00466E70push0;hWnd31.31.text:00466E72callds:MessageBoxA32.32.text:00466E78cmpeax,133.33.text:00466E7Bjnzshortloc_466E87大概浏览一下这个函数,发现第11行代码:“jnbloc_466EF0”就是关键分支点,如果var_10Cvar_204,他就会弹出我们最后见到的那个MessageBox,否则他就会跳转到附近的00466EF0位置去正常的刷bios。所以这里只要把jnb改成jb,程序就会完全以相反逻辑运行(把正在刷低版本bios当成刷高版本)。为了修改汇编代码,还需要参考intel的官方文档:《64ia32architecturessoftwaredevelopermanual325462》。对照文档可以指导我们如何修改指令。在IDA中显示jnbloc_466EF0指令对应的是6个字节:“0F83C9000000”,对照文档的介绍可知,前两个字节0F83是JNB的操作码(Opcode),后面四个字节“C9000000”代表地址偏移量是0xC9(201)个字节(即:ifnotbelow,thenEIP=EIP+0xC9)。接下来就是修改这条跳转指令,有多种方法(以下操作码中的操作数均为相对值,即偏移量):(1)把JNB改成JB(操作码:0F82)。只有待刷版本低于当前版本才刷。(2)把JNB改成JNZ(操作码:0F85)。只要待刷版本和当前版本不同就刷。(3)把JNB改成JMP(操作码:E9)。无条件刷。(因为JMP操作码只有一个字节,所以需要补一个NOP),有可能还需要修改一个版本相等的跳转,我没有认真细看了。这里我采用的是(1)。把该exe用16进制编辑器例如UltraEdit打开,IDA中的是进程空间中的逻辑地址,把ImageBase减掉就成为文件地址,而Exe的默认ImageBase是00400000,所以00466E21转换到文件地址是00066E21,跳转到00066E20这一行,把从第二个字节开始的6个字节(0F83C9000000)修改成(0F82C9000000),实际上我们只是修改了一个字节(文件地址为00066E22的那个字节从0x83改为0x82),这样原来的JNB指令就变成了JB指令。修改以后,运行修改后的exe程序,那个烦人的MessageBox如预期的没有出现,而是出现了系统正在关机的提示(有希望了!),然后系统自动重启,激动人心的时刻到了,终于看到进入正在刷新bios的提示(如下图所示),大约1~2分钟,bios刷新完成,然后经过再次进入bios简单检查版本信息,已经回到A03版本一切正常!!!至此,刷回低版本bios就完成了。如果要刷其他版本的bios我估计这里是差不多的,一旦遇到这种版本问题导致的不让你刷,就可以对这个文件进行修改。好在这些bios升级程序并没有对这种修改设置任何障碍,因此只要具有一点汇编知识,借助工具就可以很容易的修改掉这个逻辑。最后额外吐槽一下,dell的这个不合理的逻辑,自由权应该交给用户决定!同时,众所周知,刷bios被形容为具有风险的事情,我的个人意见时,一定要谨慎,如果不是特殊需要(例如为了激活win7以上系统)和有成功的把握,就尽量不要去刷bios。最后关于激活win7再额外说一点,目前几乎所有软破解方法和网上流传的key已经全部失效,而只剩下最后一条路,就是从bios上入手(也就是不管用软件还是硬刷bios,使bios中具有SLIC2.1版本),模拟成大的笔记本oem厂商的产品,这样windows就只能放行,因为尽管这种用手段激活的“盗版”用户数量很多,但是因为它们混杂在数量更加庞大的正版oem产品之中,而目前windows的认证技术还不足以能识别,所以这种“盗版”几乎肯定是安全的。最后提一下目前唯一还有效的win7激活工具是windowsloaderv2.1.6,在此感谢该软件的作者造福windows用户。