• 标 题:算法分析: <献给初学者> 之一 (4千字)
  • 作 者:ccmc[P.J.CHINA]
  • 时 间:2002-6-6 22:26:11
  • 链 接:http://bbs.pediy.com

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

◆ 作  者 ◆ 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]