eXeScope V6.41 的註冊演算法破解

看雪資料發表於2004-05-03

eXeScope V6.41 的註冊演算法破解
【軟體名稱】:eXeScope V6.41

【軟體語言】:英文

【應用平臺】:Win9x/NT/2000/XP

【難    度】:簡單,獻給像我等這樣的菜鳥學習

【破解工具】TRW2000 1.23,winDasm V8.93漢化版(寫教程用)

【軟體介紹】:
  功能強大的軟體資源分析工具(地球人都知道),升到了6.41版了。

  近來閒來無事,就分析了這個軟體的演算法,啟動TRW2000,點選幫助/註冊,輸入:
  
  使用者名稱:小蝦
  假 碼:7878787878 ←必須輸夠十位,等下就知道。

  按快捷鍵:Ctrl+N彈出TRW2000除錯介面。輸入萬能斷點:Hmemcpy,按F5鍵返回,點選註冊按鈕,被TRW攔到,來到以下地方:

:004C2170 8B1528EE4C00            mov edxdword ptr [004CEE28]
:004C2176 8B12                    mov edxdword ptr [edx]    ←EDX為你輸入的註冊碼
:004C2178 A130EC4C00              mov eaxdword ptr [004CEC30]
:004C217D 8B00                    mov eaxdword ptr [eax]
:004C217F E82C8F0000              call 004CB0B0  ←關鍵Call,按F8進入
:004C2184 84C0                    test alal ←測試al值是否為1
:004C2186 0F848D000000            je 004C2219  ←經典跳轉,跳就死,暴力破解的話將這裡NOP就行了。
:004C218C A1C4EE4C00              mov eaxdword ptr [004CEEC4]
:004C2191 8B00                    mov eaxdword ptr [eax]
:004C2193 E8B82AF4FF              call 00404C50
:004C2198 85C0                    test eaxeax
:004C219A 7E7D                    jle 004C2219
:004C219C 8D55F0                  lea edxdword ptr [ebp-10]
:004C219F A1D8EE4C00              mov eaxdword ptr [004CEED8]
:004C21A4 8B00                    mov eaxdword ptr [eax]
:004C21A6 E8B904FDFF              call 00492664
:004C21AB 8B45F0                  mov eaxdword ptr [ebp-10]
:004C21AE 8D4DF4                  lea ecxdword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->".ini"
                                  |
:004C21B1 BA78224C00              mov edx, 004C2278
:004C21B6 E85D79F4FF              call 00409B18
:004C21BB 8B4DF4                  mov ecxdword ptr [ebp-0C]
:004C21BE B201                    mov dl, 01
:004C21C0 A124BE4300              mov eaxdword ptr [0043BE24]
:004C21C5 E80A9DF7FF              call 0043BED4
:004C21CA 8BF0                    mov esieax
:004C21CC A1C4EE4C00              mov eaxdword ptr [004CEEC4]
:004C21D1 8B00                    mov eaxdword ptr [eax]
:004C21D3 50                      push eax

* Possible StringData Ref from Code Obj ->"Name"
                                  |
:004C21D4 B988224C00              mov ecx, 004C2288

* Possible StringData Ref from Code Obj ->"Reg"
                                  |
:004C21D9 BA98224C00              mov edx, 004C2298
:004C21DE 8BC6                    mov eaxesi
:004C21E0 8B38                    mov edidword ptr [eax]
:004C21E2 FF5704                  call [edi+04]
:004C21E5 A128EE4C00              mov eaxdword ptr [004CEE28]
:004C21EA 8B00                    mov eaxdword ptr [eax]
:004C21EC 50                      push eax

* Possible StringData Ref from Code Obj ->"Reg"
                                  |
:004C21ED BA98224C00              mov edx, 004C2298
:004C21F2 B9A4224C00              mov ecx, 004C22A4
:004C21F7 8BC6                    mov eaxesi
:004C21F9 8B38                    mov edidword ptr [eax]
:004C21FB FF5704                  call [edi+04]
:004C21FE 8BC6                    mov eaxesi
:004C2200 E8DB19F4FF              call 00403BE0
:004C2205 A138EC4C00              mov eaxdword ptr [004CEC38]
:004C220A C60001                  mov byte ptr [eax], 01
:004C220D C7834C02000001000000    mov dword ptr [ebx+0000024C], 00000001
:004C2217 EB20                    jmp 004C2239

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004C2186(C), :004C219A(C)
|
:004C2219 6A00                    push 00000000 ←跳到這裡你以經完了。
:004C221B 8D55EC                  lea edxdword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"錯誤註冊碼或姓名!;o^IDO"
                                  |
:004C221E B8B0224C00              mov eax, 004C22B0  
:004C2223 E8280C0000              call 004C2E50  ←出錯的對話方塊

這裡是上面按F8進的Call裡面,分析演算法就在這裡。

:004CB0B0 55                      push ebp
:004CB0B1 8BEC                    mov ebpesp
:004CB0B3 51                      push ecx
:004CB0B4 53                      push ebx
:004CB0B5 8955FC                  mov dword ptr [ebp-04], edx
:004CB0B8 8B45FC                  mov eaxdword ptr [ebp-04]
:004CB0BB E8809DF3FF              call 00404E40
:004CB0C0 33C0                    xor eaxeax
:004CB0C2 55                      push ebp
:004CB0C3 684FB14C00              push 004CB14F
:004CB0C8 64FF30                  push dword ptr fs:[eax]
:004CB0CB 648920                  mov dword ptr fs:[eax], esp
:004CB0CE 33DB                    xor ebxebx
:004CB0D0 8B45FC                  mov eaxdword ptr [ebp-04] ←EAX為你的假碼
:004CB0D3 E8789BF3FF              call 00404C50 ←取得假碼的位數
:004CB0D8 83F80A                  cmp eax, 0000000A ←比較假碼是不是十位,
:004CB0DB 755C                    jne 004CB139   ←不到十位或超過十位送你上西天
:004CB0DD 8B55FC                  mov edxdword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"A1910"
                                  |
:004CB0E0 B864B14C00              mov eax, 004CB164 ←EAX為A1910
:004CB0E5 E8AA9EF3FF              call 00404F94   ←檢查你的註冊碼前五位是不是A1910
:004CB0EA 48                      dec eax
:004CB0EB 7410                    je 004CB0FD    ←是就跳到004CB0FD繼續。不是就接著往下比較
:004CB0ED 8B55FC                  mov edxdword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"A1423"
                                  |
:004CB0F0 B874B14C00              mov eax, 004CB174 ←如果你的註冊碼前五位不是A1910就走到這裡,現EAX值是A1423
:004CB0F5 E89A9EF3FF              call 00404F94   ←比較註冊碼前五位是不是A1423
:004CB0FA 48                      dec eax
:004CB0FB 753C                    jne 004CB139   ←不是就跳,送你上西天。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CB0EB(C)
|
:004CB0FD B802000000              mov eax, 00000002

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CB117(C)
|
:004CB102 8B55FC                  mov edxdword ptr [ebp-04] ←EDX值為假碼
:004CB105 8A5402FF                mov dlbyte ptr [edx+eax-01] ←依次取出假碼的第二位
:004CB109 80FA30                  cmp dl, 30 ←比較 
:004CB10C 722B                    jb 004CB139 ←小於30就送你上西天
:004CB10E 80FA39                  cmp dl, 39 ←比較
:004CB111 7726                    ja 004CB139 ←大於39就送你上西天
:004CB113 40                      inc eax ←計數加1
:004CB114 83F80B                  cmp eax, 0000000B ←比較
:004CB117 75E9                    jne 004CB102 ←EAX小於0B繼續跳到上面比較下一個假碼。
:004CB119 8B45FC                  mov eaxdword ptr [ebp-04] ←EAX為假碼
:004CB11C 0FB64008                movzx eaxbyte ptr [eax+08] ←取出假碼的第九位數
:004CB120 8B55FC                  mov edxdword ptr [ebp-04] ←EDX為假碼
:004CB123 0FB65209                movzx edxbyte ptr [edx+09] ←取出假碼的第十位數
:004CB127 03C2                    add eaxedx ←EAX和EDX相加
:004CB129 B90A000000              mov ecx, 0000000A ←ECX值為0000000A
:004CB12E 33D2                    xor edxedx ←EDX清0
:004CB130 F7F1                    div ecx ←EAX和ECX相除,整數儲存在EAX中,餘數儲存在EDX
:004CB132 83FA04                  cmp edx, 00000004 ←比較
:004CB135 7502                    jne 004CB139 ←若相除的餘數不相等就送你上西天。演算法到這裡也就結束了,以下不管它了
:004CB137 B301                    mov bl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004CB0DB(C), :004CB0FB(C), :004CB10C(C), :004CB111(C), :004CB135(C)
|
:004CB139 33C0                    xor eaxeax
:004CB13B 5A                      pop edx
:004CB13C 59                      pop ecx
:004CB13D 59                      pop ecx
:004CB13E 648910                  mov dword ptr fs:[eax], edx
:004CB141 6856B14C00              push 004CB156

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CB154(U)
|
:004CB146 8D45FC                  lea eaxdword ptr [ebp-04]
:004CB149 E84298F3FF              call 00404990
:004CB14E C3                      ret ←返回子程式


  經過以上分析,得出演算法:
  1、與使用者名稱無關,
  2、註冊碼前五位必須是:A1910和A1423
  3、第二位以後的註冊碼必須是數字0~9
  4、註冊碼第六位和第八位可以是任意數。
  5、註冊碼第九位和第十位註冊碼也可任意輸入,但他們相加再除的餘數必須餘4,否則註冊不成功

  例如:A1910XXX08或A1423XXX08就可以註冊成功。

  好了,有以上資訊,可以寫序號產生器了(我的程式設計技術太爛,序號產生器就讓你們去寫嗎!呵呵~~),我也累了,分析這個軟體花了幾分鐘,但寫這個教程用了半個鐘頭呀。

作者:小蝦
2004年5月3日

相關文章