2009-12-11 191 views
7

我正在尋找一種方法來混淆(在目標代碼中)一個測試 - 就像檢查許可證密鑰是否有效一樣。我試圖阻止的是有人通過圖像二進制文件搜索處理響應的代碼。如何在代碼中混淆測試以防止篡改響應處理?

bool checkError = foo(); 
if (checkError) // I'd like to avoid making a simple check like this one. 
{ 
    // process response 
} 

這是一個簡單的例子,但不是推薦的方法:

int check = 71 * 13; 
check += 35 * isValid(); // will only return 0 or 1 

//later (delayed execution of response) 
if (check % 71) 
{ 
    //process response 
} 

編輯: 只是爲了澄清,實際測試已經完成,我得到一個合格/不合格的回報。我的響應處理將是一個基本的jmp,並且會對如何混淆jmp位置的指針感興趣。

+0

好多了。 :) – GManNickG 2009-12-11 20:11:52

+0

當然,您應該知道這不是一個小問題。像微軟這樣的大型軟件公司花費數百萬美元試圖阻止人們繞過他們的保護,但人們仍然設法繞開他們的努力。 – 2009-12-11 20:21:08

+0

@Charles Salvia:這是真的。我不是從這個問題尋找保護程度。 ;)然而,這是我第一次嘗試這方面的東西,我不得不承認我不知道從哪裏開始。 – Dubron 2009-12-11 20:25:17

回答

5

一種方法是將執行許可檢查的代碼放入單獨的DLL中。在主應用程序中,在運行時加載DLL並計算DLL自身的校驗和。應用程序存儲用DLL計算出的校驗和。如果校驗和不匹配,您有幾個選項,顯示錯誤版本的消息 - 有點顯而易見;不要致電許可證檢查 - 不那麼明顯,但當攻擊者想知道爲什麼許可證檢查沒有被調用時會被注意到;調用與真實許可證檢查功能類似的名稱的功能。

把它想象成使用公鑰加密。使用公鑰作爲配置的一部分,並在應用中創建私鑰。如果他們混淆了公鑰,應用程序的數字簽名將以可檢測的方式受到損害。

我同意@camccann這將有助於瞭解您所期望的攻擊類型。作爲最後的手段,將許可證檢查分爲儘可能多的部分,以便通過更改單個分支點來避開旁路。

[編輯]

另一個想法是使用一個狀態機。請參閱this question的頂部答案中的命令結構示例。將許可證檢查的評估以散列查找的形式和一組虛擬函數調用與適當的調用一起放入數組中。該評估許可證檢查到表/哈希查找了相應的功能決定的代碼不會像典型的

if(){ pass;} else { fail; } 

結構。

兩個好處,
1)沒有一個布爾條件繞過並
2)它們不能在不知道該函數的地址/名稱來傳遞控制做一個簡單的JMP指令。

SO thread on a state machine turorial
SO thread on state machine implementations

+3

不幸的是,我覺得這錯過了OP關注的領域。他並不擔心檢查許可證的實際過程。相反,他會得到一個代表通過/失敗的布爾值,並且需要根據該條件操作特定的代碼。但是,這可以歸結爲程序集中非常簡單的jmp,如果一個簡單的十六進制編輯器知道它在哪裏,它可以顛覆條件檢查。他想混淆此jmp的位置(如果聲明),而不是實際的許可證檢查本身。 – KevenK 2009-12-11 21:05:58

+0

@KevenK:非常感謝。這是對的。 – Dubron 2009-12-11 21:17:03

+1

@KevenK我編輯的帖子掩蓋了分支。 – 2009-12-11 21:27:52

5

混淆不會阻止,只是不鼓勵。一個足夠熟練和堅定的攻擊者總是能夠繞過你使用的任何混淆,所以你首先需要知道的是:你想在這裏挫敗什麼樣的人?

+0

謝謝你的區別。我應該在我的問題中說「不鼓勵」。我試圖阻撓的人可能是新手攻擊者,因爲更有經驗的人很可能會找到解決某些最棘手方法的方法。 – Dubron 2009-12-11 20:23:37

3

Secure Programming Cookbook(O'Reilly)一對防篡改(實際書中有一章,不知道有什麼可以在網站上)一整章。整齊的東西。

3

您可以通過在像所有灑向檢查導致崩潰:

T* data = (T*) new char[sizeof(T) * (check() ? 1 : 0)] 
array[i + 1 * (check() ? 0 : 42)].doStuff(); 

有在Gamasutra上一個不錯的一篇關於crack protection in Spyro,做類似的事情,然後通過使遊戲不會崩潰更進一步,只是工作雪上加霜而且更糟。 (你永遠不會撞到敵人,你走得慢一些,某些關鍵物體隨機消失等等等等)

所有程序員都會喜歡讀,也許對你有用。