算法分析: <献给初学者> 之一

时间:2005-12-20 来源: 作者: 点击:
◆破解难度◆ 较难。对于初学者来说,这个是非明码的,而且其算法比较烦琐,可能会觉得挺难。 ◆破解简述◆ 此软件其实与我以前的教程颇有类似之处,只是,可能大家还不习惯于F5的用法,因此破解起来难度挺大,分析算法时也可能会被绕得头晕脑胀。事实上,大家完全可以
  ◆破解难度◆
较难。对于初学者来说,这个是非明码的,而且其算法比较烦琐,可能会觉得挺难。
◆破解简述◆
此软件其实与我以前的教程颇有类似之处,只是,可能大家还不习惯于F5的用法,因此破解起来难度挺大,分析算法时也可能会被绕得头晕脑胀。事实上,大家完全可以照搬我以前教程中的破解方法,一是巧用活用F5,二是妙用“r fl z”这个偷天换日大法,必可建得奇功!关于F5的使用方法及含义,这里不再赘述,请参照相关的教程,动手跟做练习就可以了。关于动态自动注册及爆破,我们也不在这里讨论,都非常简单。这里只将其算法的主要部分叙述如下。

◆算法分析◆

0167:00403DF2 C605F0D3450001 MOV BYTE [0045D3F0],01
0167:00403DF9 33C9 XOR ECX,ECX------------>ECX清零
0167:00403DFB 8D7D80 LEA EDI,[EBP-80]---------------------------------->
将字符串‘1z1h+2a0n-0g8y*9a1n|'(此为定值)送EDI寄存器,后面计算用到,设为M。计算过程中,‘+'、‘-'、‘*'及‘|'不参与运算。
0167:00403DFE BE94474600 MOV ESI,00464794------->机器码送ESI寄存器
0167:00403E03 8D5D98 LEA EBX,[EBP-68]
0167:00403E06 8D4101 LEA EAX,[ECX+01]------->EAX计数器,循环开始▲▲
0167:00403E09 51 PUSH ECX
0167:00403E0A B905000000 MOV ECX,05------------->ECX=$05。0167:00403E0F 99 CDQ------------------------->双位扩展,即EDX清零
0167:00403E10 F7F9 IDIV ECX---------------->EAX MOD ECX=EDX
0167:00403E12 59 POP ECX
0167:00403E13 85D2 TEST EDX,EDX------------>判断余数是否为0
0167:00403E15 7440 JZ 00403E57----------->为0则直接跳到后面并返回开始处重新循环计算过程
0167:00403E17 8A06 MOV AL,[ESI]------>AL=依次取去掉‘-'后的机器码$
0167:00403E19 3207 XOR AL,[EDI]------>AL=机器码$ XOR 依次取M的$ ,结果设为M1
0167:00403E1B 0FBED0 MOVSX EDX,AL ------->EDX=M1
0167:00403E1E 8955B4 MOV [EBP-4C],EDX-->[EBP-4C]=M1
0167:00403E21 8B45B4 MOV EAX,[EBP-4C]-->EAX=M1
0167:00403E24 51 PUSH ECX
0167:00403E25 99 CDQ -------------->EDX清零
0167:00403E26 33C2 XOR EAX,EDX------->EAX MOR EDX=EAX=M1
0167:00403E28 B91A000000 MOV ECX,1A-------->ECX=$1A
0167:00403E2D 2BC2 SUB EAX,EDX------->EAX=M1-EDX=M1
0167:00403E2F 8BD0 MOV EDX,EAX------->EDX=EAX=M1
0167:00403E31 C1E005 SHL EAX,05-------->EAX=M1 * 2^5 0167:00403E34 2BC2 SUB EAX,EDX------->EAX=M2-M1 设为M3
0167:00403E36 8D0482 LEA EAX,[EDX+EAX*4]-->EAX=M3*4+M1 设为M4
0167:00403E39 C1E005 SHL EAX,05----------->EAX=M4 * 2^5 设为M5
0167:00403E3C 03C2 ADD EAX,EDX---------->EAX=M5+M1 设为M6
0167:00403E3E 03C0 ADD EAX,EAX---------->EAX=EAX+EAX=EAX*2 设为M7
0167:00403E40 99 CDQ ----------------->EDX清零
0167:00403E41 F7F9 IDIV ECX----------->EDX=M7 MOD ECX=M7 MOD $1A 设为M8。
0167:00403E43 0FBE03 MOVSX EAX,BYTE [EBX]--->依次取输入的注册码$
0167:00403E46 83C241 ADD EDX,BYTE +41----->EDX=M8+$41 设为M9
0167:00403E49 59 POP ECX
0167:00403E4A 3BD0 CMP EDX,EAX---------->比较取得的输入码$与M9是否相等
0167:00403E4C 7409 JZ 00403E57--------->等则跳到下面继续循环计算,不等则跳向出错!
0167:00403E4E C605F0D3450000 MOV BYTE [0045D3F0],00
0167:00403E55 EB09 JMP SHORT 00403E60--->不等就会跳到这里了,GAMEOVER!
0167:00403E57 41 inc ecx
0167:00403E58 47 inc edi
0167:00403E59 46 inc esi
0167:00403E5A 43 inc ebx
0167:00403E5B 83F914 cmp ecx, 00000014--------->是否取完20位
0167:00403E5E 7CA6 jl 00403E06--------------->没有取完返回循环 ▲▲

再下面的就简单了,主要就是会有一个比较注册码长度是否为24位的地方,否则出错,因此,后5位的码是任意的,就不再赘述了。

◆算法总结◆
以机器码NDFK-NIUY-UWTC-ZOTW-EI16为例,我们来总结一下算法。为了简化过程,只对其中的第一位进行详细算法分析,其它同理。固定字符串M为‘1z1h+2a0n-0g8y*9a1n|'。
第一位字符为N,其$为$4E。因此,算法过程是:
M1= $4E MOR $31(‘1') = 7F
M2= $7F * 2^5 = $18CE
M3= $18CE - $7F = $184F
M4= $184F * 4 + $7F = $61BB
M5= $61BB * 2^5 = $131686
M6= $131686 + $7F = $131705
M7= $131705 * 2 = $262E0A
M8= $262E0A MOD $1A = $12
M9= $12 +$41 = $53=========>Asc(M9)="S",这就是正确的注册码的第一位了。以下同理,可以得出其它的正确注册码。
------分隔线----------------------------
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容