URL Address Book V6.05簡單演算法分析+VB序號產生器原始碼 (10千字)

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


URL Address Book V6.05簡單演算法分析+VB序號產生器原始碼  

軟體名稱:URL Address Book V6.05
軟體介紹 :好用的書籤及E-MAIL通訊錄整理工具,它可將書籤及E-MAIL名單建立成一個個的檔案,且每個檔案還可分門別類,可預設任何種瀏覽器、當您使用書籤時只需點選書籤即可開啟瀏覽器瀏覽網站或開啟E-MAIL、管理上相當方便、尤其在分類、移動、編輯皆相當的容易管理,當然它也可將正在瀏覽的網站直接加入。啟動時會常駐於System Tray上、點選一下即可開啟使用。
下載地址:http://www.skycn.com/soft/4393.html

破解人:BurSH (於2003.7.16)
所屬組織:FCG-CCG-BCG-OCN-DFCG
破解工具:OllDbg 1.09c

如何尋找關鍵點,大家可以去看you_known在網咖通宵的時候寫的《URL Address Book V6.05破解過程》,貼在了FCG論壇(新論壇www.51itcool.com/fcg,大家多多捧場^_^!).這篇演算法分析算幫他補完整哈!:-)

========================
  直接進入關鍵Call吧:
========================

0048A834  /$  55            PUSH EBP
0048A835  |.  8BEC          MOV EBP,ESP
0048A837  |.  83C4 E4       ADD ESP,-1C
0048A83A  |.  53            PUSH EBX
0048A83B  |.  56            PUSH ESI
0048A83C  |.  57            PUSH EDI
0048A83D  |.  33DB          XOR EBX,EBX
0048A83F  |.  895D E4       MOV DWORD PTR SS:[EBP-1C],EBX
0048A842  |.  895D F4       MOV DWORD PTR SS:[EBP-C],EBX
0048A845  |.  8BF9          MOV EDI,ECX
0048A847  |.  8955 FC       MOV DWORD PTR SS:[EBP-4],EDX     //將使用者名稱放入SS:[EBP-4]
0048A84A  |.  8BF0          MOV ESI,EAX
0048A84C  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0048A84F  |.  E8 4C98F7FF   CALL URLBOOK.004040A0
0048A854  |.  33C0          XOR EAX,EAX
0048A856  |.  55            PUSH EBP
0048A857  |.  68 59A94800   PUSH URLBOOK.0048A959
0048A85C  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
0048A85F  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
0048A862  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0048A865  |.  E8 8296F7FF   CALL URLBOOK.00403EEC
0048A86A  |.  3B86 C8000000 CMP EAX,DWORD PTR DS:[ESI+C8]   //使用者名稱不能大於30位   
0048A870  |.  7F 10         JG SHORT URLBOOK.0048A882
0048A872  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0048A875  |.  E8 7296F7FF   CALL URLBOOK.00403EEC
0048A87A  |.  3B86 CC000000 CMP EAX,DWORD PTR DS:[ESI+CC]   //使用者名稱必須大於等於3位
0048A880  |.  7D 0C         JGE SHORT URLBOOK.0048A88E
0048A882  |>  8BC7          MOV EAX,EDI
0048A884  |.  E8 E393F7FF   CALL URLBOOK.00403C6C
0048A889  |.  E9 A5000000   JMP URLBOOK.0048A933
0048A88E  |>  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0048A891  |.  E8 5696F7FF   CALL URLBOOK.00403EEC
0048A896  |.  8BD8          MOV EBX,EAX                    //將使用者名稱位數放入EBX
0048A898  |.  EB 37         JMP SHORT URLBOOK.0048A8D1
0048A89A  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]  //將使用者名稱得ASCII碼移入EAX
0048A89D  |.  4B            |DEC EBX                       //計數器EBX減一
0048A89E  |.  3B58 FC       |CMP EBX,DWORD PTR DS:[EAX-4]  //EBX小於使用者名稱位數就跳
0048A8A1  |.  72 05         |JB SHORT URLBOOK.0048A8A8
0048A8A3  |.  E8 9C85F7FF   |CALL URLBOOK.00402E44
0048A8A8  |>  43            |INC EBX                       //計數器EBX加一
0048A8A9  |.  0FB64418 FF   |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1] //從右往左取使用者名稱
0048A8AE  |.  50            |PUSH EAX
0048A8AF  |.  8B86 14010000 |MOV EAX,DWORD PTR DS:[ESI+114]//EAX=&H54639 
0048A8B5  |.  5A            |POP EDX
0048A8B6  |.  8BCA          |MOV ECX,EDX                   //將使用者名稱得ASCII碼移入ECX
0048A8B8  |.  99            |CDQ
0048A8B9  |.  F7F9          |IDIV ECX                      //EAX除以ECX,餘數放入EDX
0048A8BB  |.  8BC2          |MOV EAX,EDX                   //將餘數轉移到EAX
0048A8BD  |.  8D55 E4       |LEA EDX,DWORD PTR SS:[EBP-1C]
0048A8C0  |.  E8 C7E7F7FF   |CALL URLBOOK.0040908C         //依次將EAX的值從十六進位制轉換為十進位制,並與上次得到的結果連起來放到SS:[EBP-C]指向的地址!結果設為SN_TEMP!
0048A8C5  |.  8B55 E4       |MOV EDX,DWORD PTR SS:[EBP-1C]
0048A8C8  |.  8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]  //注意SS:[EBP-C]指向的地址!
0048A8CB  |.  E8 2496F7FF   |CALL URLBOOK.00403EF4
0048A8D0  |.  4B            |DEC EBX                       //計數器減一  
0048A8D1  |>  8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0048A8D4  |.  E8 1396F7FF   |CALL URLBOOK.00403EEC
0048A8D9  |.  83E8 06       |SUB EAX,6                    
0048A8DC  |.  3BD8          |CMP EBX,EAX                  //只計算六位的使用者名稱
0048A8DE  |.  7C 04         |JL SHORT URLBOOK.0048A8E4    
0048A8E0  |.  85DB          |TEST EBX,EBX                 //全部使用者名稱都計算完了?
0048A8E2  |.^ 7F B6         \JG SHORT URLBOOK.0048A89A
0048A8E4  |>  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
0048A8E7  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
0048A8EA  |.  E8 D9ABF7FF   CALL URLBOOK.004054C8        //將前面得到的SN_TEMP轉換為十六進位制,放入EAX!設EAX值為SN_TEMP2!
0048A8EF  |.  8945 E8       MOV DWORD PTR SS:[EBP-18],EAX 
0048A8F2  |.  8955 EC       MOV DWORD PTR SS:[EBP-14],EDX
0048A8F5  |.  8B5E 3C       MOV EBX,DWORD PTR DS:[ESI+3C]
0048A8F8  |.  85DB          TEST EBX,EBX
0048A8FA  |.  7F 11         JG SHORT URLBOOK.0048A90D
0048A8FC  |.  FF75 EC       PUSH DWORD PTR SS:[EBP-14]    
0048A8FF  |.  FF75 E8       PUSH DWORD PTR SS:[EBP-18]             
0048A902  |.  8BD7          MOV EDX,EDI                
0048A904  |.  33C0          XOR EAX,EAX                         
0048A906  |.  E8 E5E7F7FF   CALL URLBOOK.004090F0                 
0048A90B  |.  EB 26         JMP SHORT URLBOOK.0048A933
0048A90D  |>  FF75 EC       PUSH DWORD PTR SS:[EBP-14]            
0048A910  |.  FF75 E8       PUSH DWORD PTR SS:[EBP-18]              
0048A913  |.  8BD7          MOV EDX,EDI                              
0048A915  |.  8BC3          MOV EAX,EBX                              
0048A917  |.  E8 D4E7F7FF   CALL URLBOOK.004090F0      //將SN_TEMP2轉換為字元型,不足12位前面補零!
0048A91C  |.  8B07          MOV EAX,DWORD PTR DS:[EDI//將結果放入EAX!結果設為SN_TEMP3
0048A91E  |.  E8 C995F7FF   CALL URLBOOK.00403EEC
0048A923  |.  8BC8          MOV ECX,EAX
0048A925  |.  2B4E 3C       SUB ECX,DWORD PTR DS:[ESI+3C]
0048A928  |.  8B56 3C       MOV EDX,DWORD PTR DS:[ESI+3C]
0048A92B  |.  42            INC EDX
0048A92C  |.  8BC7          MOV EAX,EDI
0048A92E  |.  E8 0198F7FF   CALL URLBOOK.00404134       //如果SN_TEMP3大於12位就只取前12位!   
0048A933  |>  33C0          XOR EAX,EAX                 //這裡D EAX就是正確的註冊碼!^0^!
0048A935  |.  5A            POP EDX
0048A936  |.  59            POP ECX
0048A937  |.  59            POP ECX
0048A938  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
0048A93B  |.  68 60A94800   PUSH URLBOOK.0048A960
0048A940  |>  8D45 E4       LEA EAX,DWORD PTR SS:[EBP-1C]
0048A943  |.  E8 2493F7FF   CALL URLBOOK.00403C6C
0048A948  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
0048A94B  |.  E8 1C93F7FF   CALL URLBOOK.00403C6C
0048A950  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
0048A953  |.  E8 1493F7FF   CALL URLBOOK.00403C6C
0048A958  \.  C3            RETN
0048A959   .^ E9 068DF7FF   JMP URLBOOK.00403664
0048A95E   .^ EB E0         JMP SHORT URLBOOK.0048A940
0048A960   .  5F            POP EDI
0048A961   .  5E            POP ESI
0048A962   .  5B            POP EBX
0048A963   .  8BE5          MOV ESP,EBP
0048A965   .  5D            POP EBP
0048A966   .  C3            RETN
=============
    總 結 
=============
舉個例,比如BurSH這個使用者名稱:
                                                          B  u  r  S  H
  從右往左取Ascii碼(如果使用者名稱大於6位只取後六位)         72 83 114 117 66
  54639 Mod 每一位                                       57 45  9  39  15
  把這幾個數連起來                                       574593915
  轉換成十六進位制的                                       223F9B7B 
  若不足12位前面補零,若大於則只取前12位                  0000223F9B7B
  
 0000223F9B7B就是正確的註冊碼了,很簡單吧?*^_^* 

==========================
     附上VB序號產生器原始碼
==========================
'這個"大數轉換成十六進位制"的程式碼是PowerBoy給我的,謝謝!沒有他給我這段程式碼,我寫不出這個序號產生器:P
'但是如果數太大,比如18463581274745還是無法轉換成十六進位制,雖然這種情況很少見,但是畢竟不完美:(
'請各位指點一下,VB中如何處理大數.Aming的程式碼沒有註釋,偶看得糊塗呀……>_<
Function Dec2Hex(InputData As Double) As String
Dim i As Double
Dim HexOut As String
Dim d1, d2, d3, d4 As Double
Dim s1, s2 As String
Dim j, k As Integer
d1 = InputData
Do While (d1 / 16) > 1
i = Int(d1 - Int(d1 / 16) * 16)
Select Case i
Case 0
s1 = "0"
Case 1
s1 = "1"
Case 2
s1 = "2"
Case 3
s1 = "3"
Case 4
s1 = "4"
Case 5
s1 = "5"
Case 6
s1 = "6"
Case 7
s1 = "7"
Case 8
s1 = "8"
Case 9
s1 = "9"
Case 10
s1 = "A"
Case 11
s1 = "B"
Case 12
s1 = "C"
Case 13
s1 = "D"
Case 14
s1 = "E"
Case 15
s1 = "F"
Case Else
GoTo n1
End Select
s2 = s2 + s1
d1 = Int(d1 / 16)
Loop
Select Case d1
Case 0
s1 = "0"
Case 1
s1 = "1"
Case 2
s1 = "2"
Case 3
s1 = "3"
Case 4
s1 = "4"
Case 5
s1 = "5"
Case 6
s1 = "6"
Case 7
s1 = "7"
Case 8
s1 = "8"
Case 9
s1 = "9"
Case 10
s1 = "A"
Case 11
s1 = "B"
Case 12
s1 = "C"
Case 13
s1 = "D"
Case 14
s1 = "E"
Case 15
s1 = "F"
Case Else
GoTo n1
End Select
s2 = s2 + s1
Dec2Hex = StrReverse(s2)
GoTo n2
n1:
Dec2Hex = "Error"
n2:
End Function
'下面是序號產生器
Private Sub CmdGenKey_Click(Index As Integer)
On Error Resume Next

Dim i As Long, j As Long, Name_len As Long
Dim sn_temp As String
Dim sn As String
Dim AscArray() As Byte
Dim bignum As Double

txtSerial.Text = ""

   If txtUserName.Text = "" Then
      txtSerial.Text = "請輸入使用者名稱!"
      Exit Sub
   End If

AscArray = StrConv(txtUserName.Text, vbFromUnicode)
Name_len = UBound(AscArray)
j = UBound(AscArray)

   Select Case Name_len
       Case 0 To 1
           txtSerial.Text = "使用者名稱必須大於兩位!"
           Exit Sub
       Case Is > 30
           txtSerial.Text = "使用者名稱不能大於30位!"
           Exit Sub
   End Select
       
For i = 0 To Name_len
    sn_temp = sn_temp & Trim(Str((345657 Mod AscArray(j))))
    j = j - 1
    If j < Name_len - 6 Then
      Exit For
    End If
Next i

bignum = Val(sn_temp)
sn = Dec2Hex(bignum)'這裡用了PowerBoy的Dec2Hex()函式,再次說聲謝謝!^_^!

 If sn = "Error" Then
     txtSerial.Text = "Invalid Licence!Plz use another one!"
    Else
    
    Do While Len(sn) < 12
    sn = "0" & sn
    Loop

    txtSerial.Text = Left(sn, 12)
 End If


End Sub

相關文章