2013-06-21 46 views
3

我負責爲產生軟件密鑰的應用程序製作在線版本(用於自動化目的)。獲得密鑰生成功能的反向功能

每個軟件都會向用戶顯示一個訪問碼(來自系統音量信息),該碼的密鑰由一個小應用程序生成。所以客戶給出例如訪問代碼:123和他得到的關鍵:321。

現在的問題是,產生該特定軟件的關鍵的小應用程序的來源丟失,但我確實有驗證功能

Public Function ValidateKey(AccessCode As Long, AccessKey As Long) 

    Dim lngNewKey As Double 
    Dim strHexKey As String 
    Dim btCode(1) As Byte 
    Dim lngCode As Long 

    If AccessKey = 0 Then 
     ValidateKey = False 
     Exit Function 
    End If 

    If AccessCode = 0 Then 
     ValidateKey = False 
     Exit Function 
    Else 
     lngNewKey = AccessKey 
     strHexKey = Hex(lngNewKey) 
     If Len(strHexKey) = 5 Then strHexKey = "0" & strHexKey 
     btCode(0) = CByte("&H" & Mid(strHexKey, 1, 2)) 
     btCode(1) = CByte("&H" & Mid(strHexKey, 5, 2)) 
     lngCode = CLng(btCode(0)) * 256 + CLng(btCode(1)) 
     lngCode = lngCode * 15 + 5 
     ValidateKey = (lngCode = AccessCode) 
    End If 

End Function 

此功能在客戶端軟件,並檢查運行相比AccessCode用戶(快速鍵)提供的密鑰是否是正確的。

所以爲了找到問題的關鍵生產功能,我開始通過以下操作扭轉這一局面:

AccessCode = AccessCode - 5 
AccessCode = AccessCode/15 

但後來我stucked,因爲前面的操作似乎是一個哈希運算,似乎難以逆轉。

我有如下數據(通過使用獨立的密鑰生成的應用程序):

for accesscode 111440 the key should be 1946629 
for accesscode 200000 the key should be 3453973 
for accesscode 65536 the key should be 1160209 
for accesscode 8192 they key should be 177186 
for accesscode 4096 they key should be 111633 

它的工作原理與最小accesscode是3838

我想知道是否有可能導出密鑰生成功能。

謝謝你提前

+0

你可以嘗試訪問代碼0嗎? –

+0

3838是與它一起工作的最小的訪問代碼,在它得到一個類型不匹配 – MIrrorMirror

回答

2

這應該工作。它不會提供與您的示例中相同的訪問密鑰(如您注意到的,反轉過程不明確),但它將提供訪問密鑰通過驗證功能。 C#,我不知道VB。

static int Key(int accessCode) 
    { 
     accessCode = (accessCode - 5)/15; 
     return Int32.Parse(((accessCode >> 8) & 0xFF).ToString("X") 
          + "00" 
          + (accessCode & 0xFF).ToString("X").PadLeft(2, '0'),    
          System.Globalization.NumberStyles.HexNumber); 
    } 

例如,你的密鑰對:

(111440, 1946629)

我的函數給出:

(111440, 1900549)

這兩者都是成功驗證。

編輯:我看到在你的例子中的小數字(65536和以下)不會爲我成功驗證(既沒有正確也沒有計算鍵)。這意味着我沒有正確地將您的驗證函數轉換爲C#(可能與填充小數字有關)。好吧。這可能會也可能不會意味着Key函數對這些值無法正確工作,我無法測試它,因爲我的ValidateKey不正確。

Edit2:其實問題不是我的翻譯,問題是你自己的ValidateKey函數不會做你說的那樣。我測試了它在VB,直接複製粘貼,並返回:

  1. 111440 1946629 - >真
  2. 200000 3453973 - >真
  3. 65536 1160209 - >假
  4. 8192 177186 - >假
  5. 4096 111633 - >假

EDIT3:在您的ValidateKey功能的缺陷是:

lngCode = lngCode * 15 + 5 
    ValidateKey = (lngCode = AccessCode) 

lngCode是whole number * 15 + 5。因此,當減去5時,它總是可以被15整除的數字。這意味着如果accessCode - 5不能被15整除,ValidateKey將始終返回false!

例如,如果accessCode15000ValidateKey將返回false無論什麼accessKey是!由於i*15+5 = 15000爲真的整數不存在,因此永遠不會返回true

這就是爲什麼它不適用於65536例如,不是因爲您有錯誤的關鍵,而是因爲它總是會返回false,因爲代碼= 65536,無論關鍵。無論我的函數返回哪個鍵都無關緊要,ValidateKey將返回false。

另一方面,對於像6005這樣的數字(6005-5可以被15整除),我的函數計算的鍵將被成功驗證。

結論:

可以產生足夠大的N鍵,其N-5是整除15我的功能。

對於那些15沒有劃分N-5的數字,不可能生成密鑰,因爲ValidateKey永遠不會返回true。

-1

這是一個函數,它將返回兼容的鍵。

Public Function CreateKey(ByRef AccessCode As Long) As Long 
    Dim tempcode As Long = CLng((AccessCode - 5)/15) 
    AccessCode = tempcode * 15 + 5 
    Dim Hexout As String 
    Hexout = Hex(tempcode/256).PadLeft(2, "0"c) + "B4" + Hex(tempcode - (Math.Truncate(tempcode/256) * 256)).PadLeft(2, "0"c) 
    CreateKey = Convert.ToInt32(Hexout, 16) 
End Function 

通過將AccessCode修改爲與生成的密鑰兼容,您的validate函數將始終有效。或者你可以在訪問代碼的函數中創建一個條件。