2010-12-02 64 views
2

我正在嘗試讀取最初用Visual Basic 6編寫的程序生成的數據文件(後來用Java重寫),所以我可以使用我自己的工具來處理它們。我該如何擊敗類似RC4的混淆?

有問題的程序是由美國政府創建的公共領域軟件;沒有許可協議禁止這一點。我不能提到該程序的名稱或鏈接到它的網站,因爲程序員可能會在明年的版本中改變混淆,我將不得不重複我的逆向工程。

底層數據文件格式是基於文本的,而混淆是某種具有硬編碼密鑰的流密碼。我可以將數據文件異或以獲取一些數據(用重複的ASCII字符填充一個字符串字段),但是我想避免將整個密鑰流嵌入到我的程序中。

通過.exe文件搜索可以看到一個名爲RC4ini的子例程的調用和一個我認爲是關鍵字的字符串(它不會出現在用戶界面的任何地方)。我發現Planet Source Code上這個加密庫的源代碼是什麼,對RC4的工作實現做了正確的修改(在JavaScript中,因爲這是我主要工作的編程語言),並嘗試使用它。

我試圖搜索文件中每個偏移量處的加密數據,但我沒有成功解密。爲什麼發生這種情況?

+4

如果它是公共領域,爲什麼不把它鏈接到它? – 2010-12-02 12:44:33

+0

@Igor Skochinsky:該程序的新版本每年發佈一次。下一個版本將於2011年初發布,並提及該程序的名稱(因此在Web搜索中顯示)將需要重新翻轉該程序。 – PleaseStand 2010-12-02 23:12:40

回答

0

通過使用Google搜索可疑的加密密鑰,我發現開發人員稍後(可能甚至是同一個月)開源Java代碼,這清楚地標識了我發現的作爲加密密鑰的字符串。隨後,他將鑰匙重構爲一個單獨的班級,並將其放入svn:ignore(並且大概已對其進行了更改;我還沒有檢查過)。

事實證明,我的解密程序與Planet Source Code的實施並不完全匹配。這裏是RC4 PRGA的Wikipedia's description

i := 0 
j := 0 
while GeneratingOutput: 
    i := (i + 1) mod 256 
    j := (j + S[i]) mod 256 
    swap values of S[i] and S[j] 
    K := S[(S[i] + S[j]) mod 256] 
    output K 
endwhile 

兩者Visual Basic和Java代碼省略了前兩行(I:= 0和j:= 0)。

2

如果他們正在使用RC4,您有幾個選項。

一種方法是找出他們何時調用RC4並轉儲密鑰或明文消息。使用Windbg或ollydbg等調試器很容易。從根本上來說,他們正在破解加密法,所有DRM都會因爲這個屬性而失敗。

另一種攻擊是,如果相同的密鑰用於2條消息,如果您知道一條消息的純文本,則可以使用其相應的密文來對其進行異或處理以顯示PRNG流。這個PRNG流然後可以與未知消息的密文進行異或以獲得其相應的明文。當然,如果每個消息的密鑰不同(例如使用IV),那麼這種攻擊將不起作用。