有沒有可能自己設計一個python解釋器,讓別人通過這個解釋器執行python代碼時無法進入調試模式,無法查看中間變數輸出的結果,而且無法輸出或寫出任何信息?


提供一個思路:在一個伺服器上運行一個現有實現,並且不允許這個伺服器有上傳流量。然後你的黑盒解釋器就是一個把代碼發送到這個伺服器並執行的一個小客戶端。


題主要先明確這樣的python解釋器設計出來的目的是什麼,不然這個問題沒法回答。

而且無法輸出或寫出任何信息?

一段python代碼作為一個程序不輸出任何東西那它為什麼還要被運行呢?

無法進入調試模式,無法查看中間變數輸出的結果

如果只是禁用調試模式和print語句的話,中間結果仍然是在內存里的,所以有心人仍然可以通過監聽內存讀寫流量來獲取這段python代碼執行的中間結果。退一萬步來說,既然源碼都在我手上了,就算你有個解釋器不讓我看中間結果,我也可以換個讓我看結果的解釋器來跑這段代碼。

一般來說,這種問題在computer security里屬於information flow integrity的範疇,即如何保護某一段信息(一般來說是存儲設備里的二進位數據)不被破壞或泄漏。對應的攻擊方式大部分時候是side channel analysis,即找到一個系統在正常運行時會給出哪些信息,利用這些信息來推斷構造出本應該被保護的秘密信息。這種討論一定要明確攻擊者和被攻擊者的能力前提。用題主這個python解釋器的例子來說,假如題主是想藏一些不能被被人知道的信息hardcode在源碼里,那麼至少會有這些情況:

  • 如果攻擊者能看到源碼,那免談
  • 如果攻擊者不能看到源碼甚至是程序的二進位編碼(暫且不提如何達成這個前提),但是可以在任何時候訪問內存里的任何地址,那就可以獲得這段程序的中間結果。按照題主的要求,python解釋器不提供調試模式,程序也不提供中間結果,所以這裡直接讀內存就是一個side channel。


看看 Cython


能做是能做……但是我就挺好奇的,一個沒有輸出的程序除了暖手還有啥作用


可以考慮自己編譯一份CPython

做如下處理:

進行位元組碼的全面替換,生成和解析都要換

幹掉自帶的pdb模塊

幹掉所有輸出的函數/包,比如賦值為noop

(這是何苦呢


當然有心的話,替換位元組碼也是看得出來的

還得在生成pyc文件上下手,但也最多拖延時間

(所以為啥呢

別人不能在正常的Python上調試嗎


不,沒有這種東西

只要代碼在用戶的本地執行得出結果,就一定有辦法做逆向工程,就是成本大不大的問題了。

最簡單的增加成本的辦法,把 python 編譯成本地代碼,比如 nuitka。如果這一步也擋不住,就再加個殼。還擋不住的話,就沒有太好的辦法了,就像其他人說的那樣,把核心功能做成服務放遠程執行最好。

其他回答里說的「替換位元組碼」是一個比較弱的保護方式。網易的某大火遊戲的邏輯代碼就是這種方式保護的,最後用些取巧的辦法得到了對應關係,然後直接反編譯出 python 代碼了。


如果嚴格地按照字面意思理解你的需求,就很簡單,在解釋器層面不允許設置 sys.stdout sys.stderr, 禁用 os ctypes socket open file,禁用 C 擴展的載入,把 sys.settrace 的 實現置空就可以了。


推薦閱讀:
相关文章