|
【破解作者】 鹭影依凌
【作者邮箱】 [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
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! |
|