• 标 题:Magic convertor 2.8注册码算法分析 - OCG (9千字)
  • 作 者:alphakk
  • 时 间:2002-4-3 16:39:00
  • 链 接:http://bbs.pediy.com

Magic convertor 2.8注册码算法分析
===================================
简介:

  功能强大的图像转换工具。包括图像浏览、批量转换、图像增强及作品预览四大部分。图像增强包括调整图像大小、调整层次、旋转、镜象,还有锐化、模糊、马塞克、浮雕、底片、旋涡、喷雾等效果。你可以将这些效果自定义成方案,然后再进行批量转换。而且它还支持拖入文件到批量转换列表。它的输出格式为:bmp、jpg、gif、png、tif、wmf、emf、tga、ico,还包括txt、rtf、htm、mmc等特效格式。特效格式包括正常模式、缩小一倍、缩小两倍、原图大小、彩字单一、彩字规律。同时它还能方便的将图像生成.EXE可执行文件。



主要功能:
1、可以方便的浏览图像。支持BMP,JPG,GIF,TIF,PNG,PCX等大部分图像格式

2、可方便的转换不同的图像文件

3、支持拖入文件到批量转换

4、能快速的批量转换出你想要的图像格式

5、输出的图像格式为:BMP、JPG、GIF、ICO(支持32位图标)、PNG、TIF、WMF、EMF、TGA

6、能转换出TXT、HTM、RTF等特效格式,可用于欣赏也可用于聊天室灌水

7、能将图片生成.EXE可执行文件

8、能将图标生成MIRC聊天室的图形格式(.MMC)

9、能对图像进行增强。包括图像大小、调整层次、旋转、镜象,还有锐化、模糊、马塞克、浮雕、底片、旋涡、喷雾等效果

10、支持WINDOWS右键菜单功能

11、能对图像进行优化,保存为网页图像格式

=======================================================
未注册的限制


未注册版只提供30天的使用,转换ICO文件后会贴上魔法转换图标,而且创建EXE文件后会留下版权信息,每次打开主程序还会出现关于窗口。
注册版将提供无限期的使用和全部功能
======================================================

分析:
在注册框中用户名输入:alpha
注册码输入:98765432
bpx hmemcpy下断,按F12数下直到第一次看到地址167:004xxxxx停下,换F10继续跟踪,
来到如下地址处:

:00583543 837DFC00                cmp dword ptr [ebp-04], 00000000  <<----比较用户名是否为空
:00583547 7533                    jne 0058357C      <<-----非空则跳
  。
  。继续跟踪
  。
来到:
:005877D3 8B1544F65900            mov edx, dword ptr [0059F644]  <<------黑名单->EDX
:005877D9 8B45FC                  mov eax, dword ptr [ebp-04]      <<------用户名->EAX
:005877DC E8EBCBE7FF              call 004043CC                    <<------比较函数,测试用户名是否在黑名单中
:005877E1 85C0                    test eax, eax
:005877E3 744C                    je 00587831           <<------不同则跳
  。
  。继续跟踪
  。
来到:
:005835A3 E8CC57EBFF              call 00438D74          <<------输入的注册码的长度->EAX
:005835A8 8B45F0                  mov eax, dword ptr [ebp-10]      <<------输入的注册码的首地址->EAX
:005835AB 50                      push eax                        <<------EAX入栈
  。
  。
:005835B5 E8BA57EBFF              call 00438D74          <<------输入的用户的长度->EAX
:005835BA 8B45E8                  mov eax, dword ptr [ebp-18]      <<------用户名的首地址
  。
  。
:0058844F 8BC7                    mov eax, edi           <<------用户名->EAX
:00588451 E88ABCE7FF              call 004040E0                    <<------取得用户名的长度并送入EAX
:00588456 85C0                    test eax, eax
:00588458 0F8EBF000000            jle 0058851D
:0058845E 8945F4                  mov dword ptr [ebp-0C], eax   <<------保存EAX的值
:00588461 BE01000000              mov esi, 00000001        <<------ESI赋初值

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00588517(C)
|
:00588466 33C0                    xor eax, eax          <<--------EAX清零,注册码算法开始
:00588468 8A4437FF                mov al, byte ptr [edi+esi-01] <<---------用户名的第一个字母"a"的ASCII码送入AL
:0058846C 99                      cdq              
:0058846D F7FE                    idiv esi                      <<---------EAX IDIV ESI->EAX
:0058846F 8945FC                  mov dword ptr [ebp-04], eax    <<---------保存EAX的值
:00588472 8BC7                    mov eax, edi         <<----------用户名送入EAX
:00588474 E867BCE7FF              call 004040E0        <<-----------取得用户名的长度并送入EAX
:00588479 50                      push eax          <<------------保存EAX
:0058847A 8B45FC                  mov eax, dword ptr [ebp-04] <<-----------取得58846F处保存的值送入EAX
:0058847D 5A                      pop edx           <<-----------用户名的长度送入EDX
:0058847E 8BCA                    mov ecx, edx
:00588480 99                      cdq
:00588481 F7F9                    idiv ecx          <<------------EAX IDIV ECX->EAX
:00588483 33D2                    xor edx, edx                <<------------EDX清零
:00588485 8A5437FF                mov dl, byte ptr [edi+esi-01] <<----------用户名的第一个字母"a"的ASCII码送入DL
:00588489 83C203                  add edx, 00000003
:0058848C F7EA                    imul edx          <<------------EAX IMUL EDX->EAX
:0058848E 8D4DF0                  lea ecx, dword ptr [ebp-10]
:00588491 BA03000000              mov edx, 00000003
:00588496 E8DD0FE8FF              call 00409478              <<------------将EAX中的值(此处是76C)转化为字符串”76C"并保存
:0058849B 8B55F0                  mov edx, dword ptr [ebp-10] <<-----------串"76C"的首地址->EDX
:0058849E 8D45F8                  lea eax, dword ptr [ebp-08]
:005884A1 E842BCE7FF              call 004040E8
:005884A6 8B45F8                  mov eax, dword ptr [ebp-08]
:005884A9 E832BCE7FF              call 004040E0                <<----------取得串"76C"的长度->EAX
:005884AE 50                      push eax
:005884AF 8B45FC                  mov eax, dword ptr [ebp-04]  <<----------用户名的第一个字母"a"送入EAX
:005884B2 5A                      pop edx           <<----------串"76C"的长度->EDX
:005884B3 8BCA                    mov ecx, edx
:005884B5 99                      cdq
:005884B6 F7F9                    idiv ecx
:005884B8 8B55F8                  mov edx, dword ptr [ebp-08]  <<----------串"76C"的首地址->EDX
:005884BB 0FB65432FF              movzx edx, byte ptr [edx+esi-01] <<------串"76C"的第一个字符"7"的ASCII码送入EDX
:005884C0 83C202                  add edx, 00000002
:005884C3 F7EA                    imul edx             <<-----EAX IMUL EDX->EAX(此处EAX=720)
:005884C5 8D4DEC                  lea ecx, dword ptr [ebp-14]
:005884C8 BA02000000              mov edx, 00000002
:005884CD E8A60FE8FF              call 00409478          <<------将EAX的值(此时为720)转化为串("720")并保存
:005884D2 8B55EC                  mov edx, dword ptr [ebp-14]
:005884D5 8BC3                    mov eax, ebx
:005884D7 E80CBCE7FF              call 004040E8
:005884DC 8B03                    mov eax, dword ptr [ebx]    <<-------串"720"的首地址->EAX
:005884DE E8FDBBE7FF              call 004040E0                  <<-------取得串"720"的长度->EAX
:005884E3 83F808                  cmp eax, 00000008
:005884E6 7D10                    jge 005884F8          
:005884E8 8B0B                    mov ecx, dword ptr [ebx]
:005884EA 8BC3                    mov eax, ebx

* Possible StringData Ref from Code Obj ->"M0C"
                                |
:005884EC BA58855800              mov edx, 00588558
:005884F1 E836BCE7FF              call 0040412C            <<-------连接串"M0C"与"720"并将新串的长度送入EAX
:005884F6 EB1B                    jmp 00588513

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005884E6(C)
|
:005884F8 8B03                    mov eax, dword ptr [ebx] 
:005884FA E8E1BBE7FF              call 004040E0    <<------计算所得注册码的长度
:005884FF 83F80C                  cmp eax, 0000000C
:00588502 7E0F                    jle 00588513    
:00588504 53                      push ebx
:00588505 8B03                    mov eax, dword ptr [ebx]
:00588507 B90C000000              mov ecx, 0000000C
:0058850C 33D2                    xor edx, edx
:0058850E E8D5BDE7FF              call 004042E8

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:005884F6(U), :00588502(C)
|
:00588513 46                      inc esi
:00588514 FF4DF4                  dec [ebp-0C]
:00588517 0F8549FFFFFF            jne 00588466

==============================
:005835C5 8B55EC                  mov edx, dword ptr [ebp-14] <<-------计算所得的注册码->EDX
:005835C8 58                      pop eax                      <<-------输入的注册码
:005835C9 E8220CE8FF              call 004041F0        <<-------比较函数
:005835CE 0F85F6000000            jne 005836CA         <<-------不同则跳走
==============================
以上所给的注释均为第一遍运算时的值
==============================
以用户名”alpha"为例:
算法思想为:
1。由用户名的第一个字符“a”计算得值76C并将其转化为字符串“76C”
2。取字符串“76C”的第一个字符“7”与用户名的第一个字符“a”进行运算,得值720并将其转化为字符串“720”
3。连接字符串“M0C”与“720”,并计算新串的长度,比较其是否大于8,小于则跳回,继续运算,如果大于或等于8,则跳走,并继续比较其是否大于12,大于则停止运算,否则循环1。2。3。
==============================
================Open Cracking Group====================
=
=
=
=Magic convertor 2.8注册码算法分析 - OCG
=
=
=                                CrAcKeD BY alphakk/OCG
=
=  http://www.newclw.com/lllufh/cgi-bin/leoboard.cgi
========================================================