并将之保存.
4. 现在我们得到了一个新的CRC,但是我们希望将它还原成原先的CRC,所以我们用逆向算法
来计算那额外的4字节.
1~3就是实际的情况,下面你将学到最关键的部分4.
'反转'CRC-16
我想,先来介绍计算逆CRC-16对于你来说会简单些.好的,我们现在处在一个恰当的位置,
在以修改代码后面,就是你想将CRC还原的地方.我们知道原始的CRC(是在patch代码之前计
算出来的)还有这个当前的记存器值.现在我们的目的就是计算可以改变当前记存器值到原
始记存器值的两个字节.首先,我们用正常的方法计算这两个未知字节的CRC.我们设他们为
X,Y.设记存器为a1,a0,只有0不能用来作为变量(00).:)在来看一下我们的CRC算法,figure
3,更好的理解下面我要做的. 好,我们开始:
用这两字节串'X Y' 字节是从左边开始被处理的. 记存器现在是a1 a0.
用'+'来表示XOR运算(和第一部分中用的一样)
处理第一个字节, X:
a0+X 这是顶部字节的计算结果 (1) b1 b0 这是(1)在表中索引对象. 00 a1 向右移动记存器.
00+b1 a1+b0 上面两行对应位做XOR运算. 现在记存器为: (b1) (a1+b0)
处理第二个字, Y:
(a1+b0)+Y 此轮顶部字节的计算结果(2) c1 c0 这是(2)在表中的索引对象. 00 b1 向右移动记存器.
00+c1 b1+c0 上面两行对应位做XOR运算. 最后记存器就是: (c1) (b1+c0)
我用一点不同的方法来表示:
a0 + X =(1) 在表中指向b1 b0. a1 + b0 + Y =(2) 在表中指向c1 c0. b1 + c0=d0 记存器中新的低位字节. c1=d1 记存器中新的高位字节. (1) (2)
Wow! 请大家暂时记住上面的信息:) 别着急, 下面给出一个有具体值的例子.
如果你想要的记存器的值是d1 d0(是原始的CRC),而且你知道在变换之前的记存
器的值
(a1 a0)...那么你将要送如什么样的2个字节进记存器来做CRC计算呢? 好了,现在我们的工作应该从幕后走到台前来了.d0一定是bi+c0,并且d1一定是c1...
但是这到底是怎么回事,我听到你这样问了,你能知道b1和c0的值吗???你还记得哪个值表
吗?你只需要在表中查找c0 c1这个字的值就可以了因为你知道c1.所以你需要编写一个查
找程序.假如你找到了这个值,一定要记住这个值的索引,因为这就是找出未知的两个顶部
字节,举例来说:(1)和(2)!
所以,现在你找到了c1 c0,那么如何来得到b1 b0呢?如果b1+c0=d0那么b1=d0+c0!如前所
述,现在你用哪个查找程序在表中查b1 b0的值.现在我们得到了所有计算X和Y所需要的值. Cool huh?
a1+b0+Y=(2) so Y=a1+b0+(2) a0+X=(1) so X=a0+(1) 实例.
让我们来看看这个具体值的例子: -register before: (a1=)DE (a0=)AD -wanted register: (d1=)12 (d0=)34
在附录的CRC-16的表中查找以12开头值的入口.这里入口38h的值为12C0.试这
找一找是否还
有以12开头的值的入口.你不可能在找到的,因为我们计算每一中顶部字节组合而得的值的
入口,一共是256个值,记住!
现在我们知道(2)=38,c1=12,c0=C0,所以b1=C0+34=F4,现在查找以F4开头的b1的入口.这里
入口4Fh的值是F441.
我们还知道 (1)=4F,b1=F4,b0=41,现在所有我们需要的都已经清楚了,接下来我们计算X,Y.
Y=a1+b0+(2)=DE+41+38=A7 X=a0+(1) =AD+4F =E2
结论:将CRC 记存器的值从 DEAD 变为 1234 我们需要这两个字节 E2 A7 (以此顺序).
你看,破解CRC校验你需要反向计算,还有要记住的就是计算过程中的值.当你在用汇编编写
查找表程序时,要注意intel在小模式中是反向存储值的.现在你可能已经明白如何去破解这个
CRC-16了...下面介绍如何在CRC-32中实现.
破解 CRC-32
现在我们来看CRC-32,和CRC-16是一样容易的(可能一样的不容易你认为).这里你操作的对象
是4个字节的而不是2字节的.继续向下看,将它与上面CRC-16版本做对比.
设4字节串 X Y Z W , 从左边开始处理. 设记存器为 a3 a2 a1 a0 注意a3是MSB,而a0是LSB
处理第一个字节, X:
a0+X 这是顶部字节的计算结果(1). b3 b2 b1 b0 这是(1)在表中索引对象序列. 00 a3 a2 a1 右移记存器.
00+b3 a3+b2 a2+b1 a1+b0 上面两行对应位做XOR运算. 现在记存器是: (b3) (a3+b2) (a2+b1) (a1+b0) Processing second byte, Y:
(a1+b0)+Y 这是顶部字节的计算结果(2). c3 c2 c1 c0 这是(2)在表中索引对象序列. 00 b3 a3+b2 a2+b1 右移记存器.
00+c3 b3+c2 a3+b2+c1 a2+b1+c0 上面两行对应位做XOR运算. 现在记存器是: (c3) (b3+c2) (a3+b2+c1) (a2+b1+c0) Processing third byte, Z:
(a2+b1+c0)+Z 这是顶部字节的计算结果(3). d3 d2 d1 d0 这是(3)在表中索引对象序列.