新手上路
- 帖子
- 12
- 积分
- 18
- 注册时间
- 2006-1-26
|
6#
大 中
小 发表于 2008-8-6 13:24 只看该作者
接上: 引用:seg000:06D6
seg000:06D6
seg000:06D6 sub_6D6 proc near ; CODE XREF: seg000:0652p
seg000:06D6 ; seg000:06C7p
seg000:06D6 pushf
seg000:06D7 call dword ptr ds:22h ;调用修改的jmp 原int13指令中的dword地址.61d+22=63f,32位dword.
;就是FF1E2200 CALL FAR [0022](debug)
seg000:06DB retn ;ida把所有没有指定段寄托器的内存变量,都自动加上默认的ds,内存地址
seg000:06DB sub_6D6 endp ;的形式,是没有括号的
seg000:06DB
; ---------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;6dc处继续执行初始化工作,这里是主程序
seg000:06DC
seg000:06DC loc_6DC: ; CODE XREF: seg000:0618J
seg000:06DC cmp dl, 8Fh ; '? ;判断bios传来的参数,以断定自己在什么存储媒介上
seg000:06DF jg short loc_6E5 ;这是其他的老mbr没有的
seg000:06E1 mov ds:byte_62D, dl ;如果不是8f将数据保存的62d
seg000:06E5
seg000:06E5 loc_6E5: ; CODE XREF: seg000:06DFj
--------------------------------------------------------------------------------
seg000:06E5 mov si, 787h ;
seg000:06E8 call sub_778 ;用bios int10显示boot starting等,就是hdd+的启动显示标志
seg000:06EB mov si, 7BEh ;si指向本扇区一起读出的分区表,偏移是标准的600+1be
seg000:06EE xor ax, ax ;ax清0当活动分区计数器
seg000:06F0 mov cx, 4 ;只读4次,一个主分区表只有4格
seg000:06F3
seg000:06F3 loc_6F3: ; CODE XREF: seg000:06FFj
seg000:06F3 test byte ptr [si], 80h ;80是正确的分区的标制
seg000:06F6 jz short loc_6FB ;找到80的活动分区转6fb
seg000:06F8 inc ax ;找一个活动分区,计数器加1
seg000:06F9 mov bp, si ;7be入bp
seg000:06FB
seg000:06FB loc_6FB: ; CODE XREF: seg000:06F6j
seg000:06FB add si, 10h ;一个分区表项16字节,指向下一个
seg000:06FF loop loc_6F3 ;循环再用80标志检测分区项
seg000:0701 dec ax ;ax-1,如果不为0就是有2个活动分区或者没有活动分区,拉倒了,重启
seg000:0702 jz short loc_706 ;搜索分区表后,只有一个正确分区转706继续工作,否则int 18停活
seg000:0704 int 18h ; TRANSFER TO ROM BASIC
seg000:0704 ; causes transfer to ROM-based BASIC (IBM-PC)
seg000:0704 ; often reboots a compatible; often has no effect at all
seg000:0706 ;转而执行INT 18H的BOOT异常执行中断程序(参考其他)
seg000:0706 loc_706: ; CODE XREF: seg000:0702j
seg000:0706 mov di, 5 ;di当读取次数计数器
seg000:0709
seg000:0709 loc_709: ; CODE XREF: seg000:072Fj
seg000:0709 mov si, 61Dh
seg000:070C mov word ptr [si+2], 1
seg000:0711 mov eax, [bp+8]
seg000:0715 mov [si+8], eax
seg000:0719 mov ax, 4200h ;使用了int 13扩展功能的int 13 ah=42读
seg000:071C mov dl, ds:byte_62D
seg000:0720 int 13h ;DISK - 读出活动分区的第1扇区
seg000:0722 jnb short loc_731 ;读出成功转分区引导扇区的代码,进行检查,准备放出ip权
seg000:0724 dec di ;每读一次分区引导区,di-1,只尝试5次
seg000:0725 jz short loc_770 ;di为0,而没有成功转走,5次读失败,就是引导失败,转770死循环
seg000:0727 xor ah, ah ;还在5次以内,复位磁盘,准备转709继续尝试
seg000:0729 mov dl, ds:byte_62D
seg000:072D int 13h ; DISK - RESET DISK SYSTEM
seg000:072D ; DL = drive (if bit 7 is set both hard disks and floppy disks reset)
seg000:072F jmp short loc_709 ;重读
seg000:0731 ; ---------------------------------------------------------------------------
seg000:0731 ;读出分区引导代码后
seg000:0731 loc_731: ; CODE XREF: seg000:0722j
seg000:0731 mov ax, ds:7DFEh ;分区引导记录已读出,分析是否正常
seg000:0734 cmp ax, 0AA55h ;没有aa55标记是数据分区,拉倒
seg000:0737 jnz short loc_770 ;不正确转770死循环,这2处重大失败都没有走int 18
;----------------------------------------------------------------------------------------------
;这一段是保存原中断向量,并修改跳回指令
seg000:0739 cli
seg000:073A mov eax, ds:4Ch ;32位取中断向量表int 13,汗了,原来是这样搞的
seg000:073E mov ds:dword_63F, eax ;保存在63f
;这是一次代码自修改,63f为seg000:063E jmp far ptr 0F000h:0E736h
;直接修改了jmp跳转地址
;--------------------------------------------------------------------------------------------
;这一段是将自己的一部分常驻内存顶端,并减少内存1k,大小为120字节的代码和数据
seg000:0742 mov si, 413h ;si=413,此处存放最大的内存0000:0413
seg000:0745 mov ax, [si] ;[413]内容入ax
seg000:0747 dec ax ;ax-1,为自己弄了1k空间
seg000:0748 mov [si], ax ;送回[413],等于把[413]-1,dos下内存少了1K
seg000:074A shl ax, 6 ;将ax里面的412移到高位,形成段地址
seg000:074D mov es, ax ;送到段寄存器es,应该=0x
seg000:074F xor di, di ;di清零
seg000:0751 mov si, 61Dh ;si指向61d,又准备传送自身了
seg000:0754 mov cx, 60h ; '`' ;传送长度为60*2=120字节
seg000:0757 cld
seg000:0758 rep movsw ;开始传送了,将61d-6dd传送到00ad:0000
seg000:075A mov word ptr ds:4Ch, 17h ;写中断向量表 int13,加强分区引导代码的读功能
;双字节写入的,是0017
seg000:0760 mov ds:4Eh, ax ;61d传去的,但开头是数据,要以634为开头,
;中断向量表写的低位是17,正是现在的634中断服务程序,挺精巧的计算
seg000:0763 sti ;恢复dl,bios专用参数
seg000:0764 mov dl, ds:byte_62D ;将62d保存的媒介信息继续用dl传给分区引导代码
seg000:0768 mov si, bp
seg000:076A cli
seg000:076B jmp far ptr 0:7C00h ;经检查正常后,向读到7c00的分区引导代码放ip权。
seg000:0770 ; ---------------------------------------------------------------------------
seg000:0770 ;引导失败走这里显示 .Boot faile
seg000:0770 loc_770: ; CODE XREF: seg000:0725j
seg000:0770 ; seg000:0737j
seg000:0770 mov si, 7AAh
seg000:0773 call sub_778 ;用778显示专用子程序将7aa的错误信息显示出来
seg000:0776
seg000:0776 loc_776: ; CODE XREF: seg000:loc_776j
seg000:0776 jmp short loc_776 ;从这里失败以后就是死循环了,不断运行这条指令
seg000:0778
seg000:0778 ; =============== S U B R O U T I N E =======================================
seg000:0778; 778子程序是调用int10显示文本
seg000:0778
seg000:0778 sub_778 proc near ; CODE XREF: seg000:06E8p
seg000:0778 ; seg000:0773p ...
seg000:0778 lodsb
seg000:0779 and al, al
seg000:077B jz short locret_786 ;这个转移应该是不成立的,转到数据上肯定死机
seg000:077D mov ah, 0Eh ;不转移的话正常显示文本
seg000:077F mov bx, 7
seg000:0782 int 10h ; - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE)
seg000:0782 ; AL = character, BH = display page (alpha modes)
seg000:0782 ; BL = foreground color (graphics modes)
seg000:0784 jmp short sub_778
seg000:0786 ; ---------------------------------------------------------------------------
seg000:0786
seg000:0786 locret_786: ; CODE XREF: sub_778+3j
seg000:0786 retn
seg000:0786 sub_778 endp
seg000:0786
seg000:0786 ; ---------------------------
start boot form usb ...
Start boo
seg000:0790 74 69 6E 67 20 66 72 6F 6D 20 55 53 42 20 64 65 ting from USB de
seg000:07A0 76 69 63 65 2E 2E 2E 0D 0A 00 42 6F 6F 74 20 66 vice
.Boot f
seg000:07B0 61 69 6C 65 64 00 00 00 01 8B 09 00 00 00 00 00 ailed
分区表
80 01 ..............?
seg000:07F0 01 00 0E FE 3F 07 3F 00 00 00 C1 F7 01 00
今天没事又修正了下,第2次修正,排版总是不齐的,不管了
|