[旧帖]
[原创]神奇的xor运算
0.00雪花
发表于:
2011-10-21 17:31
3166
最近在学习追踪注册,正是看雪上的一个非常古老的帖子,
(http://www.pediy.com/tutorial/chap6/Chap6-1-11.htm) ,答案里面没有
给出证明,在这我把它贴出来……大神请绕道~
原文:
破解chap6-1-1-01
* Referenced by a CALL at Address:
|:004010B0
|
:004010C9 56 push esi
:004010CA 57 push edi
:004010CB 51 push ecx
:004010CC 33F6 xor esi, esi
:004010CE 33FF xor edi, edi
:004010D0 B908000000 mov ecx, 00000008 ---定义
循环次数
:004010D5 BE44304000 mov esi, 00403044 ---调出
输入的密码
:004010DA 803632 xor byte ptr [esi], 32 ---把
密码个字节与32取异或
:004010DD 46 inc esi
:004010DE E2FA loop 004010DA ---向上
循环
:004010E0 BE44304000 mov esi, 00403044
:004010E5 B904000000 mov ecx, 00000004 ---8变4
:004010EA 8A06 mov al, byte ptr [esi]
:004010EC 8A5E01 mov bl, byte ptr [esi+01]
:004010EF 32C3 xor al, bl ---把变
化后的密码前后取异或
:004010F1 88874C304000 mov byte ptr [edi+0040304C], al
:004010F7 83C602 add esi, 00000002
:004010FA 47 inc edi
:004010FB E2ED loop 004010EA ---向上
循环
:004010FD BE4C304000 mov esi, 0040304C ---将生
成的4个数变成2个
:00401102 8A06 mov al, byte ptr [esi]
:00401104 8A5E01 mov bl, byte ptr [esi+01]
:00401107 32C3 xor al, bl
:00401109 8A5E02 mov bl, byte ptr [esi+02]
:0040110C 8A4E03 mov cl, byte ptr [esi+03]
:0040110F 32D9 xor bl, cl
:00401111 32C3 xor al, bl ---再
由2个变1个放入AL
:00401113 B908000000 mov ecx, 00000008
:00401118 BE44304000 mov esi, 00403044
:0040111D 3006 xor byte ptr [esi], al ---将生成
的1个与原来的取异或
:0040111F 46 inc esi
:00401120 E2FB loop 0040111D
:00401122 B908000000 mov ecx, 00000008 ---从这
往下开始比较
:00401127 BE44304000 mov esi, 00403044 ---放入
算出的结果
* Possible StringData Ref from Data Obj ->"q"
|
:0040112C BF08304000 mov edi, 00403008 ---放入
正确的结果
:00401131 8A06 mov al, byte ptr [esi]
:00401133 3A07 cmp al, byte ptr [edi]
:00401135 751D jne 00401154 ---跳
向出错
:00401137 46 inc esi
:00401138 47 inc edi
:00401139 E2F6 loop 00401131 ---向上
循环
:0040113B 6A40 push 00000040
模拟运算:
如果输入12345678
机器码 31 32 33 34 35 36 37 38
与32异或 03 00 01 06 07 04 05 0A ----(1)
8变4为 03 07 03 0F
4变2为 04 0C
2变1为 08 ----(2)
(1)与08取异或 0B 08 09 0E 0F 0C 0D 02
00403008 内正确的为 71 18 59 1B 79 42 45 4C
根据正确反推注册码: (关键是如何计算(2))
由算法可知(2)是由机器码反复取异或得到,其实由它
的正确的密码重复这 一算法也可求的(2),实验得出。缺
少证明。
机器码 71 18 59 1B 79 42 45 4C
8变4为 69 42 3B 09
4变2为 2B 32
2变1为 19 ----正确的密码
的(2)值应为19
接着反推正确的注册码:
机器码 71 18 59 1B 79 42 45 4C
与19取异或 68 01 40 02 60 5B 5C 55
与32取异或 5A 33 72 30 52 69 6E 67
查表得正确的注册码为: Z 3 r 0 R i n g (Z3r0Ring)
ZXEM 2000.3.20 这里用到了n多个xor连续的运算,那xor连续运算有什么特性呢?慢慢来……
xor运算方式:同为1,异为0.
举个例子:1 xor 1 xor …… xor 1=1,0 xor 1 xor ……
xor 1=0;0 xor 0 xor 1 xor …… xor 1=1;……
如果你列出来n多个这样有规律的代数式之后就会发现:凡是有偶数个0的都等
于1,凡是有奇数个0的都等于0.
是不是所有的都成立,我是说对于所有的n多个1 和m多个 0 的交叉的或则混
合的xor运算都满足上面的发现呢?
让我们试图证明一下吧(不试试怎么知道呢?):
n=0 时,2n=0个0的运算等于1(这是显而易见的)
2n+1=1个0的运算等于0(这也是显而易见的)
假设当n=i时,我们的猜想成立,即2i个0=1,2i+1个0=0;
那么当n=i+1时:
2i+2个0:可以把代数式按某一个0分成两段,即 左 xor 0 xor 右(左
和 右 分别代表 xor 的运算式),很显然左中的0 的个数肯定小于等于2i+1
个,那么就满足我们的猜想,就可以把它运算后当作一位数与0运算,同理剩
下的代数式中0的个数也是小于等于2i+1个,满足猜想;
2i+3个0:……(同上,省略……)
归纳法证明完了……
我们突然发现,其实xor的连续运算就是关于0的个数的运算,奇数个0就是0,
偶数个0就是1,不论0 和 1 是怎么排的顺序。
总算证明完了,不过还没搞明白
为什么“由算法可知(2)是由机器码反复
取异或得到,其实由它的正确的密码重复这 一算法也可
求的(2)”这个问题,那就继续吧。
我想应该是在计算注册码的过程中并没有改变xor运算的某些特性吧,到
底是什么呢?前面证明的是 xor 运算结果只与0的个数有关,我们换一种说法
试试:xor 运算具有一种特性,即其运算结果只与0的个数有关,增加偶数个0
结果不变,奇数个0结果改变。
好吧,再让我们看看。假机器码的8位与分别32 xor运算,总共8次,刚好是偶
数!!!由于增加偶数个0其结果是不变的,所以(2)的值和不与32 xor所得
到的是相同的!!!到了这里,我们认为(2)是由真的注册码xor得来的,可
是我们不知道真的注册码,只知道真的机器码,不过二者存在联系,真的机器
码=(2) xor 真的注册码,看来我们又回到前面了:真的机器码 xor运算之
后 得到结果和真的注册码 xor得到的结果相同,因为里面含有偶数个(2)…
…
到此结束,不懂的再细细的想想~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)