飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6731|回复: 6

[原创] Ultra PPT To HTML Converter 2.0.2007.1020算法分析

[复制链接]

该用户从未签到

发表于 2007-12-6 22:43:58 | 显示全部楼层 |阅读模式
破解作者】 鹭影依凌
【作者邮箱】 [email protected]
【使用工具】 ODv1.10
【破解平台】 Win9x/NT/2000/XP
【软件名称】 Ultra PPT To HTML Converter 2.0.2007.1020
【下载地址】 http://www.newhua.com/soft/56520.htm
【软件简介】  批量转换包括 Word 文档 (*.DOC),Powerpoint 文件 (*.PPT),Excel 工作簿 (*.XLS) 在内的各类 Office 文档为 HTML 网页文件。无需预装 Office,只要把待转换的文件添加到列表然后直接点击转换即可
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】

一、代码分析

试练码
ID:luying10
SN:P2H9876-5432-10ab-cdef

OD超级字符串定位(invalid registration code!)

具体分析如下:

;====================================================================|
005581CC  /.  55            push    ebp                              ;  //下断
005581CD  |.  8BEC          mov     ebp, esp
005581CF  |.  33C9          xor     ecx, ecx
............................                                         ;  //省略代码
0055822F  |.  E8 B8CAEAFF   call    00404CEC                        
00558234  |.  83BB 00040000>cmp     dword ptr [ebx+400], 0           ;  用户名
0055823B  |.  75 20         jnz     short 0055825D                   ;  //跳走
;---------------------------<提示输入用户名>
0055823D  |.  BA 08835500   mov     edx, 00558308                    ;  please input your name!
00558242  |.  8B83 5C030000 mov     eax, dword ptr [ebx+35C]
00558248  |.  E8 E7EFF9FF   call    004F7234
0055824D  |.  8B83 34030000 mov     eax, dword ptr [ebx+334]
00558253  |.  8B10          mov     edx, dword ptr [eax]
00558255  |.  FF92 C4000000 call    dword ptr [edx+C4]
0055825B  |.  EB 6B         jmp     short 005582C8
0055825D  |>  83BB 04040000>cmp     dword ptr [ebx+404], 0           ;  序列号
00558264  |.  75 20         jnz     short 00558286                   ;  //跳走
;---------------------------<提示输入序列号>
00558266  |.  BA 3C835500   mov     edx, 0055833C                    ;  please input your registration code!
0055826B  |.  8B83 5C030000 mov     eax, dword ptr [ebx+35C]
00558271  |.  E8 BEEFF9FF   call    004F7234
00558276  |.  8B83 3C030000 mov     eax, dword ptr [ebx+33C]
0055827C  |.  8B10          mov     edx, dword ptr [eax]
0055827E  |.  FF92 C4000000 call    dword ptr [edx+C4]
00558284  |.  EB 42         jmp     short 005582C8
;---------------------------{算法验证}
00558286  |>  8BC3          mov     eax, ebx
00558288  |.  E8 B7010000   call    00558444                         ;  |*|关键CALL
0055828D  |.  85C0          test    eax, eax                         ;  
0055828F  |.  74 19         je      short 005582AA                   ;  //跳则挂
;---------------------------<提示注册成功>
00558291  |.  BA 8C835500   mov     edx, 0055838C                    ;  thank you for registration! all limitations are removed now.
00558296  |.  8B83 5C030000 mov     eax, dword ptr [ebx+35C]
0055829C  |.  E8 93EFF9FF   call    004F7234                         ;  //提示"注册成功"
005582A1  |.  8BC3          mov     eax, ebx
005582A3  |.  E8 08040000   call    005586B0
005582A8  |.  EB 1E         jmp     short 005582C8
;---------------------------<提示注册失败>
005582AA  |>  BA 0C845500   mov     edx, 0055840C                    ;  invalid registration code!
005582AF  |.  8B83 5C030000 mov     eax, dword ptr [ebx+35C]
005582B5  |.  E8 7AEFF9FF   call    004F7234                         ;  //提示"注册失败"
....................................                                 ;  //省略代码

;====================================================================|
;在地址00558288处F7跟进关键CALL->00558444
;--------------------------------------------------------------------|
00558444  /$  55            push    ebp                              ;  //本地调用来自 0055797F, 00557C35, 00557D67, 00558288, 00559354
00558445  |.  8BEC          mov     ebp, esp
00558447  |.  B9 05000000   mov     ecx, 5                           ;  ECX = 5
0055844C  |>  6A 00         /push    0                               ;  开辟一段堆栈
0055844E  |.  6A 00         |push    0                               ;  初始化为0
00558450  |.  49            |dec     ecx
00558451  |.^ 75 F9         \jnz     short 0055844C                  ;  //循环5次
00558453  |.  51            push    ecx
00558454  |.  53            push    ebx
00558455  |.  56            push    esi
00558456  |.  57            push    edi
00558457  |.  8BD8          mov     ebx, eax
00558459  |.  33C0          xor     eax, eax                         ;  EAX置零
0055845B  |.  55            push    ebp
0055845C  |.  68 93865500   push    00558693
00558461  |.  64:FF30       push    dword ptr fs:[eax]
00558464  |.  64:8920       mov     dword ptr fs:[eax], esp
00558467  |.  33FF          xor     edi, edi                         ;  EDI置零
00558469  |.  8D45 FC       lea     eax, dword ptr [ebp-4]
0055846C  |.  8B93 00040000 mov     edx, dword ptr [ebx+400]         ;  EDX = 用户名
00558472  |.  E8 B9C8EAFF   call    00404D30
00558477  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
0055847A  |.  8B93 04040000 mov     edx, dword ptr [ebx+404]         ;  EDX = 序列号
00558480  |.  E8 ABC8EAFF   call    00404D30
;---------------------------<序列号必须是16H位>----------------------|
00558485  |.  8B45 F8       mov     eax, dword ptr [ebp-8]           ;  EAX = 序列号
00558488  |.  E8 DBCAEAFF   call    00404F68                         ;  取序列号长度
0055848D  |.  83F8 16       cmp     eax, 16                          ;  序列号必须是16H位
00558490  |.  0F85 E2010000 jnz     00558678                         ;  //跳则挂
;---------------------------<序列号前三个字符必须是"P2H">------------|
00558496  |.  8D4D EC       lea     ecx, dword ptr [ebp-14]
00558499  |.  BA 03000000   mov     edx, 3
0055849E  |.  8B83 04040000 mov     eax, dword ptr [ebx+404]         ;  EAX = 序列号
005584A4  |.  E8 4390EEFF   call    004414EC                         ;  =>取前三个字符
005584A9  |.  8B45 EC       mov     eax, dword ptr [ebp-14]
005584AC  |.  BA AC865500   mov     edx, 005586AC                    ;  ASCII "P2H"
005584B1  |.  E8 FECBEAFF   call    004050B4                         ;  字符串比较
005584B6  |.  0F85 BC010000 jnz     00558678                         ;  //跳则挂
;---------------------------<验证注册信息是否为空>-------------------|
005584BC  |.  8D4D F8       lea     ecx, dword ptr [ebp-8]
005584BF  |.  BA 13000000   mov     edx, 13                          ;  EDX = 13H
005584C4  |.  8B83 04040000 mov     eax, dword ptr [ebx+404]         ;  EAX = 序列号(除去前三个字符)
005584CA  |.  E8 9590EEFF   call    00441564
005584CF  |.  837D FC 00    cmp     dword ptr [ebp-4], 0             ;  检测用户名是否为空
005584D3  |.  0F84 9F010000 je      00558678                         ;  //跳则挂
005584D9  |.  837D F8 00    cmp     dword ptr [ebp-8], 0             ;  检测序列号是否为空
005584DD  |.  0F84 95010000 je      00558678                         ;  //跳则挂
;---------------------------<序列号中必须有三个连字符'-'>------------|
005584E3  |.  33DB          xor     ebx, ebx                         ;  EBX置零
005584E5  |>  8BF3          /mov     esi, ebx                        ;  ESI = EBX
005584E7  |.  83C6 01       |add     esi, 1                          ;  ESI++
005584EA  |.  71 05         |jno     short 005584F1                  ;  //跳走
005584EC  |.  E8 97B8EAFF   |call    00403D88
005584F1  |>  8B45 F8       |mov     eax, dword ptr [ebp-8]          ;  [ebp-8] = 序列号
005584F4  |.  4E            |dec     esi                             ;  ESI--
005584F5  |.  85C0          |test    eax, eax
005584F7      74 05         je      short 005584FE
005584F9  |.  3B70 FC       |cmp     esi, dword ptr [eax-4]          ;  EDX & 16相比
005584FC  |.  72 05         |jb      short 00558503                  ;  //跳走
005584FE  |>  E8 7DB8EAFF   |call    00403D80                        ;  发生异常
00558503  |>  46            |inc     esi                             ;  ESI++
00558504  |.  807C30 FF 2D  |cmp     byte ptr [eax+esi-1], 2D        ;  序列号第i个字符
00558509  |.  74 2A         |je      short 00558535                  ;  //相等则扫描下一个
0055850B  |.  8D45 E8       |lea     eax, dword ptr [ebp-18]
0055850E  |.  8B55 F8       |mov     edx, dword ptr [ebp-8]          ;  [ebp-8] = 序列号
00558511  |.  4E            |dec     esi                             ;  ESI--
00558512  |.  85D2          |test    edx, edx
00558514  |.  74 05         |je      short 0055851B
00558516  |.  3B72 FC       |cmp     esi, dword ptr [edx-4]          ;  EDX & 16相比
00558519  |.  72 05         |jb      short 00558520                  ;  //跳走
0055851B  |>  E8 60B8EAFF   |call    00403D80                        ;  发生异常
00558520  |>  46            |inc     esi                             ;  ESI++
00558521  |.  8A5432 FF     |mov     dl, byte ptr [edx+esi-1]        ;  序列号第i个字符
00558525  |.  E8 56C9EAFF   |call    00404E80
0055852A  |.  8B55 E8       |mov     edx, dword ptr [ebp-18]
0055852D  |.  8D45 F4       |lea     eax, dword ptr [ebp-C]
00558530  |.  E8 3BCAEAFF   |call    00404F70
00558535  |>  43            |inc     ebx                             ;  EBX++
00558536  |.  83FB 13       |cmp     ebx, 13
00558539  |.^ 75 AA         \jnz     short 005584E5                  ;  //循环
;---------------------------<剔除连字符'-'>--------------------------|
0055853B  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
0055853E  |.  8B55 F4       mov     edx, dword ptr [ebp-C]           ;  (ASCII "9876543210abcdef")
00558541  |.  E8 EAC7EAFF   call    00404D30
00558546  |.  8D45 F4       lea     eax, dword ptr [ebp-C]
00558549  |.  E8 4AC7EAFF   call    00404C98
0055854E  |.  8B45 F8       mov     eax, dword ptr [ebp-8]           ;  (ASCII "9876543210abcdef")
00558551  |.  E8 12CAEAFF   call    00404F68                         ;  取字符串长度
00558556  |.  83F8 10       cmp     eax, 10
00558559  |.  0F85 19010000 jnz     00558678                         ;  //跳则挂
;---------------------------<将序列号分组(按奇数位偶数位)>-----------|
0055855F  |.  33DB          xor     ebx, ebx                         ;  EBX置零
00558561  |>  8BC3          /mov     eax, ebx                        ;  EAX = EBX
00558563  |.  25 01000080   |and     eax, 80000001
00558568  |.  79 05         |jns     short 0055856F                  ;  //偶数跳走
0055856A  |.  48            |dec     eax
0055856B  |.  83C8 FE       |or      eax, FFFFFFFE
0055856E  |.  40            |inc     eax
0055856F  |>  85C0          |test    eax, eax
00558571  |.  75 38         |jnz     short 005585AB                  ;  //奇数跳走
00558573  |.  8D45 E4       |lea     eax, dword ptr [ebp-1C]
00558576  |.  8BD3          |mov     edx, ebx                        ;  EDX = EBX
00558578  |.  83C2 01       |add     edx, 1                          ;  EDX++
0055857B      71 05         jno     short 00558582                   ;  //跳走
0055857D  |.  E8 06B8EAFF   |call    00403D88                        ;  发生异常
00558582  |>  8B4D F8       |mov     ecx, dword ptr [ebp-8]          ;  (ASCII "9876543210abcdef")
00558585  |.  4A            |dec     edx                             ;  EDX--
00558586  |.  85C9          |test    ecx, ecx
00558588  |.  74 05         |je      short 0055858F
0055858A  |.  3B51 FC       |cmp     edx, dword ptr [ecx-4]          ;  EDX & 16相比
0055858D  |.  72 05         |jb      short 00558594                  ;  //跳走
0055858F  |>  E8 ECB7EAFF   |call    00403D80                        ;  发生异常
00558594  |>  42            |inc     edx                             ;  EDX++
00558595  |.  8A5411 FF     |mov     dl, byte ptr [ecx+edx-1]        ;  字符串第i个字符('9')
00558599  |.  E8 E2C8EAFF   |call    00404E80
0055859E  |.  8B55 E4       |mov     edx, dword ptr [ebp-1C]
005585A1  |.  8D45 F0       |lea     eax, dword ptr [ebp-10]
005585A4  |.  E8 C7C9EAFF   |call    00404F70
005585A9  |.  EB 36         |jmp     short 005585E1                  ;  //跳到循环体尾部
005585AB  |>  8D45 E0       |lea     eax, dword ptr [ebp-20]         ;  ->>奇数来到这
005585AE  |.  8BD3          |mov     edx, ebx
005585B0  |.  83C2 01       |add     edx, 1
005585B3  |.  71 05         |jno     short 005585BA                  ;  //跳走
005585B5  |.  E8 CEB7EAFF   |call    00403D88                        ;  发生异常
005585BA  |>  8B4D F8       |mov     ecx, dword ptr [ebp-8]
005585BD  |.  4A            |dec     edx
005585BE  |.  85C9          |test    ecx, ecx
005585C0  |.  74 05         |je      short 005585C7
005585C2  |.  3B51 FC       |cmp     edx, dword ptr [ecx-4]          ;  [edx-4] = 序列号长度
005585C5  |.  72 05         |jb      short 005585CC                  ;  //跳走
005585C7  |>  E8 B4B7EAFF   |call    00403D80                        ;  发生异常
005585CC  |>  42            |inc     edx
005585CD  |.  8A5411 FF     |mov     dl, byte ptr [ecx+edx-1]        ;  字符串第i个字符('8')
005585D1  |.  E8 AAC8EAFF   |call    00404E80
005585D6  |.  8B55 E0       |mov     edx, dword ptr [ebp-20]
005585D9  |.  8D45 F4       |lea     eax, dword ptr [ebp-C]
005585DC  |.  E8 8FC9EAFF   |call    00404F70
005585E1  |>  43            |inc     ebx                             ;  EBX++
005585E2  |.  83FB 10       |cmp     ebx, 10
005585E5  |.^ 0F85 76FFFFFF \jnz     00558561                        ;  //循环
;---------------------------{分组完成}-------------------------------|
分组后结果如下:
奇数组:"97135ace"
偶数组:"86420bdf"
;--------------------------------------------------------------------|
005585EB  |.  8D45 FC       lea     eax, dword ptr [ebp-4]           ;  
005585EE  |.  E8 A5C6EAFF   call    00404C98
;---------------------------<将偶数组字符"倒位排列">-----------------|
005585F3  |.  33DB          xor     ebx, ebx                         ;  EBX置零
005585F5  |>  8D45 DC       /lea     eax, dword ptr [ebp-24]         ;  
005585F8  |.  BA 08000000   |mov     edx, 8                          ;  EDX = 8
005585FD  |.  2BD3          |sub     edx, ebx                        ;  EDX = EDX - EBX
005585FF  |.  71 05         |jno     short 00558606                  ;  //跳走
00558601  |.  E8 82B7EAFF   |call    00403D88
00558606  |>  8B4D F4       |mov     ecx, dword ptr [ebp-C]          ;  (ASCII "86420bdf")
00558609  |.  4A            |dec     edx
0055860A  |.  85C9          |test    ecx, ecx
0055860C  |.  74 05         |je      short 00558613
0055860E  |.  3B51 FC       |cmp     edx, dword ptr [ecx-4]          ;  EDX & 8相比
00558611  |.  72 05         |jb      short 00558618                  ;  //跳走
00558613  |>  E8 68B7EAFF   |call    00403D80
00558618  |>  42            |inc     edx                             ;  EDX++
00558619  |.  8A5411 FF     |mov     dl, byte ptr [ecx+edx-1]        ;  第(8-i)个字符
0055861D  |.  E8 5EC8EAFF   |call    00404E80
00558622  |.  8B55 DC       |mov     edx, dword ptr [ebp-24]
00558625  |.  8D45 FC       |lea     eax, dword ptr [ebp-4]
00558628  |.  E8 43C9EAFF   |call    00404F70
0055862D  |.  43            |inc     ebx                             ;  EBX++
0055862E  |.  83FB 08       |cmp     ebx, 8
00558631  |.^ 75 C2         \jnz     short 005585F5                  ;  //循环
;---------------------------<将奇数组字符进行MD5[32]处理>------------|
00558633  |.  8D55 D8       lea     edx, dword ptr [ebp-28]
00558636  |.  8B45 F0       mov     eax, dword ptr [ebp-10]          ;  (ASCII "97135ace")
00558639  |.  E8 EA0DFFFF   call    00549428                         ;  MD5[32]
0055863E  |.  8B55 D8       mov     edx, dword ptr [ebp-28]          ;  (ASCII "92E26038B0A6E307EA798AF62CA5833B")
00558641  |.  8D45 F0       lea     eax, dword ptr [ebp-10]
00558644  |.  E8 E7C6EAFF   call    00404D30
00558649  |.  8D4D D4       lea     ecx, dword ptr [ebp-2C]
;---------------------------<取MD5值的后八个字符>--------------------|
0055864C  |.  BA 08000000   mov     edx, 8                           ;  EDX = 8
00558651  |.  8B45 F0       mov     eax, dword ptr [ebp-10]          ;  (ASCII "92E26038B0A6E307EA798AF62CA5833B")
00558654  |.  E8 9B8FEEFF   call    004415F4                         ;  取MD5值的后8个字符
00558659  |.  8B55 D4       mov     edx, dword ptr [ebp-2C]          ;  (ASCII "2CA5833B")
0055865C  |.  8D45 F0       lea     eax, dword ptr [ebp-10]
0055865F  |.  E8 CCC6EAFF   call    00404D30
;---------------------------<倒置的偶数组和MD5后八位比较>------------|
00558664  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ;  (ASCII "fdb02468")
00558667  |.  8B55 F0       mov     edx, dword ptr [ebp-10]          ;  (ASCII "2CA5833B")
0055866A  |.  E8 45CAEAFF   call    004050B4                         ;  字符串比较
0055866F  |.  75 05         jnz     short 00558676                   ;  //跳则挂
;---------------------------|
00558671  |.  83CF FF       or      edi, FFFFFFFF                    ;  <标志位赋值>      
00558674  |.  EB 02         jmp     short 00558678                   ;  //跳走
;---------------------------|
00558676  |>  33FF          xor     edi, edi                         ;  EDI置零                        
00558678  |>  33C0          xor     eax, eax                         ;  EAX置零
0055867A  |.  5A            pop     edx
0055867B  |.  59            pop     ecx
0055867C  |.  59            pop     ecx
0055867D  |.  64:8910       mov     dword ptr fs:[eax], edx
00558680  |.  68 9A865500   push    0055869A
00558685  |>  8D45 D4       lea     eax, dword ptr [ebp-2C]
00558688  |.  BA 0B000000   mov     edx, 0B
0055868D  |.  E8 2AC6EAFF   call    00404CBC
00558692  \.  C3            retn
00558693   .^ E9 44BFEAFF   jmp     004045DC
00558698   .^ EB EB         jmp     short 00558685
0055869A   .  8BC7          mov     eax, edi                         ;  EAX = EDI
0055869C   .  5F            pop     edi
0055869D   .  5E            pop     esi
0055869E   .  5B            pop     ebx
0055869F   .  8BE5          mov     esp, ebp
005586A1   .  5D            pop     ebp
005586A2   .  C3            retn                                     ;  //返回
;====================================================================|


二、算法总结

1.序列号格式
P2HXXXX-XXXX-XXXX-XXXX
说明:其中连字符的位置可以不确定
     但必须在P2H之后

2.去除P2H和连字符'-'剩下16个字符
将这16个字符分成两组
奇数组(奇数位置上的字符)
偶数组(偶数位置上的字符)

3.将奇数组字符串str1进行MD5[32]加密
  取后8个字符,所成字符串为str3
  str3 = MD5[32](str1)的后8位

4.将偶数组字符串str2各个字符位置倒置
  得到新字符串str4

5.校验
if(str3 == str4)
    return ture;
else
    return false;

一组可用的序列号(区分大小写)
P2H9B73533815aAcCe2

--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2020-8-30 18:31
  • 签到天数: 52 天

    [LV.5]常住居民I

    发表于 2007-12-6 23:01:15 | 显示全部楼层
    好文章。。兄弟你的分析好详细啊。。学习了。。嘻嘻。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-7-26 16:07
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2007-12-17 09:29:13 | 显示全部楼层
    分析的很详细 谢谢了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-19 14:05:30 | 显示全部楼层
    向楼主学习...
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-1-1 09:58:41 | 显示全部楼层
    厉害。。。。。。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-1-2 11:18:33 | 显示全部楼层
    兄弟,请教下,那个“97135ace”MD5算出来的结果怎么跟用从看雪下来的christal_cryptotool12.zip算出来的不一样?
    看雪的算出来的是MD5:         46FD61804E83755C28D0822625498ADF
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-1-7 20:50:22 | 显示全部楼层
    好文,学习了
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表