【文章标题】: delphi控件ImageEn2.26算法分析
【文章作者】: 8713007
【软件名称】: ImageEn2.26
【软件大小】: 12M
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【保护方式】: 序列号
【编写语言】: delphi
【使用工具】: W32dsm8.93+,OD
【操作平台】: winxp
【软件介绍】: 一款非常优秀的图像控件,能实现多种图像各式的操作
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  ImageEn2.26是一款非常优秀的软件,安装后运行安装目录的setup.exe,勾选I have the serial Number,填入
  用户名SDlingying,序列号12345678901234,点击Next出现Invalid Serial Number,使用W32dsm8.93+反汇编,
  查找字符串,发现在00447B09处,利用OD载入,在其上的00447A7B下断,F9运行,勾选I have the serial Number,填入
  用户名SDlingying,序列号12345678901234,点击Next,程序被断下
  00447A7B   .  8B45 FC       mov     eax, [ebp-4]             ;  段在这里
  00447A7E   .  8B80 E4020000 mov     eax, [eax+2E4]
  00447A84   .  8B10          mov     edx, [eax]
  00447A86   .  FF92 B4000000 call    [edx+B4]                 ;  setup.00420F5C
  00447A8C   .  84C0          test    al, al
  00447A8E   .  0F84 84000000 je      00447B18
  00447A94   .  8D55 E0       lea     edx, [ebp-20]
  00447A97   .  8B45 FC       mov     eax, [ebp-4]
  00447A9A   .  8B80 DC020000 mov     eax, [eax+2DC]
  00447AA0   .  E8 C3E2FDFF   call    00425D68                 ;  取得用户名
  00447AA5   .  837D E0 00    cmp     dword ptr [ebp-20], 0    ;  比较是否位空
  00447AA9   .  74 6D         je      short 00447B18
  00447AAB   .  6A 12         push    12                       ;  12压栈
  00447AAD   .  68 73010000   push    173                      ;  173压栈
  00447AB2   .  8D55 DC       lea     edx, [ebp-24]
  00447AB5   .  8B45 FC       mov     eax, [ebp-4]
  00447AB8   .  8B80 DC020000 mov     eax, [eax+2DC]
  00447ABE   .  E8 A5E2FDFF   call    00425D68                 ;  取得用户名字长度入eax
  00447AC3   .  8B45 DC       mov     eax, [ebp-24]            ; |
  00447AC6   .  8D55 E5       lea     edx, [ebp-1B]            ; |[ebp-1b]入edx此处为0013f40d
  00447AC9   .  B9 12000000   mov     ecx, 12                  ; |12入Ecx
  00447ACE   .  E8 89040000   call    00447F5C                 ; \关键call,F7跟进
  00447AD3   .  C645 F7 00    mov     byte ptr [ebp-9], 0
  00447AD7   .  8D55 D8       lea     edx, [ebp-28]
  00447ADA   .  8B45 FC       mov     eax, [ebp-4]
  00447ADD   .  8B80 E0020000 mov     eax, [eax+2E0]
  00447AE3   .  E8 80E2FDFF   call    00425D68
  00447AE8   .  8B45 D8       mov     eax, [ebp-28]
  00447AEB   .  E8 64C3FBFF   call    00403E54
  00447AF0   .  8BD0          mov     edx, eax
  00447AF2   .  8D45 E5       lea     eax, [ebp-1B]
  00447AF5   .  E8 220AFCFF   call    0040851C
  00447AFA   .  85C0          test    eax, eax
  00447AFC   .  74 1A         je      short 00447B18           ;  爆破改这里
  00447AFE   .  6A 00         push    0                        ; /Arg1 = 00000000
  00447B00   .  66:8B0D A87C4>mov     cx, [447CA8]             ; |
  00447B07   .  33D2          xor     edx, edx                 ; |
  00447B09   .  B8 B47C4400   mov     eax, 00447CB4            ; |ASCII "Invalid serial number"
  00447B0E   .  E8 C9E4FFFF   call    00445FDC                 ; \setup.00445FDC
  00447B13   .  E9 52010000   jmp     00447C6A
  
  ///////////////////////////////////////////////////F7跟进后来到这里
  00447F5C  /$  55            push    ebp
  00447F5D  |.  8BEC          mov     ebp, esp
  00447F5F  |.  83C4 F4       add     esp, -0C
  00447F62  |.  53            push    ebx
  00447F63  |.  56            push    esi
  00447F64  |.  57            push    edi
  00447F65  |.  8955 F8       mov     [ebp-8], edx             ;  edx值(0013f40d)入ebp-8
  00447F68  |.  8945 FC       mov     [ebp-4], eax             ;  用户名入ebp-4
  00447F6B  |.  8B7D 08       mov     edi, [ebp+8]             ;  173入edi
  00447F6E  |.  8B5D 0C       mov     ebx, [ebp+C]             ;  12入ebx
  00447F71  |.  4B            dec     ebx                      ;  ebx-1
  00447F72  |.  85DB          test    ebx, ebx
  00447F74  |.  7C 38         jl      short 00447FAE           ;  小于0跳走
  00447F76  |.  43            inc     ebx                      ;  ebx+1
  00447F77  |.  C745 F4 00000>mov     dword ptr [ebp-C], 0
  00447F7E  |.  BE D8AA4400   mov     esi, 0044AAD8            ;  0044AAD8入esi
  00447F83  |>  8B45 FC       /mov     eax, [ebp-4]            ;  用户名入eax
  00447F86  |.  E8 05BDFBFF   |call    00403C90                ;  用户名长度入eax
  00447F8B  |.  50            |push    eax
  00447F8C  |.  8B45 F4       |mov     eax, [ebp-C]            ;  ebp-c入eax(首次为0)
  00447F8F  |.  5A            |pop     edx
  00447F90  |.  8BCA          |mov     ecx, edx                ;  edx入ecx
  00447F92  |.  99            |cdq                             ;  edx清0
  00447F93  |.  F7F9          |idiv    ecx                     ;  eax除以ecx,商入eax,余数入edx
  00447F95  |.  42            |inc     edx                     ;  edx+1
  00447F96  |.  8B45 FC       |mov     eax, [ebp-4]            ;  用户名入eax
  00447F99      8A4410 FF     mov     al, [eax+edx-1]          ;  取用户名第edx出的字符
  00447F9D  |.  8B16          |mov     edx, [esi]              ;  取[esi]处的值入edx
  00447F9F  |.  8B4D F8       |mov     ecx, [ebp-8]            ;  13f40d入ecx
  00447FA2  |.  880411        |mov     [ecx+edx], al           ;  将字符放在13f40d+edx处
  00447FA5  |.  FF45 F4       |inc     dword ptr [ebp-C]       ;  ebp-c处的值+1
  00447FA8  |.  83C6 04       |add     esi, 4                  ;  esi+4
  00447FAB  |.  4B            |dec     ebx                     ;  ebx-1
  00447FAC  |.^ 75 D5         \jnz     short 00447F83          ;  循环
  
  程序以上算法是将用户名前18位取出按照不同的位次重新组合,生成一个新的字符串。用户不足18位从头再取
  生成的字符串放在ebp-c处,我们设这个字符串为X,循环完成后来到这里
  
  
  00447FAE  |> \8B5D>mov     ebx, [ebp+C]           ;  12入ebx
  00447FB1 >|.  4B   dec     ebx                    ;  ebx-1
  00447FB2  |.  85DB test    ebx, ebx
  00447FB4  |.  7C 2>jl      short 00447FDF         ;  小于0跳走
  00447FB6  |.  43   inc     ebx                    ;  ebx+1
  00447FB7  |.  8B45>mov     eax, [ebp-8]           ;  X入eax
  00447FBA  |>  33D2 /xor     edx, edx              ;  edx清0
  00447FBC  |.  8A10 |mov     dl, [eax]             ;  依次取X的每个字符入dl
  00447FBE  |.  0FB7>|movzx   ecx, di               ;  di入ecx
  00447FC1  |.  C1E9>|shr     ecx, 8                ;  ecx shr 8
  00447FC4  |.  33D1 |xor     edx, ecx              ;  edx xor ecx
  00447FC6  |.  8810 |mov     [eax], dl             ;  将得到的值代替原来的字符串
  00447FC8  |.  33D2 |xor     edx, edx              ;  edx清0
  00447FCA  |.  8A10 |mov     dl, [eax]             ;  将计算后的值入dl
  00447FCC  |.  66:0>|add     di, dx                ;  di and dx
  00447FCF  |.  66:6>|imul    dx, di, 0CE6D         ;  dx=di imul 0ce6d
  00447FD4  |.  66:8>|add     dx, 58BF              ;  dx and 58bf
  00447FD9  |.  8BFA |mov     edi, edx              ;  edx入edi
  00447FDB  |.  40   |inc     eax                   ;  eax+1
  00447FDC  |.  4B   |dec     ebx                   ;  ebx-1
  00447FDD  |.^ 75 D>\jnz     short 00447FBA        ;  循环
  
  ///////////////////////////////////////以上程序将X进行一番运算,设X的值变为Y
  
  00447FDF  |> \8B5D>mov     ebx, [ebp+C]           ;  12入ebx
  00447FE2 >|.  4B   dec     ebx                    ;  ebx-1
  00447FE3  |.  85DB test    ebx, ebx
  00447FE5 >|.  7C 1>jl      short 00448004         ;  小于0跳走
  00447FE7  |.  43   inc     ebx                    ;  ebx+1
  00447FE8  |.  8B4D>mov     ecx, [ebp-8]           ;  Y入ecx
  00447FEB  |>  33C0 /xor     eax, eax              ;  eax清0
  00447FED  |.  8A01 |mov     al, [ecx]             ;  依次取Y的每位字符Ascii入al
  00447FEF  |.  BE 3>|mov     esi, 31               ;  31入esi
  00447FF4  |.  33D2 |xor     edx, edx
  00447FF6 >|.  F7F6 |div     esi                   ;  eax 除以esi商入eax余数入edx
  00447FF8  |.  8A82>|mov     al, [edx+44AAA4]      ;  44AAA4处是一个字符串表
  00447FFE  |.  8801 |mov     [ecx], al             ;  取edx+44AAA4处的值代替Y原来的字符
  00448000  |.  41   |inc     ecx                   ;  ecx+1
  00448001  |.  4B   |dec     ebx                   ;  ebx-1
  00448002  |.^ 75 E>\jnz     short 00447FEB        ;  循环
  //////////////////////////////////////////////////////////////////////////////////////////////////
  44AAA4处字符串表位:1Q2W3E4R5T6Y7U8I9A1S2D3F4G5H6J7K8L9ZX1C2V3B4N5M6Q7W
  这样计算出的字符串我们设为Z
  
  00448004  |> \8B5D>mov     ebx, [ebp+C]           ;  12入ebx
  00448007  |.  4B   dec     ebx                    ;  ebx-1
  00448008  |.  85DB test    ebx, ebx
  0044800A  |.  7C 2>jl      short 00448030         ;  小于0跳走
  0044800C  |.  43   inc     ebx                    ;  ebx+1
  0044800D  |.  8B45>mov     eax, [ebp-8]           ;  Z入eax
  00448010  |.  BE 2>mov     esi, 0044AB20          ;  0044ab20入esi
  00448015  |>  8A10 /mov     dl, [eax]             ;  依次取Z的每位字符入dl
  00448017  |.  8B0E |mov     ecx, [esi]            ;  esi处的值入ecx
  00448019  |.  8B7D>|mov     edi, [ebp-8]
  0044801C  |.  8A0C>|mov     cl, [edi+ecx]         ;  取第ecx+1处得字符入cl
  0044801F  |.  8808 |mov     [eax], cl             ;  取代原来的字符
  00448021  |.  8B0E |mov     ecx, [esi]            ;  esi处的值入ecx
  00448023  |.  8B7D>|mov     edi, [ebp-8]          ;  取代后生成的字符入edi
  00448026  |.  8814>|mov     [edi+ecx], dl         ;  dl入字符串的ecx+1处
  00448029  |.  83C6>|add     esi, 4                ;  esi+4
  0044802C  |.  40   |inc     eax                   ;  eax+1
  0044802D  |.  4B   |dec     ebx                   ;  ebx-1
  0044802E  |.^ 75 E>\jnz     short 00448015        ;  循环
  00448030  |> \5F   pop     edi
  00448031  |.  5E   pop     esi
  00448032  |.  5B   pop     ebx
  00448033  |.  8BE5 mov     esp, ebp
  00448035  |.  5D   pop     ebp
  00448036  \.  C2 0>retn    8////////////////////////////运算完成后返回
  算法分析完毕,不当之处请指正
  
  
  
  
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年11月17日 10:46:18