最近在学习追踪注册,正是看雪上的一个非常古老的帖子,

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)…

    到此结束,不懂的再细细的想想~