cmos解密研究

Posted on 2006-07-15 01:12 紫雨轩 C++ 阅读(498) 评论(0)  编辑 收藏 引用
CMOS解密心得
我们来看看CMOS密码的加密算法,不管是Award还是AMI的BIOS(Basic Input Output System基本输入输出系统),其中的加密算法都是使用的HASH有损压缩算法(这种算法是不可还原的)。具体的计算方法为:如有密码为“ABCDEFGH”,则按下列公式计算:H+G×4H+F×10H+E×40H+D×100H+C×400H+B×1000H+A×4000H,将其计算结果由高到低按字节分别保存为H1、H2、H3,再出计算H2×100H+H3+H1即为最终结果。
我们再来看看CMOS中的数据结构和其读写方法。CMOS中主要保存计算机中的硬件配置信息,其地址范围为:00H-7FH共128个字节。如其中地址00H-09H保存日期时间,10H保存的是软驱类型,19H、1AH保存的硬盘类型,15H、16H保存基本内存大小,17H、18H保存扩充内存大小等等。以上这几个是具有标准定义的CMOS地址,其它大部分为保留地址,供BIOS厂商自己定义,如华硕的CUA266主板中管理员密码保存在4EH、4FH,用户密码保存在71H、72H,79H、7AH中保存校验和。下面说说对CMOS地址的读写方法:通常,对CMOS地址的读写都是通过70H和71H两个IO端口进行的,先向70H端口写入要读写的CMOS地址,再通过对71H端口的读写即可完成对指定CMOS地址的读写。
下面来说说CMOS密码的破解方法。常见的方法有两种,一、破坏CMOS参数信息或者更改硬件配置,使其校验和出错(此方法最有效,但容易被发现,不推荐使用)。二、将CMOS中的密文进行解密还原。以下就将对此方法进行详细介绍。
由于CMOS密码加密采用HASH有损压缩算法,故可多个明文对应一个密文。其中明文可为20H→7FH中的任意字符,即八位密码共有95^8种,而密文才两个字节,即256^2种,所以平均一个密文对应95^8/256^2≈10^10(100多亿)个明文。再来看看其加密算法,不难看出其实就是一个将每位密码扩展到16位再进行循环移位相加(其中的进位规则为:最高位向最低位进/借位)。传统的破解方法为暴力破解,我见到N个破解软件都是暴力破解,该办法速度特慢,得出的结果不具有规律性,如“D2%?>q@-”这种又难看又难记的密码。下面看看我自己想的破解方法,保证让你大吃一惊。看好了:如有一密文为WXYZ(十六进制),已知一个八位明文其密文为HIJK将密文与已知明文的密文相减即WXYZ-HIJK=MNOP,将MNOP转换为四进制并扩展到八位(高位补零)设结果为ABCDEFGH,将原来明文的ASCII码与ABCDEFGH相加即得到了最终明文的ASCII码。来个实例瞧瞧:密文为71C4H,已知明文“kkkkkkkk”对应的密文为:AAAAH,相减71C4-AAAA=C719H(最高位向最低位借位),转化为四进制为30130121,扩展到八位为:0300010300010201H与已知明文“kkkkkkkk”的ASCII码“6B6B6B6B6B6B6B6B”相加:6B6B6B6B6B6B6B6B+0300010300010201=6E6B6C6E6B6C6D6C,将其转化为字符为:“nklnklm”。即“nklnklml”即为密文71C4H的一个原文。此解密方法可概括为:基本码加偏移。其中基本码为已知明文的密文,偏移为相减后的密文,它表示了最终明文与基本码之间的距离。其中原则上基本码和偏移可以为任意值,只要两者相加后得到的最终明文可以输入即可(即满足最终明文的每个字符的ASCII码在20H和7FH之间)。由于最终明文有范围限制,下面我们先来讨论一下偏移的选取技巧。
由于偏移可以任意选取,故我们可以对其任意假设,如我们为了计算方便,可假设偏移每个字节的高四位为零,即只有低四位有效,看看HASH算法中的循环移位可以发现:最后一位偏移可以完全覆盖密文最低四位,倒数第三位偏移可完全覆盖密文中的第9→12位,倒数第五位偏移可完全覆盖密文中第5→8位,倒数第七位偏移可完全覆盖密文中的高四位,如果将偏移中的二、四、六、八位全部置零,则密文最低四位等于最后一位偏移,密文中的第9→12位等于倒数第三位偏移,依此类推。可发现将十六进制的密文每一位前面加三个十六进制的0(因为要扩展到一个字节)即为偏移。如明文为十六进制的“CDEF”,其偏移可以为十六进制的“000C000D000E000F”。这是偏移高四位为零的情况,我们再来看看偏移每个字节的高六位为零的情况。这时候只有最低两位有效,最后一位偏移完全覆盖密文最低二位,倒数第二位偏移覆盖密文的13→14位,依此类推。可发现,将密文转化为四进制,在将这个8位的四进制数每一位前面加上一个0看做十六进制即为偏移。如:密文为十六进制的“FEDC”,转换为四进制为“33323130”,故偏移的十六进制值为:“0303030203010300”。比较一下这两种偏移的计算方法可发现还是第二种方法比较方便,而且计算出来的偏移取值范围较小,为00H→03H,可以扩大基本码的取值范围。
我们再来看看基本码的选取技巧。前面已经说过,基本码基本上可以任意选取,但基本码加上偏移后必须要保证其可输入性,故基本码每一位的取值范围为20H→7CH,为方便观察和计算,我们一般将基本码的八个字节取相同的值,如为:“aaaaaaaa”。我们再来看看偏移的计算公式:偏移密文=原始密文-基本码密文,即:原始密码=基本码密文+偏移密文,由于其中的最高位向最低位进/借位,因此其中有个特别的基本码密文:FFFF(十六进制),只有偏移不等于0,则有:原始密文=偏移密文,而只有当原始密文为0(此时表示没有密码)的时候,偏移才为0。有了这个特殊的密文后就不必要算那个倒着借位的减法了。好了,我们来看看哪些明文的密文为FFFF,在此我们发现了很多,如:“00000000"、“BBBBBBBB”、“cccccccc”、“<<<<<<<<”、“????????”等等。其实只要某个字符的ASCII码能够被3整除就可以,如某个字符的ASCII码为X=3n,代入原始的密文计算公式:有密文Y=X×5555H=3n×5555h=n×FFFFH,即n个FFFFH相加。前面已经说过:任何数与FFFFH相加后结果不变,故有Y=FFFFH。有了这个特殊的基本码密文就可以将原始密文的明文输出为任意的种类,如:纯数字、全部大写、全部小写、纯特殊字符。


Award BIOS 的密码反算法,不过 NT 操作系统下无法执行 IN OUT 指令:(我不会:

   ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    MOV AX,1C1DH
    OUT 70H,AL
    IN AL,71H
    XCHG AL,AH
    OUT 70H,AL
    IN AL,71H
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    MOV ESI,OFFSET _PassEnd
    MOV BYTE PTR [ESI],0
    MOV BL,AL
    SUB BL,0F0H
    SBB AL,0FFH
    MOV ECX,0008H
   _Next:
    MOV BL,AL
    AND BL,03H
    OR  BL,30H
    DEC ESI
    MOV [ESI],BL
    SHR AX,1
    SHR AX,1
    LOOP _Next
   
   ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 18, comments - 22, trackbacks - 0, articles - 7

Copyright © 紫雨轩 C++