一种可以穿透还原卡和还原软件的代码

一种可以穿透还原卡和还原软件的代码

CVC/GB  风般的男人

还原卡和还原软件被广泛运用于各种公共场合的电脑上,比如学校机房和网吧。这些还原卡和还原软件(以下我简称为虚拟还原技术)能够记录下一切对硬盘的写操作,不论您对硬盘进行拷贝还是移动删除甚至是格式化分区等操作,只要一重新启动,一切都会恢复到这个操作之前的情况,因此有些虚拟还原厂商还会在广告词中加上一句“可以防范一切电脑病毒”。这种虚拟还原的方法在大部分时候的确可以对公共机房的电脑起到很好的保护作用,难道真的没有一种方法能够穿透这种保护机制么?答案是否定的,下面请听我一一道来。

一、虚拟还原技术的原理

本文所说的是一种普遍运用于还原卡或还原软件上的技术,当然,不同品牌不同厂商生产的可能不尽相同,但原理却是相通的。

首先,还原卡和还原软件会抢先夺取引导权,将原来的0头0道1扇保存在一个其他的扇区,(具体备份到那个扇区是不一定的),将自己的代码写入0头0道1扇,从而能在操作系统之前得到执行权,这一点类似于一个引导型病毒;然后,我们来看看虚拟还原技术在操作系统之前都做了些什么:

1.将中断向量表中的INT13H的入口地址保存;

2.把自己用于代替INT13H的代码写入内存,并记住入口地址,当然这种“写入内存”并不是普通的“写”,而是一种我们称为“常驻”的方法,有关“常驻程序”的实现方法我们不另外花篇幅来描述了,如果你还不了解的话请自己找有关资料,也可以到www.hackart.org或www.lsky.net找风般的男人交流;

3.将中断向量表中INT13H的入口地址改为这段常驻程序的入口地址。补充一点,虚拟还原程序在修改INT13H的入口后往往都会修改一些其他中断入口,当然也是通过常驻程序来实现的,这些中断用来实现对中断向量表中INT13H入口地址监控,一旦发现被修改,就马上把它改回,这样做同样是用来防止被有心人破解。

好了,你已经看出来了,这段用来替代BIOS提供的INT13H的代码才是虚拟还原技术的关键,那么这段代码到底实现了些什么了,以下是本人对此拙浅的理解:

1.拦截所有INT13H中对硬盘0头0道1扇的操作

这些包括读写操作,把所有的对0头0道1扇的操作改为对虚拟还原程序备份的那个扇区的操作,这样做的目的是保护虚拟还原代码不被破坏,并且不能被有心人读出进行破解,即使你用扇区编辑工具查看主引导区,实际上你看到的是这个备份的主引导区。

2.拦截所有INT13H中的写硬盘操作

这里包括对8G以下的硬盘的普通通过磁头、磁道、扇区定位的INT13H中的写操作,和扩展INT13H中基于扇区地址方式的对大硬盘的写操作,甚至包括扩展INT13H中对一些非IDE接口的硬盘的写操作。

至于拦截后做什么是虚拟还原技术实现的关键,在早期的DOS系统当中完全可以“什么都不做”,也就是说当用户写硬盘时实际上是什么都没做,但现在的操作系统都要对硬盘进行一些必要的写操作,比如对虚拟内存的写操作。众所周知,虚拟内存实际上就是硬盘,而如果禁止操作系统写硬盘的话显然后果是不堪设想的。所以,大多数虚拟还原厂商用的方法是占用一些硬盘空间,把硬盘所进行的写操作做一个记录,等系统重新启动后还原这一记录,但是怎样科学记录硬盘的写操作,是我一直没想通的问题,这种“科学”应该体现在时间上和硬盘空间的占用量上的,也就是说怎么样用最少的时间和最少的硬盘空间来记录硬盘的写操作是实现关键,如果有这方面想法的朋友欢迎和我交流;

3.备份端口70H,71H中的内容,并把最后一次执行时端口70H,71H的内容和备份的内容做比较,不一样就提示BIOS被修改,是否还原,并通过密码验证修改BIOS是否合法。

二、PC机的中断机制

中断提供了最基本的硬件和软件的接口,它使得程序员不必了解硬件系统的细节,只要直接调用系统提供的中断服务子程序,就可以完成相应功能,这样能使得程序设计更为方便。其实现机制如下:当某一中断源发出中断请求时,CPU能够决定是否响应这一中断请求(当CPU在执行更为重要的工作时,可以暂不响应),如果允许响应该中断,CPU会在现行的指令执行完后,把断点处的下一条指令地址和各寄存器的内容和标志位的状态,推入堆栈进行保护,然后转到中断源服务程序的入口,进行中断处理,当中断处理完成后,再恢复被保留的各寄存器、标志位状态和指令指针,使CPU返回断点,继续执行下一条指令。

为了区别各个中断,CPC系统给每个中断都分配了一个中断号N,比如INT 3H是断点中断,INT 10H是显示中断,我们今天要讨论的主要是INT 13H磁盘读写中断。

要说清楚PC机上的中断机制,用这一点篇幅是完全不够的,这里我所说的只是一个大概,如果你不清楚的话,请查阅一些资料或和我交流,我们今天重要要说的就是以INT13H为例看看BIOS提供给我们的中断到底都是在做什么?所谓BIOS中断简单说就是你机器上的BIOS提供的中断,那么在BIOS中断的后面,到底是些什么呢?实际上是一些对端口的输入输出操作,PC的每个端口都实现特定的功能,我们完全可以不调用BIOS提供的中断而直接用输入输出指令对这些端口进行操作,从而可以实现象调用BIOS中断一样的功能,但是一个前提是你必须对这些端口有详细的了解。反过来说,PC的中断系统的一大好处就是能够让程序员无须了解系统底层的硬件知识的而能够编程,从这点看,中断有点象我们平时所说的“封装”,我不知道这样说对不对,但的确中断为我们“封装”了许多系统底层的细节。

三、硬盘读写端口的具体含义

对硬盘进行操作的常用端口是1f0h~1f7h号端口,各端口含义如下:

端口号     读还是写   具体含义

1F0H       读/写      用来传送读/写的数据(其内容是正在传输的一个字节的数据)

1F1H       读         用来读取错误码

1F2H       读/写      用来放入要读写的扇区数量

1F3H       读/写      用来放入要读写的扇区号码

1F4H       读/写      用来存放读写柱面的低8位字节

1F5H       读/写      用来存放读写柱面的高2位字节(其高6位恒为0)

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.

(0)

相关推荐

  • 一种可以穿透还原卡和还原软件的代码

    一种可以穿透还原卡和还原软件的代码 CVC/GB  风般的男人 还原卡和还原软件被广泛运用于各种公共场合的电脑上,比如学校机房和网吧.这些还原卡和还原软件(以下我简称为虚拟还原技术)能够记录下一切对硬盘的写操作,不论您对硬盘进行拷贝还是移动删除甚至是格式化分区等操作,只要一重新启动,一切都会恢复到这个操作之前的情况,因此有些虚拟还原厂商还会在广告词中加上一句"可以防范一切电脑病毒".这种虚拟还原的方法在大部分时候的确可以对公共机房的电脑起到很好的保护作用,难道真的没有一种方法能够穿透这

  • Java 两种延时thread和timer详解及实例代码

    Java 两种延时thread和timer详解及实例代码 在Java中有时候需要使程序暂停一点时间,称为延时.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如 try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){} 在这里需要解释一下线程沉睡的时间.sleep()方法并不能够让程序"严格"的沉睡指定的时间.例如当使用5000作为sleep()方法的参数时,线 程

  • python+selenium 简易地疫情信息自动打卡签到功能的实现代码

    由于学校要求我们每天都要在官网打卡签到疫情信息,多多少少得花个1分钟操作,程序员的尊严告诉我们坚决不能手动打卡.正巧最近学了selenium,于是画了个5分钟写了个自动打卡签到地小程序. 测试环境:python3.7 , selenium,chrome浏览器 seleium和chromedriver的配置在这里就不讲了,这里放个连接 首先找到学校信息门户的登录页: http://my.hhu.edu.cn/login.portal #导入selenium中的webdriver from sele

  • Java中四种9*9乘法表的实现方式(附代码)

    前言: 初学java,实现99乘法表是必学必会的内容. 需求 : 分别写出上下左右,对应四个角的乘法表. 思路: 可以先打印出*星星,形成一个直角三角形,然后再替换成乘法公式. 代码如下: public class Demo { public static void main(String[] args) { for (int i = 1; i <=5 ; i++) { for (int j = 1; j <=i; j++) { System.out.print("* ")

  • 两种常用的javascript数组去重方法思路及代码

    第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用indexOf查找新数组中是否有该元素 3.若没有,则存到结果数组中 复制代码 代码如下: Array.prototype.unique1 = function(){ var res = []; for(var i = 0; i < this.length; i++){ if(res.indexOf(this[i]) == -1){ res.push(this[i]); } } retur

  • 使用Mongodb实现打卡签到系统的实例代码

    使用excel文件导入数据,整合mongodb实现打卡签到系统 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 主要技术:SpringBoot.Mongodb SpringBoot版本:2.2.6 实现步骤如下: 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>

  • 一种让页面完全把过来显示的脚本代码

    有没有看到过页面完全反过来的网页? 试试点击运行看看?! elgooG [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

  • 网吧入侵之攻无不克!

    作者:hacker.a- 文章来源:hacker.ab8.cn 经常看x档案,发现关于破解pubwin和万象的文章比较多,今天我决定写点网吧入侵方面的文章,希望对一些小菜有所帮助. 一. 网吧入侵 入侵的方法很多,但对网吧入侵最常用的方法是什么呢?首先,自动登陆.现在网吧一般都是win2000或者windows xp的机器,网管一般都把机子设置为自动登陆!这样我们开机进入系统的时候登陆窗口一闪而过!着时候如果我们findfass.exe试图把登陆账号密码找出来是不会成功的!因为账号密码根本不在内

  • 机房管理常见三大难题的解决方法

    一.还原卡无法还原 1. 检测不到还原卡 (1)检查BIOS设置是否正确. Anti-Virus Protection(病毒防护)应设置为Disabled,磁盘引导应设置为网络引导优先. (2)关机并拔出还原卡,用橡皮反复擦其金手指的正反面,再试. (3)关机并拔出还原卡,将其换一个PCI插槽插上,再试. (4)关机并拔出还原卡,正常启动后,删除Windows安装目录下的还原驱动程序,关机后重新插上还原卡再试. 2. 参数设置问题 (1)更改默认口令 机房管理员一定要修改还原卡默认的口令.笔者单

  • MySQL 数据备份与还原的示例代码

    一.数据备份 1.使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中. mysqldump命令的工作原理很简单.它先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句.然后,将表中的所有记录转换成一条INSERT语句.然后通过这些语句,就能够创建表并插入数据. 1.备份一个数据库 mysqldump基本语法: mysqldump -u username -p dbname table1 table2

随机推荐