分类 BIOS_MOD 下的文章

SLIC表头很多都在BIOSCODXX.ROM文件里,对于直接替换SLIC表而出现数字签名不完整的BIOS,可以通过增加额外ACPIXX.ROM来达到增加SLIC的目的,但是这样刷完会出现两个SLIC表,看着着实变扭。通过对BIOSCODXX.ROM的汇编代码分析,我们可以很容易的将原SLIC屏蔽掉。

BIOSCODXX.ROM前27字节为非代码区,作为模块识别码。
3edd751ex7cdaa6a70c4a&690.jpg
为了方便分析,先将其截去
3edd751ex7cdaab8148f5&690.jpg
查找SLIC表头地址
3edd751ex7cdab01870cb&690.jpg
SLIC表头地址:0x0F187;接下来用hiew32打开文件,查找HEX:87F1
3edd751ex7cdac70050b1&690.jpg
这个就是SLIC表头的生成代码,0xF160为调用入口地址,接下来只能往上或往下去寻找 CALL 000F160的汇编语句
3edd751ex72e2b050cff2&690.jpg
不难发现,在调用SLIC表的生成前有两个判断是否要生成SLIC表,既然要废弃掉SLIC,就让其跳过SLIC生成的条件,修改地址0xF07B,其汇编代码为:JMPS 0FA3,这样就跳过了SLIC的生成了。最后记得把去掉的27字节重新补上,否则后果很严重。

软件大小:851 KB
软件语言:英文
运行环境:Win2K/XP/2K3/Vista/2K8/7

   (需安装Microsoft .NET Framework 2.0或以上版)

软件授权:免费软件
更新时间:2009-11-26

软件简介:
  AwardTool是一款针对Award的修改软件,它采用ISA/Pubkey/超
静3/动态/0+2/OEM7等若干方法来完成BIOS中嵌入SLIC表以及SLP字
串的处理。
  AwardTool.exe为英文原版;AwardTool_sp.exe为特别版。

对于有MINIT、HTINIT、1PE32、1PE32B、2PE32、2PE32B模块的BIOS,在MODBIN6.EXE不支持、CBROM32又不能修改的System BIOS模块的情况下,想手工修改ORIGINAL.BIN主文件是件很麻烦棘手的事,而AwardTool.exe却可以很完美的将修改好的ORIGINAL.BIN主文件重新打包回BIOS,但遗憾的是这个过程是全自动完成的。有时想对ORIGINAL.BIN主文件稍作些修改再打包回BIOS却也无能为力,为了充分利用AwardTool.exe的功能为我们更好的办事,才特意反编译AwardTool.exe(希望作者谅解,一切都是为了更好的DIY),修改其流程将原来的写出MAIN.BIN和ACPI.BIN改为读取MAIN_MOD.BIN和ACPI_MOD.BIN,所以在AwardTool_sp.exe修改过程中必须要有MAIN_MOD.BIN和ACPI_MOD.BIN这两个文件同在目录下,AwardTool_sp.exe是通过读取目录下的MAIN_MOD.BIN和ACPI_MOD.BIN来完成修改替换BIOS的。MAIN_MOD.BIN相当于MODBIN6.EXE解压产生的ORIGINAL.BIN主文件或AwardTool.exe修改后保存的MAIN.BIN,ACPI_MOD.BIN相当于用CBROM32导出的ACPITBL.BIN或AwardTool.exe修改后保存的ACPI.BIN。

注:本想只用此程序来替换MAIN.BIN主模块完成修改而已,因为如果把ACPI.BIN加上374字节的SLIC表肯定是压不回BIOS的,修改过程会出错无法继续,感觉有点鸡肋。但是为了让大家各取所需还是把这个功能补上。

本修改版的AwardTool_sp.exe只适合有DIY经验的爱好者,请确保MAIN_MOD.BIN和ACPI_MOD.BIN是你所修改的BIOS的模块,否则后果很严重。

声明:仅用于试验环境的技术研究以及漏洞的验证。不涉及任何有
版权的内容,仅供技术交流研究之用。请使用者在24小时内删除,
由此引发的纠纷,一切后果自负!

             BIOS之家 Yangzai
               2009.11.26

附件下载地址请到BIOS之家

花了一天的功夫终于搞定HA-943GML-ML R261SCVX BIOS SLIC表动态寻址。

为了方便大家学习交流,也为了自己日后AWARD BIOS的修改积累思路和方法。

SLIC产生的原理:

1、SLIC依靠RSDT/XSDT表的导向作用,相当于RSDT/XSDT表的子表,也就是只要把SLIC表的32位地址,记录在RSDT/XSDT表内就可以产生SLIC表。
这是所有BIOS ACPI表子表产生的原理。静态方法也是用这个原理来产生SLIC表的。

AWARD BIOS的修改的基本思路:

1、修改ACPITBL.BIN,增加SLIC表;

2、修改ORIGINAL.BIN或GGROUP.BIN,增加SLIC表的寻址;
第1步的修改很简单就能完成,关键点在于第2步的修改。

具体步骤如下:

1、用16位编辑器打开ACPITBL.BIN,将RSDT表长度数值加4,且在表尾增加4字节的00。接下来就是SLIC表的添加,通常是在ACPITBL.BIN文件尾补足1至3个字节的 00,这是为了保证合并SLIC.BIN文件后,SLIC表头的地址能能被4整除。我的做法是SLIC紧跟RSDT表,由于SLIC为374字节,不能被4整除,将影响FACP的表头,所以在SLIC表尾增加2字节的00。
改前的截图
3edd751ex791a006345a6&690.png
改后的截图,黑色为差异处,蓝色为SLIC表,
3edd751ex791a028e7a76&690.jpg
新增的4字节为存放SLIC表的32位索引地址,偏移量为30。
2、修改ORIGINAL.BIN文件,查找RSDT,找到如下信息
3edd751ex791a07572d4a&690.png
太幸运了,前面还有刚好4字节的位置,可以放下一个表头。接下来就考虑SLIC存放的位置:
1、存放在RSDT前,将连锁影响到后面的表头索引地址偏移4字节;
2、存放在FACS后,感觉还是有点问题;(后面会提到)
3、存放在FACS前,那就是占用了FACS表头索引地址,只影响到后面的表头,比存放在RSDT前少了不少的修改,这个应该是最合适的。整个表前移4字节,由A290移到A28C,修改如图
3edd751ex791a0b5a69e9&690.png
接下来就反编译ORIGINAL.BIN,个人习惯使用hiew32进行反编译修改。
打开ORIGINAL.BIN文件,由于表由A290移到A28C,按F7,查找HEX:90A2, 来到这里
3edd751ex791a0eb08c99&690.png
按F3把A290修改A28C。由于已经增加了SLIC索引,把“MOV cx,5”姑且改为“MOV cx,6”。RSDTFACDSDTAPICMCFGFACS不是有6个表名,怎么cx寄存器才设置为5,难道FACS不在其内?带着这个疑问,继续往下。
按照前人的修改教程可知,8E44 为RSDTFACDSDTAPICMCFGFACS中RSDT表存放其索引地址的地址。
那么其他表依次存放的地址如下:

8E44  RSDT
8E48  FACP
8E4C  DSDT
8E50  APIC
8E54  MCFG
8E58  FACS
8E5C

如今我们已经新增加SLIC索引项,那么新的存放地址如下:

8E44  RSDT
8E48  FACP
8E4C  DSDT
8E50  APIC
8E54  MCFG
8E58  SLIC
8E5C  FACS
8E60

也就是SLIC占用了原先FACS的索引地址的地址,按F7查找HEX:588E
3edd751ex72829ba75add&690.png
刚好在其下,将8E58改为8E5C,A2A4正是FACS的位置,可见FACS的索引和RSDTFACDSDTAPICMCFG的索引是分开的,这也就是我选择把SLIC放于FACS前的原因,由于FACS没移位就省得改了。再按F7查找HEX:588E
3edd751ex791a186077f1&690.png
这里就是把FACS表的索引地址添加到RSDT表中,同样把8E58改为8E5C。由于FACS占用了8E5C,为了防止8E5C地址的重复使用,得再查找HEX:5C8E
3edd751ex791a1ed6faff&690.png
按F3把8E5C改为8E60,再查找HEX:608E,这次只找到毫不相关的代码。至此RSDTFACDSDTAPICMCFG重新定位寻址算是完成了,但是新增的SLIC索引地址还没加入到RSDT表中。
回到索引地址添加的地方
3edd751ex791a22f5594f&690.png
由于在ACPITBL.BIN中的RSDT表已经为SLIC表的索引地址设置好了偏移量为30的存放地址,现在只要把SLIC表的索引地址存入到RSDT表偏移30的位置处就可以完成RSDT表对SLIC表索引了。
3edd751ex791a26982923&690.png
去掉两句
or eax,eax

je 00000A4BF
这本是检验数值是否是0(空指针),以防系统崩溃的预防措施。整理得到如下代码
3edd751ex791a280310f6&690.png
到此全部修改完成。把ACPITBL.BIN和ORIGINAL.BIN替换掉原BIOS里的模块就OK了。

进入下载页面

向BIOS 添加SLIC表的方式有两种,分为静态和动态。静态方法比较简单,相对安全些,不需要进行反汇编操作,但是被微软的几率远大于动态方法。因为静态方法SLIC表在内存中的地址是0FFF00000H ~ 0FFFFFFFFH(静态2)和 0000FF200H(静态3)左右,所以只要微软一个补丁就可以全面的。前些日子用静态工具修改过一些AMI BIOS ,发现Vista OEM Business 死活激活不了,痛下决心决定好好研究下动态的修改方法。毕竟已经有很多前辈修改成功过了。参考借鉴了作者NopWorld的《给AMI BIOS 添加SLIC表及修改过程中的分析资料》

下面以Microsoft Virtual PC 2007 BIOS为例,分析一些修改的内容。
1) 先用EXESCOPE 导出Virtual PC.exe 里bios->13500->1033模块,保存为“BIOS.ROM”。
2) 运行MMTOOL v2.22.1,点击“Load ROM”,选“BIOS.ROM”。选择Extract标签,然后选中ID中的1B(Single Link Arch BIOS)模块。“Extract Module”要选中“In uncompressed form”,否则会以压缩的形式解压。点击“Browse”选择模块的保存路径,这里是“D:\OEMSLIC\1b.bin”,然后按“Extract”按钮解压。
3) 用UltraEdit打开1b.bin,将RSDT表偏移4H的长度从28改成2C。复制XSDT总共2C字节的数据,覆盖到RSDT表的40H偏移处。修改RSDT表和XDST表。
4) 再打开lenovo或者其他牌子的SLIC文件,复制其总共176H(374)字节的内容,覆盖到RSDT表的80H偏移处,刚刚好可以放下。然后保存。修改后如下图所示
3edd751ex7ce145511021&690.jpg
前期的准备工作到此结束。
用HIEW32打开1b.bin,修改以下地方:

(1) 0002AC66: 662EA36400         mov   cs:[0064],eax
(2) 0002AD80: 662E8B3E4400        mov  edi,cs:[0044]
(3) 0002AD86: 67662E898740000000    mov  cs:[edi][00000040],eax
(4) 0002AD8F: 662E8306440004      add  d,cs:[0044],004 ;" "
(5) 0002AD96: 665F              pop  edi
(6) 0002AD98: C3                retn

以上部分修正XSDT表,去除了“mov cs:edi,0000”

(7) 0002AD99: B88000            mov   ax,00080 ;"

附件上远景 http://bbs.pcbeta.com/thread-282969-1-1.html