2011-06-17 92 views
4

讓我們假設有一個大的商業項目(a.k.a項目),它使用引擎蓋下的Python來管理插件,以配置可以附加和使用Project的新控制界面。如何防止反編譯或檢查python代碼?

有一個小小的信息泄露,項目的Python API的一部分泄露給公共信息,人們能夠編寫Python腳本,這些腳本被底層Python實現調用,作爲Project的插件加載機制的一部分。

更進一步,使用inspect模塊和raw __dict__讀數,人們能夠找到Project的基礎Python實現的主要部分。

有沒有辦法讓Python密碼保密?

快看看Python的文檔透露了一個辦法suppres inspect模塊的導入是這樣的:

import sys 
sys.modules['inspect'] = None 

它是否已完全解決這個問題?

+4

對於你最後的回答,我仍然可以這樣做:'del sys.modules ['inspect']':) – mouad

+3

相關:http://stackoverflow.com/questions/261638/how-do-i-protect-python-代碼 –

+1

不可能。 _But_ - 看看[這個答案](http://stackoverflow.com/questions/576963/python-code-obfuscation/577161#577161)它建議使用Cython。當然,任何東西都可以被反向設計,但是由於Cython生成的c代碼被編譯成機器代碼,所以可能很難像c中編寫的任何東西那樣反向工程。 – senderle

回答

9

不,這並不能解決問題。有人可以將檢查模塊重命名爲其他內容並將其導入。

你想要做的是不可能的。 python解釋器必須能夠獲取你的字節碼並執行它。有人總是能夠反編碼字節碼。他們將始終能夠生成AST並查看具有變量和類名稱的代碼流。

請注意,此過程也可以使用編譯語言代碼完成;不同的是你會得到裝配。有些工具可以從程序集中推斷C結構,但我沒有足夠的經驗來評論細節。

你試圖隱藏什麼特定的信息?你可以保留算法服務器端,並讓你的軟件進入一個接觸你的Web服務的客戶端嗎?將代碼保存在您控制的機器上是真正控制代碼的唯一方法。您不能將某個鎖定的盒子和盒子的鑰匙交給某人,並且在他們必須打開盒子以便運行時才能打開盒子。這與DRM不起作用的原因相同。

儘管如此,仍然有可能使其進行逆向工程,但當客戶端具有可執行文件時,它永遠不可能。

+0

他們將獲得變量名稱。由於所有這些都可以在運行時進行內省,因此它都存在於字節碼中。 –

+0

@Ned Batchelder:更新,謝謝! – Daenyth

4

有沒有辦法讓Python密碼保密?

不,沒有。

Python是特別容易反向工程,但其他語言,甚至編譯的,很容易反向。

1

你不能完全防止軟件的逆向工程 - 如果它歸結爲它,總是可以分析你的程序組成的彙編程序指令。

但是,您可以使該過程顯着複雜化,例如通過搞亂Python內部。但是,在跳到之前如何這樣做,我建議你評估是否來做到這一點。通常很難「竊取」你的代碼(畢竟,我們需要完全理解它們才能擴展它們),而不是自己編寫代碼。然而,一個純粹的,未混淆的Python插件接口對於爲您的程序創建一個完整的生態系統至關重要,遠遠超過了讓某人偷看您的可能不是完美設計的編碼內部部件的可能缺點。

7

沒有辦法讓應用程序代碼保持絕對的祕密。坦白地說,如果一羣專心致志的黑客(在良知意義上而不是貶義意義上)可以破解PlayStation的代碼簽名安全模型,那麼你的應用就沒有機會。一旦將您的應用程序交給公司外的人員使用,它可以進行反向設計。

現在,如果你想付出一些努力使它變得更加困難,你可以編譯你自己的嵌入式python可執行文件,去掉不必要的模塊,混淆編譯後的python字節碼,並把它包裝在一些拒絕啓動你的惡意軟件rootkit中應用程序,如果調試器正在運行。

但是你應該真的考慮一下你的商業模式。如果你看到那些對你的產品充滿熱情的人是一種威脅,如果你看到那些願意花時間和精力定製你的產品以個性化他們的體驗成爲危險的人,也許你需要重新考慮你的安全方法。假設您沒有參與DRM業務,或者有類似的模式,需要從不情願的消費者那裏獲取資金,請考慮制定一種方法,包括與用戶共享信息,並允許他們協作改進您的產品。

+0

+1有關商業模式的評論。 –

+0

問題我問起源於純粹的好奇心。項目不是我的創作,我是提到的用戶之一。事實上,我將非常感謝充分記錄的公共API來擴展Project的功能。 據我所知 - 項目的開發人員和另一家公司之間達成了一項業務協議,以適應和集成視覺模塊化腳本語言,作爲一種擴展包形式,顯然這確實花了一分錢。 我故意不提項目的名稱來尊重開發者的利益。 – Helbreder