【文章标题】: 某软件算法与delphi注册机代码实现
【作    者】: testkey
【邮    箱】: pediytest@sina.com
【主    页】: http://bbs.pediy.com
【软件名称】: 省略
【下载地址】: 无
【加壳方式】: 无
【保护方式】: 随机ID、密码
【工    具】: OD,Delphi7
【软件介绍】: 无
【作者声明】: 仅做分析研究,无商业用途。
--------------------------------------------------------------------------------
【详细过程】
  某软件算法分析
  
  为避免版权信息,隐去软件名称和下载地址。仅做分析算法和学习使用。
  
  程序启动后出现ID,需要输入密码才能进入程序。
  
  我们可以从启动跟踪,或者从出错的提示入手分析,确定核心代码:
  
  找核心的地方略过,我们直接从程序启动验证密码是否正确入手,进行算法分析:
  
  00542AB6  |.  E8 B96BECFF   call    00409674
  00542ABB  |.  8B55 C0       mov     edx, [ebp-40]                    ;  ID的值
  00542ABE  |.  8B86 EC020000 mov     eax, [esi+2EC]
  00542AC4  |.  E8 734BEFFF   call    0043763C
  00542AC9  |.  A1 F8775400   mov     eax, [5477F8]
  00542ACE  |.  8918          mov     [eax], ebx                       ;  计算1,取ID为10进制数据,转换为16进制数据
  00542AD0  |.  B8 8F5F0100   mov     eax, 15F8F                       ;  初始化EAX=$15F8F
  00542AD5  |.  E8 A601ECFF   call    00402C80                         ;  进行数据处理,跟进计算2
  00542ADA  |.  05 10270000   add     eax, 2710                        ;  返回结果+$2710
  00542ADF  |.  8BD8          mov     ebxeax
  00542AE1  |.  03DB          add     ebxebx
  00542AE3  |.  8D1C9B        lea     ebx, [ebx+ebx*4]
  00542AE6  |.  8BC3          mov     eaxebx                         ;  相当于EBX结果*$A(以上看为计算3)
  00542AE8  |.  E8 E3FDFFFF   call    005428D0                         ;  对上面结果进行再处理计算4
  00542AED  |.  83C3 09       add     ebx, 9                           ;  结果+9
  00542AF0  |.  2BD8          sub     ebxeax                         ;  减去求余处理的结果EAX(这两步为计算5)
  00542AF2  |.  8D55 BC       lea     edx, [ebp-44]
  00542AF5  |.  8BC3          mov     eaxebx                         ;  结果为正确密码
  
  ============================================
  
  计算1的Delphi代码:
  
  a:=strtoint(id.Text);
  
  =============================================
  
  
  2、跟进00542AD5  |.  E8 A601ECFF   call    00402C80 计算2
  
  00402C80  /$  6915 44805400>imul    edx, [548044], 8088405           ;  EDX=0012FDD4*机器码*$8088405
  00402C8A  |.  42            inc     edx                              ;  计算结果+1
  00402C8B  |.  8915 44805400 mov     [548044], edx                    
  00402C91  |.  F7E2          mul     edx                              ;  EAX(15F8F)*EDX 结果的低8位给EAX,高8位给EDX
  00402C93  |.  89D0          mov     eaxedx                         ;  EDX给EAX返回数据
  00402C95  \.  C3            retn
  
  ============================================
  计算2的Delphi代码:
  
    asm
      mov edx,$0012FDD4
      imul edx,a,$8088405
      inc edx
      mov eax,$15f8f
      mul edx
      mov &b,edx
    end;
  
  ============================================
  3、计算3
  
  00542ADA  |.  05 10270000   add     eax, 2710                        ;  返回结果+$2710
  00542ADF  |.  8BD8          mov     ebxeax
  00542AE1  |.  03DB          add     ebxebx
  00542AE3  |.  8D1C9B        lea     ebx, [ebx+ebx*4]
  00542AE6  |.  8BC3          mov     eaxebx                         ;  相当于EBX结果*$A(以上看为计算3)
  
  ============================================
  计算3的Delphi代码:
  
  b:=(b+$2710)*$A;
  
  ============================================
  
  
  4、跟进00542AE8  |.  E8 E3FDFFFF   call    005428D0 计算4
  
  005428D0  /$  53            push    ebx
  005428D1  |.  56            push    esi
  005428D2  |.  57            push    edi
  005428D3  |.  8BC8          mov     ecxeax
  005428D5  |.  33F6          xor     esiesi
  005428D7  |.  BB 01000000   mov     ebx, 1
  005428DC  |.  85C9          test    ecxecx
  005428DE  |.  7E 20         jle     short 00542900
  005428E0  |>  8BC1          /mov     eaxecx                        ;  计算的结果(第2次开始为新得的商)
  005428E2  |.  BF 0A000000   |mov     edi, 0A                         ;  对$A求余
  005428E7  |.  99            |cdq
  005428E8  |.  F7FF          |idiv    edi                             ;  对$A求余
  005428EA  |.  0FAFD3        |imul    edxebx                        ;  余数*循环的次数
  005428ED  |.  03F2          |add     esiedx                        ;  余数处理结果累加
  005428EF  |.  43            |inc     ebx
  005428F0  |.  8BC1          |mov     eaxecx                        ;  计算的结果
  005428F2  |.  B9 0A000000   |mov     ecx, 0A
  005428F7  |.  99            |cdq
  005428F8  |.  F7F9          |idiv    ecx                             ;  对$A整除
  005428FA  |.  8BC8          |mov     ecxeax                        ;  把商作为新的计算结果,循环计算
  005428FC  |.  85C9          |test    ecxecx                        ;  商是否为0,不为零则把得到的ECX继续处理
  005428FE  |.^ 7F E0         \jg      short 005428E0
  00542900  |>  8BC6          mov     eaxesi                         ;  上面累加结果
  00542902  |.  B9 09000000   mov     ecx, 9
  00542907  |.  99            cdq
  00542908  |.  F7F9          idiv    ecx                              ;  对累加结果再进行处理对9求余
  0054290A  |.  8BC2          mov     eaxedx                         ;  结果返回
  0054290C  |.  5F            pop     edi
  0054290D  |.  5E            pop     esi
  0054290E  |.  5B            pop     ebx
  0054290F  \.  C3            retn
  
  ============================================
  计算4的Delphi代码:
  
  c:=1;
  e:=0;
  for i:=1 to 8 do 
  begin
    d:=(b mod $a)*i;
    e:=e+d;
    b:=b div $A;
  end;
  
  ============================================
  
  5、计算5
  00542AED  |.  83C3 09       add     ebx, 9                           ;  结果+9
  00542AF0  |.  2BD8          sub     ebxeax                         ;  减去求余处理的结果EAX(这两步为计算5)
  
  ============================================
  计算5的Delphi代码:
  
  e:=e mod 9;
  f:=f+9-e;
  password1.Text:=IntTostr(f);
  
  ============================================
  
--------------------------------------------------------------------------------
【总结】
  算法很简单,适合新手学习。
  
  练习delphi中内嵌汇编代码。
  
--------------------------------------------------------------------------------
【版权声明】: 转载请注明文章出自http://www.pediy.com



本代码的着色效果由xTiNt自动完成