2015-02-23 196 views
4

我被要求幫助混淆將分發給客戶端的庫(用C++編寫)。我已經討論了爲什麼混淆不一定是一個好主意,並且將許可證集成到軟件中,因此許多有關複製保護的問題都是沒有實際意義的。混淆C++共享庫

無論如何,我被要求研究方法。我已經研究了頭部變形(以及類似)以及HARES,但我沒有發現我可以用於庫的很多東西(當然,這些東西會破壞任何形式的API,使得庫無用)。

我可以使用哪些技術來適用於圖書館?雖然我希望對可能有幫助的工具(或編譯器標誌等)提出建議,但我想強調,這不是一個以工具爲重點(即可關閉)的問題,而是側重於適用技術的問題。

+2

你是模糊源代碼還是二進制代碼? – baordog 2015-02-23 02:45:52

+0

它將作爲一個.so文件分發,但我認爲或者是可以接受的,只要最終的結果是一個對於逆向工程來說,這將是一個挑戰 – ahjohnston25 2015-02-23 02:46:34

+1

這可能是最好的問候在stackoverflow – Shelvacu 2015-02-23 05:56:20

回答

5

我不會投入太多精力去做這件事,因爲逆向工程師會贏得這一輪。

https://softwareengineering.stackexchange.com/questions/155131/is-it-important-to-obfuscate-c-application-code

混淆C++的二進制文件是有點的一場敗仗。這取決於你處理的是誰,但是如果你的逆向工程師足夠聰明,可以使用IDA Pro和一些插件,以及一個好的調試器,那麼它應該是徒勞的。

混淆優先

  • 在那裏你可以給逆向工程師無用的功能名稱。

老實說,這並沒有太大的幫助,因爲最終你的代碼將不得不調用某種非混淆的共享庫來完成任何事情。在某些時候,您將使用標準庫或STL,甚至可以進行系統調用。

  • 添加虛假途徑混淆靜態分析

,這樣反向工程師可以有一個調試器樂趣。反分析技術對逆向工程師來說是衆所周知的,他們幾乎可以用像ollydbg這樣的調試器繞過。

  • 寫入調試燙碼

即反向工程師喜歡一起玩。再次,這是一個預期的舉措,並且迴應是僅僅繞過有問題的代碼,或者修改掉陷阱。任何接受RE正式培訓的人都會感受到這一點。

  • 將我的二進制文件的大部分打包到一個加密區域,該區域在執行之前由存根進行解密。

與上述相同的答案。逆向工程師從第一天開始訓練。

  • 請記住,反向工程師正在尋找信息的有針對性的信息 - 他們很少嘗試重新創建整個應用程序。安全密集型代碼,許可證驗證代碼,家庭基礎通信代碼,網絡代碼。這些都是主要目標 - 把你的精力放在讓這些棘手的地方生活。

  • 請記住,地球上最大的公司的二進制文件通常會在20年代初期被人們反向設計。

  • 不要將您的調試符號留在最終的二進制文件中,因爲這些符號肯定有助於分析。

  • 如果你是專門做這件事的話,還專注於浪費工程師時間 - 時間總是對付逆向工程師。

請記住,任何有意義的混淆可能也會使性能增益成本上升,因此首先在C++中工作是合理的。 C世界中有很多區域(對於Java世界而言),在那裏無法實現有意義的混淆。例如遊戲不能隱藏他們對OpenGl API的調用,也不能真正阻止工程師收集他們的着色器代碼。

另請注意,逆向工程師大多數時間在程序集級別上查看您的代碼。他寧願有你的功能名稱,但如果需要的話,他可以沒有它。他可以看到你的程序在儘可能最有限的水平上正在做什麼。他發現關鍵的例程只是時間問題。

爲了您的目的,找到一個程序來破解函數名稱,讓老闆高興,並稱之爲一天。至少在那個時候,逆向工程軟件將不會是微不足道的

+0

謝謝。我知道我正在與一場失敗的戰鬥搏鬥,我們的目標只是讓它達到讓自己寫軟件而不是逆向工程我們的代碼而不那麼令人討厭的地步。 – ahjohnston25 2015-02-23 03:05:26

+0

好吧,在大多數情況下,對手只是在尋找重要的祕密 - 然後你必須自己重寫整個事情。如果對手直接複製你的二進制字節的字節這不是問題,混淆可以提供幫助。這就是爲什麼我說專注於你需要保護的祕密。 – baordog 2015-02-23 03:07:15

+0

這就是我的意思。本質上,庫是一個包裝器的算法。從輸入到輸出的算法的確切流程是我們(閱讀:我的客戶)旨在隱藏的內容。其他的東西(輔助方法之類)可以放在一旁 – ahjohnston25 2015-02-23 03:09:11

1

那麼真的是你有,你要警惕

  1. Disassembley 2個主要載體
  2. 調試

我最喜歡的防止第一個問題的方法是在內存中解密,取件您的可執行代碼並對其進行加密,在庫運行時將其自身解密到內存中,還可以對代碼的一部分進行校驗並將校驗和與在RAM中加載的校驗和進行比較(使加密部分檢查解密器和副本rsa)

另一個巧妙的技巧是靜態鏈接使用到你的可執行文件中的庫,以便它們不能輕易地被換出來試圖看看你的代碼在做什麼。

現在調試檢查中斷向量有所幫助,另一個技巧是檢查代碼的各個部分之間的'時間'(例如,如果代碼中出現超過幾毫秒的延遲時間,可以假定代碼正在被調試

+0

你能推薦一個工具來加密代碼嗎? – ahjohnston25 2015-02-23 03:12:29

+0

@ ahjohnston25我通常會手動滾動我的基礎,其基礎是將您的編譯代碼放入應用程序的char數組中,並使用函數指針來引用數組。這是病毒用來隱藏數十年的方法之一以前(每次複製時都使用隨機密鑰進行自我加密) – 2015-02-23 03:21:00