算法分析: <献给初学者> 之一
◆ 作 者 ◆ goodbao[P.J.CHINA]
◆软件名称◆
图标更换器(ExeIco)1.63 版。下载地址:
http://www.softreg.com/download.asp?id={CD05D77E-E9F5-4445-9350-E2FFC8B4F89A}
◆破解难度◆
较难。对于初学者来说,这个是非明码的,而且其算法比较烦琐,可能会觉得挺难。
◆破解简述◆
此软件其实与我以前的教程颇有类似之处,只是,可能大家还不习惯于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",这就是正确的注册码的第一位了。以下同理,可以得出其它的正确注册码。
---------------------------------------------------
神龙宝宝
goodbao[P.J.CHINA][BCG][CNCG]
- 标 题:算法分析: <献给初学者> 之一 (4千字)
- 作 者:ccmc[P.J.CHINA]
- 时 间:2002-6-6 22:26:11
- 链 接:http://bbs.pediy.com