|
beiyuly
初级用户
 
积分 95
发帖 40
注册 2006-10-8
状态 离线
|
『楼 主』:
我写的加载mbr的程序,asm代码,然后跳转执行
加载mbr到7c00h,然后跳转过去。
我在dos下运行,但是失败了,有没有高手告诉我为什么啊?
.model tiny
.code
org 100h
start: jmp begin
begin:
CLI
xor ax,ax
mov ss,ax
MOV SP,7C00h
MOV SI,SP
PUSH AX
POP ES
PUSH AX
POP DS
STI
CLD
mov bx,7C00h
mov ah,02h
mov al,01h
mov cx,1
mov dl,80h
mov dh,0
int 13h
;JMP cs:7c00h
db 0EAH,0,7CH,0,0
end start
|

http://beiyu.bokee.com |
|
2006-10-9 06:01 |
|
|
DOS95
初级用户
 
积分 112
发帖 49
注册 2006-9-23
状态 离线
|
『第
2 楼』:
首先要明白一点,MBR 是在开机加载硬盘时执行的。当 BIOS 要从硬盘启动时,CPU各寄存器值都是初始化值,MBR 的代码中给 SS、DS、ES 赋值只是为了可靠而己。
真正出问题的地方在于中断向量,包括 DOS 在内的操作系统启动后都会接管 INT13。以 DOS 为例,加载 IO.SYS 后 INT13 的入口地址与加载 MBR 时的 INT13 入口绝对不同,你用 deubg 的 p 命令试一下就知道了。(这点我很早时自己写多系统引导程序时就发现了)。
还有一点,物理地址 0:7C00h 处的内存在你调试程序时有没被其它程序使用?要是其它程序用到这一块会怎么样就天知道了。
其实,只要一条 INT19 就可以重启系统,不过前提在不能和内存管理程序冲突。以 WIN98 启动盘来说,没有 HIMEM 和 EMM386 的话,INT19 就只会直接加载启动设备,不再经过自检那一步了。
|
|
2006-10-11 20:03 |
|
|
beiyuly
初级用户
 
积分 95
发帖 40
注册 2006-10-8
状态 离线
|
『第
3 楼』:
DOS95
我把mbr拷贝到空间0000:9000开始的地方,改掉内存中的相对地址,从这个地方开始运行,这个时候可以正确的引导ntldr,但是问题处在了你说的中断向量,就是int 13h,在一个调用的时候产生了死循环,调用的扩展int 13h是 mov ax,42h,这个时候可能42h的操作出了问题,不知道你有没有办法呢?
|

http://beiyu.bokee.com |
|
2006-10-12 16:38 |
|
|
DOS95
初级用户
 
积分 112
发帖 49
注册 2006-9-23
状态 离线
|
『第
4 楼』:
DOS 编程中有一点是明令禁止的,就是中断不可重入。DOS 操作系统在启动后,会重置 INT13,加入一些自己认为有必要的功能,最后调用原 INT13 的功能来实现。
当 NTLDR 加载后,NTLDR 也会重置 INT13。这时问题就来了,NTLDR 调用的是自己的 INT13 功能,它的基础是 BIOS 的 INT13,但原来 IO.SYS 下的 INT13 入口并没还原成 BIOS 原来的 INT13 入口,这样就会出现 INT13 调用冲突问题,不出问题只能说运气。
对于这种情况,最好的解决方法是自己通过 IO 口建立新的类似 INT13 的功能;不然就得分析出最原始的 INT13 入口,在自己的程序中使用原始入口来实现所要的功能。
|
|
2006-10-15 16:10 |
|
|
beiyuly
初级用户
 
积分 95
发帖 40
注册 2006-10-8
状态 离线
|
『第
5 楼』:
Quote: | Originally posted by DOS95 at 2006-10-15 16:10:
DOS 编程中有一点是明令禁止的,就是中断不可重入。DOS 操作系统在启动后,会重置 INT13,加入一些自己认为有必要的功能,最后调用原 INT13 的功能来 ... |
|
找出原始的 INT13 入口?有没有什么方法?
|

http://beiyu.bokee.com |
|
2006-10-17 07:51 |
|
|
DOS95
初级用户
 
积分 112
发帖 49
注册 2006-9-23
状态 离线
|
『第
6 楼』:
中断向量表
中断向量表保存在内存 0:0 开始的地方,每一个中断占用 4 字节内存,共 256 个中断,占用从 0:0 到 0:03FF 的所有内存。
debug
-d 0:40
0000:0040 10 10 10 10 11 11 11 11 - 12 12 12 12 13 13 13 13
0000:0050 14 14 14 14 15 15 15 15 - 16
上面的 13 13 13 13 就是指 INT13 的入口地址,在操作系统没启动时就是 BIOS 的原始入口。所以,只要在系统没启动时保存到其它地方就可以了。
以在 MBR 中保存中断中量表为例:(要先把 MBR 做个备份!)
xor bx,bx
mov ds,bx
mov es,bx
mov ss,bx
mov sp,7c00h
mov ax,302h
mov mov cx,3
mov dx,80h
int 13h
这样就可以把原始的中断向量表保存到硬盘开始的第 3、4 两个扇区中。
后面的程序就可以先把保存下来的中断向量表还原,那时的调用就是原始入口了。
debug
-a
mov ax,202
mov bx,200
mov cx,3
mov dx,80
int 13
cli
mov si,bx
xor di,di
mov es,di
mov cx,200
repz movsw
sti
OK!还原了。
|
|
2006-10-17 12:13 |
|
|
beiyuly
初级用户
 
积分 95
发帖 40
注册 2006-10-8
状态 离线
|
『第
7 楼』:
通过硬编码,还原了int13中断,系统可以成功的加载,感谢你的信息~
|

http://beiyu.bokee.com |
|
2006-10-18 07:52 |
|
|
pczu
初级用户
 
积分 104
发帖 2
注册 2003-6-8
状态 离线
|
『第
8 楼』:
可以在mbr中加入一短代码以输入口字,不影响任何中断达到加密的目的。
我以前试过
|
|
2006-10-19 02:11 |
|