DELL MediaDirect 引导代码反汇编分析

引子

早几月买了本Dell 的 Inspiron 6400, 近日发觉居然有个号称可以不开机播放音乐的MediaDirect功能。虽然知道只是额外安装一个Windows EmbeddedXP系统,按power键引导用户系统,按MediaDirect按钮引导MD系统,不过我倒是想借用此功能实现XP与LINUX双启动,所以有些兴趣。

按着DELL的说明试装了五六次,却始终不能保证原来的系统和新的系统可以互不干扰的启动,耗了2天时间,居然无果而终,只得作罢。
隔日记起,愈发郁闷。对于技术方面的问题,凡是难于解决的或是想不通透的,本人向来会时时惦记,甚至于耿耿于怀,眼见着看似简单的系统问题耗费2日居然不得其解,不由得怒不可扼。

不就是个双系统引导的问题么,DELL自己写了个硬盘引导程序,怎会兼容性如此之差,竟然重装数次无法正常引导?于是重操起以前玩汇编时的那套工具,把装MediaDirect 时DELL强行写入的硬盘引导程序抠出来,转译成汇编,通读一遍,哈,终于霍然开朗。
DELL那帮人写程序也未免太僵化了点,居然把原系统和新系统的分区序号写死在了MBR代码当中,只能固定启动这两个分区,偏偏我的分区过于复杂,他们分析得不对,从而激活了错误的分区导致无法正常引导。至此问题终于水落石出:)

为作纪念,也怕日后忘了又得重来一遍,特将这段汇编代码加以注释,附于文后,以供日后需要时参考。

DELL MediaDirect MBR反汇编 要点

1. 需要激活的分区是通过端口读写功能得到MediaDirect按钮标志判断的
按下power则激活标准系统,按下MediaDirect则激活MD系统

2. 需要激活的2个分区表序号在MBR代码中已经写死,且未必写得确切
(这一点从我重装多次仍不成功即可看出,分区情况复杂时,DELL并不能很好得设置激活分区)
故可能需要手动通过rmbr程序修改

3. 修改分区表的过程:
去活所有分区
根据MD标志
激活特定分区
设置MD2分区隐藏状态

代码

/*****************************************************************************\
* @author: DELL [disass by RyanLee]
* @date : 2006-5-12 12:00
* @note :
* binary data extracted from MD2 MBR,
* and disassembled in debug & W32asm
\*****************************************************************************/

/*
1. prerequisite:
before run this mbr code, MD2 partition number and system partition number
should be set correctly using rmbr.exe (rmbr <vender> <system no> <MD no>)
you can get this no from your PAT
*/

; mbr code is loaded in 0x7c00

proc_mov:
7C00 FA CLI
7C01 31C0 XOR AX,AX
7C03 8ED8 MOV DS,AX
7C05 8EC0 MOV ES,AX
7C07 BE007C MOV SI,7C00
7C0A BF007E MOV DI,7E00
7C0D 8ED0 MOV SS,AX
7C0F 89F4 MOV SP,SI
7C11 FB STI
7C12 B90002 MOV CX,0200
7C15 F3 REPZ
7C16 A4 MOVSB
7C17 EA1C7E0000 JMP 0000:7E1C

; code below are moved to 0x7e00

proc_boot: ; disable all partitions
7E1C BDBE7F MOV BP,7FBE ; [PAT]
7E1F 886600 MOV [BP+00],AH
7E22 886610 MOV [BP+10],AH
7E25 886620 MOV [BP+20],AH
7E28 886630 MOV [BP+30],AH
7E2B FA CLI

/*
2. md flag read operation
send request code 0x79 to port 0x70, then got data back from port 0x71
bit 3 of the flag means whether you press the MD button
reqest: [70] <= 79
data : [71] => flag
*/

proc_read_md_flag:
7E2C B079 MOV AL,79
7E2E E670 OUT 70,AL
7E30 90 NOP
7E31 90 NOP
7E32 90 NOP
7E33 E471 IN AL,71

proc_check:
7E35 FB STI
7E36 2408 AND AL,08
7E38 7516 JNZ 7E50

/*
3. every time the MD2 MBR boot, it will do 3 things to PAT:
1) disable all active partitions

when you press power button
2) hide MD2 partition
3) set system partition active

when you press MD button
2) unhide MD2 partition
3) set MD2 partition active
*/

;***********************************************************
; when press POWER button (AL[3]==0)
;***********************************************************
proc_hide_md:
7E3A 8A4624 MOV AL,[BP+24] ; MD entry in PAT
7E3D 3C07 CMP AL,07 ; is hidden?
7E3F 7505 JNZ 7E46
7E41 04D0 ADD AL,D0 ; no, then hide it
7E43 884624 MOV [BP+24],AL

proc_set_system_active:
7E46 81C50000 ADD BP,0000
7E4A C6460080 MOV BYTE PTR [BP+00],80
7E4E EB14 JMP 7E64

;***********************************************************
; when press MD button (AL[3]==1)
;***********************************************************
proc_set_md_active:
7E50 81C52000 ADD BP,0020
7E54 C6460080 MOV BYTE PTR [BP+00],80

proc_unhide_md:
7E58 8A4604 MOV AL,[BP+04]
7E5B 3CD7 CMP AL,D7
7E5D 7505 JNZ 7E64
7E5F 2CD0 SUB AL,D0
7E61 884604 MOV [BP+04],AL

;***********************************************************
; load pbr
;***********************************************************
proc_read_boot_sector:
7E64 B80103 MOV AX,0301
7E67 B90100 MOV CX,0001
7E6A BA8000 MOV DX,0080
7E6D BB007E MOV BX,7E00
7E70 CD13 INT 13

7E72 B442 MOV AH,42
7E74 B280 MOV DL,80
7E76 BE8D7E MOV SI,7E8D
7E79 668B5E08 MOV EBX,[BP+08]
7E7D 66891E957E MOV [7E95],EBX
7E82 CD13 INT 13

7E84 7205 JB 7E8B

7E86 EA007C0000 JMP 0000:7C00 ; SUCCESS
7E8B EBFE JMP 7E8B ; DEAD!

02/28/2007 补充 : 反汇编时的注意事项

1. debug
n 命令设置输入输出文件名
l 命令导入文件数据
u 命令反汇编代码 (有些情况,比如这里的MBR代码, 反汇编出来的代码不一定正确, 最好使用W32asm)
可将命令序列存为文件, 用重定向传给debug, 这样可以自动话导入导出反汇编的过程.

2. W32asm
在打开16进制代码文件时要勾选"Check for 16 bit disassembly", 不然MBR的代码分析也会有问题.


rating: 0+x

相关话题

评论

Add a New Comment
or Sign in as Wikidot user
(will not be published)
- +
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.