HSIAO-YANG CHEN 发布的文章

软件大小: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了。

进入下载页面

3edd751ex7745c390e544&690.jpg
最近研究了XP启动引导文件多重启动菜单,顺手做了个XP SP3 17 OEM 大合集,集成了AMD、NVIDIA、INTEL 主板的SATA驱动和exFAT文件系统补丁,为了使光盘容量尽量小去除了XP升级方式,只能通过光盘进行全新安装。本光盘镜像使用微软的CDIMAGE进行制作,镜像文件的排放顺序应该比UltraISO更合理,安装速度更快。所有的安装文件均拷贝至MSDN最新的XPSP3光盘镜像(4个品牌激活OEMBIOS除外),安装完成的系统绝对干净。只要你的机器BIOS能通过验证,安装完成后都是激活状态,绝非修改WINLOGON.EXE、去除OEMBIOS.BI_ 达到减少光盘体积的残缺版本,最大程度上和原版保持一致,可以放心的通过Windows Updata进行升级补丁,不会因为系统补丁和正版增值更新WINLOGON.EXE造成,系统密钥验证失败的悲剧。经常给同学、朋友和同事装机的达人不妨下个备用,这个光盘对于国内品牌机器应该还是非常实用的。
进入下载页

3edd751ex76cfd0d82db1&690.jpg
3edd751ex7247fb64d523&690.jpg
这是制作完的光盘在机器上实际启动的画面,屏幕顶上还有其他非预期的提示信息在,直接造成了最后的显示信息靠在屏幕底部的囧样。于是有了美化这个想法,增加一个清屏效果。BIOS的屏显调用的是INT10中断,于是Google下相关的信息,在http://www.uv.tietgen.dk/staff/mlha/pc/Prog/ASM/INT/INT10.htm找到想要的内容
3edd751ex76cfd3306ff7&690.jpg
6:scroll up (clear screen) 就是我想要的效果,继续
3edd751ex7247fba6459b&690.jpg
清屏效果寄存器的设置,转化成堆栈代码

push       ax
push       bx
push       cx
push       dx
mov        ah,7
mov        al,0
mov        cx,0
mov        dx,0184F

mov        bh,7
int         10

pop        dx
pop        cx
pop        bx
pop        ax

有了理论基础,就开始动手修改。就在
3edd751ex76cfd5bdeeca&690.jpg,这句显示之前加清屏效果。这句就位于BOOTFIX.BIN文件中。在3edd751ex76cfd96c07d0&690.jpg找到调用3edd751ex76cfd5bdeeca&690.jpg相关的代码,修改CALL 129语句跳转到新增的代码段,结果一开始显示倒是和预期的效果一样,可是一倒计时,3edd751ex76cfd5bdeeca&690.jpg就没了。后来分析了下,随着时间的推移3edd751ex76cfd5bdeeca&690.jpg后面的“.”号依次增加,估计这条语句的调用应该是多次的,这样复杂度似乎是增加了些,对于像我这样急性子的人来说,当然要走捷径绝不绕远路。换个思维方式,干嘛不在BOOTFIX.BIN载入就来个清屏动作。于是分析文件的头部信息
3edd751ex76cfdad16976&690.jpg
,前面都是进栈操作,INT 13开始调用BIOS中断处理,于是把前一句“MOV dx,80”改成“call 3C9 ”,调用处理新增加的清屏代码,当然“MOV dx,80”还是得记得补上才行。由于清屏会使光标回到屏幕的最左上方(0,0),这样文字顶在屏幕边上也不好看,于是有查找了相关INT 10的光标位置设置
3edd751ex76cfdc14cff9&690.jpg
这样一来就完美了。

最终新增的清屏代码如下
3edd751ex76cfe1cecf3d&690.jpg
OK,做成ISO,用虚拟机测试下均正常。接下来用可重复擦写CDRW刻成光盘,放到实机上测试下
3edd751ex76cfe369943f&690.jpg
3edd751ex76cfe4bd0ed0&690.jpg
很完美和我预期的效果完全一致,屏幕上下方均保留一行,和微软原版安装光盘启动效果保持一致

近日对这个短小精悍且兼容性极佳的XP启动引导文件多重启动菜单十分感兴趣,特意还做了张17合1的XP OEM安装光盘,光盘总容量701MB。由于本人安装光盘的文字菜单部分较长,为了最大化利用有限的资源,不得不对其进行分析一番。

先看下本人已经挪位修改的目录描述
3edd751ex7247f87ead1a&690.jpg
当前起始位置为7B8,结束位置为7FD,总共70字节,去掉菜单项描述(7B8)1字节、目录字节宽度描述(7B9)1字节,剩68字节,最多可以有17个菜单项。
3edd751ex76cfb6bd06f3&690.jpg
修改 0000011C: 3A06B807 cmp al,[07B8] //指向新的菜单数描述

修改 00000126: A2B707 mov [07B7],al //指向新的临时变量地址

加亮部分简单分析:判断键盘输入的AL寄存器,是否在“A~Z”之间,通过“and al,1F”,得出一个值,当小于等于菜单数描述,就将值存入7B7H。
3edd751ex76cfb8428c9d&690.jpg

修改 0000049C: A0B707 mov al,[07B7] //取出临时变量的值,即菜单项
修改 0000049F: F626B907 mul b,[07B9] // al(菜单项)和7B9(目录字节宽度)相乘,得到偏移量,存放于ax寄存器
修改 000004A3: 05BA07 add ax,007BA //偏移量和7BA相加,得出菜单项相对应的目录名称的地址,并把这个地址存入536H,所以想把53BH菜单往前挪位,比较困难。

按照这个规律,便可弹性的调整菜单字节长度和目录长度的矛盾,轻松实现挪位操作。