鹭影依凌 发表于 2007-12-6 22:43:58

Ultra PPT To HTML Converter 2.0.2007.1020算法分析

【破解作者】 鹭影依凌
【作者邮箱】 [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 , 0         ;用户名
0055823B|.75 20         jnz   short 0055825D                   ;//跳走
;---------------------------<提示输入用户名>
0055823D|.BA 08835500   mov   edx, 00558308                  ;please input your name!
00558242|.8B83 5C030000 mov   eax, dword ptr
00558248|.E8 E7EFF9FF   call    004F7234
0055824D|.8B83 34030000 mov   eax, dword ptr
00558253|.8B10          mov   edx, dword ptr
00558255|.FF92 C4000000 call    dword ptr
0055825B|.EB 6B         jmp   short 005582C8
0055825D|>83BB 04040000>cmp   dword ptr , 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
00558271|.E8 BEEFF9FF   call    004F7234
00558276|.8B83 3C030000 mov   eax, dword ptr
0055827C|.8B10          mov   edx, dword ptr
0055827E|.FF92 C4000000 call    dword ptr
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
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
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:
00558464|.64:8920       mov   dword ptr fs:, esp
00558467|.33FF          xor   edi, edi                         ;EDI置零
00558469|.8D45 FC       lea   eax, dword ptr
0055846C|.8B93 00040000 mov   edx, dword ptr          ;EDX = 用户名
00558472|.E8 B9C8EAFF   call    00404D30
00558477|.8D45 F8       lea   eax, dword ptr
0055847A|.8B93 04040000 mov   edx, dword ptr          ;EDX = 序列号
00558480|.E8 ABC8EAFF   call    00404D30
;---------------------------<序列号必须是16H位>----------------------|
00558485|.8B45 F8       mov   eax, dword ptr          ;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
00558499|.BA 03000000   mov   edx, 3
0055849E|.8B83 04040000 mov   eax, dword ptr          ;EAX = 序列号
005584A4|.E8 4390EEFF   call    004414EC                         ;=>取前三个字符
005584A9|.8B45 EC       mov   eax, dword ptr
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
005584BF|.BA 13000000   mov   edx, 13                        ;EDX = 13H
005584C4|.8B83 04040000 mov   eax, dword ptr          ;EAX = 序列号(除去前三个字符)
005584CA|.E8 9590EEFF   call    00441564
005584CF|.837D FC 00    cmp   dword ptr , 0             ;检测用户名是否为空
005584D3|.0F84 9F010000 je      00558678                         ;//跳则挂
005584D9|.837D F8 00    cmp   dword ptr , 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           ; = 序列号
005584F4|.4E            |dec   esi                           ;ESI--
005584F5|.85C0          |test    eax, eax
005584F7      74 05         je      short 005584FE
005584F9|.3B70 FC       |cmp   esi, dword ptr           ;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 , 2D      ;序列号第i个字符
00558509|.74 2A         |je      short 00558535                  ;//相等则扫描下一个
0055850B|.8D45 E8       |lea   eax, dword ptr
0055850E|.8B55 F8       |mov   edx, dword ptr           ; = 序列号
00558511|.4E            |dec   esi                           ;ESI--
00558512|.85D2          |test    edx, edx
00558514|.74 05         |je      short 0055851B
00558516|.3B72 FC       |cmp   esi, dword ptr           ;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       ;序列号第i个字符
00558525|.E8 56C9EAFF   |call    00404E80
0055852A|.8B55 E8       |mov   edx, dword ptr
0055852D|.8D45 F4       |lea   eax, dword ptr
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
0055853E|.8B55 F4       mov   edx, dword ptr          ;(ASCII "9876543210abcdef")
00558541|.E8 EAC7EAFF   call    00404D30
00558546|.8D45 F4       lea   eax, dword ptr
00558549|.E8 4AC7EAFF   call    00404C98
0055854E|.8B45 F8       mov   eax, dword ptr          ;(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
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           ;(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           ;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       ;字符串第i个字符('9')
00558599|.E8 E2C8EAFF   |call    00404E80
0055859E|.8B55 E4       |mov   edx, dword ptr
005585A1|.8D45 F0       |lea   eax, dword ptr
005585A4|.E8 C7C9EAFF   |call    00404F70
005585A9|.EB 36         |jmp   short 005585E1                  ;//跳到循环体尾部
005585AB|>8D45 E0       |lea   eax, dword ptr          ;->>奇数来到这
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
005585BD|.4A            |dec   edx
005585BE|.85C9          |test    ecx, ecx
005585C0|.74 05         |je      short 005585C7
005585C2|.3B51 FC       |cmp   edx, dword ptr           ; = 序列号长度
005585C5|.72 05         |jb      short 005585CC                  ;//跳走
005585C7|>E8 B4B7EAFF   |call    00403D80                        ;发生异常
005585CC|>42            |inc   edx
005585CD|.8A5411 FF   |mov   dl, byte ptr       ;字符串第i个字符('8')
005585D1|.E8 AAC8EAFF   |call    00404E80
005585D6|.8B55 E0       |mov   edx, dword ptr
005585D9|.8D45 F4       |lea   eax, dword ptr
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          ;
005585EE|.E8 A5C6EAFF   call    00404C98
;---------------------------<将偶数组字符"倒位排列">-----------------|
005585F3|.33DB          xor   ebx, ebx                         ;EBX置零
005585F5|>8D45 DC       /lea   eax, dword ptr          ;
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           ;(ASCII "86420bdf")
00558609|.4A            |dec   edx
0055860A|.85C9          |test    ecx, ecx
0055860C|.74 05         |je      short 00558613
0055860E|.3B51 FC       |cmp   edx, dword ptr           ;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       ;第(8-i)个字符
0055861D|.E8 5EC8EAFF   |call    00404E80
00558622|.8B55 DC       |mov   edx, dword ptr
00558625|.8D45 FC       |lea   eax, dword ptr
00558628|.E8 43C9EAFF   |call    00404F70
0055862D|.43            |inc   ebx                           ;EBX++
0055862E|.83FB 08       |cmp   ebx, 8
00558631|.^ 75 C2         \jnz   short 005585F5                  ;//循环
;---------------------------<将奇数组字符进行MD5处理>------------|
00558633|.8D55 D8       lea   edx, dword ptr
00558636|.8B45 F0       mov   eax, dword ptr           ;(ASCII "97135ace")
00558639|.E8 EA0DFFFF   call    00549428                         ;MD5
0055863E|.8B55 D8       mov   edx, dword ptr           ;(ASCII "92E26038B0A6E307EA798AF62CA5833B")
00558641|.8D45 F0       lea   eax, dword ptr
00558644|.E8 E7C6EAFF   call    00404D30
00558649|.8D4D D4       lea   ecx, dword ptr
;---------------------------<取MD5值的后八个字符>--------------------|
0055864C|.BA 08000000   mov   edx, 8                           ;EDX = 8
00558651|.8B45 F0       mov   eax, dword ptr           ;(ASCII "92E26038B0A6E307EA798AF62CA5833B")
00558654|.E8 9B8FEEFF   call    004415F4                         ;取MD5值的后8个字符
00558659|.8B55 D4       mov   edx, dword ptr           ;(ASCII "2CA5833B")
0055865C|.8D45 F0       lea   eax, dword ptr
0055865F|.E8 CCC6EAFF   call    00404D30
;---------------------------<倒置的偶数组和MD5后八位比较>------------|
00558664|.8B45 FC       mov   eax, dword ptr          ;(ASCII "fdb02468")
00558667|.8B55 F0       mov   edx, dword ptr           ;(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:, edx
00558680|.68 9A865500   push    0055869A
00558685|>8D45 D4       lea   eax, dword ptr
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加密
取后8个字符,所成字符串为str3
str3 = MD5(str1)的后8位

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

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

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

--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

绝恋de烦神 发表于 2007-12-6 23:01:15

好文章。。兄弟你的分析好详细啊。。学习了。。嘻嘻。。

sufeiyu 发表于 2007-12-17 09:29:13

分析的很详细 谢谢了

pw2000 发表于 2007-12-19 14:05:30

向楼主学习...

deag123 发表于 2008-1-1 09:58:41

厉害。。。。。。

backboy 发表于 2008-1-2 11:18:33

兄弟,请教下,那个“97135ace”MD5算出来的结果怎么跟用从看雪下来的christal_cryptotool12.zip算出来的不一样?
看雪的算出来的是MD5:         46FD61804E83755C28D0822625498ADF

hunter 发表于 2008-1-7 20:50:22

好文,学习了
页: [1]
查看完整版本: Ultra PPT To HTML Converter 2.0.2007.1020算法分析