Magic convertor 2.8註冊碼演算法分析 - OCG (9千字)

看雪資料發表於2015-11-15

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
========================================================

相關文章