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
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! 好文章。。兄弟你的分析好详细啊。。学习了。。嘻嘻。。 分析的很详细 谢谢了 向楼主学习... 厉害。。。。。。 兄弟,请教下,那个“97135ace”MD5算出来的结果怎么跟用从看雪下来的christal_cryptotool12.zip算出来的不一样?
看雪的算出来的是MD5: 46FD61804E83755C28D0822625498ADF 好文,学习了
页:
[1]