類似py2exe軟體真的能保護python原始碼嗎
背景
最近寫了個工具用於對專案中C/C++檔案的字串常量進行自動化加密處理,用python寫的,工具效果不錯,所以打算在公司內部推廣。為了防止程式碼洩露就考慮不採用直接給原始碼方式,而python二進位制指令碼pyc和pyo,雖然提供的不是原始碼,但可以通過uncompyle2直接得到原始碼。通過網上資料發現有Windows下的py2exe、Mac下的py2app和跨平臺的PyInstaller工具都可以將python指令碼打包成可執行檔案,第一反應應該滿足需要,但有些不放心,故親自嘗試和分析了這些工具。
pyexe
該工具用於Windows下將python指令碼和python直譯器打包成可執行檔案。這樣可以在沒有安裝python的機器上執行。打包後會有個library.zip打包的檔案,如圖1
裡面包含有所依賴的模組和打包的模組,都是pyc儲存,因此可以很容易的通過uncompyle2得到原始碼。因此基本上是零保護。
跨平臺工具PyInstaller
使用了這幾個工具後發現該工具功能更為強大。打包後的可執行檔案不依賴python,可以直接在沒裝python的機器上執行。要生成不同系統的可執行檔案就必須在對應系統上進行打包,而不能一次打包跨平臺執行。
該工具可以打包成一個目錄或者成一個可執行檔案,網上教程很多我也就不介紹了。但打包成一個檔案實質執行的時候首先會解壓成一個目錄,然後才能執行,因此一個檔案實質上是對一個目錄的壓縮儲存。該工具提供介面可以使用AES對模組進行加密。
該工具將與系統無關的部分打包進CArchive格式(類似於zip)的檔案中,並將該檔案放入到生成的可執行檔案末尾。PyInstaller提供工具pyi-archive_viewer進行檢視,如圖2所示,
下面將對上述圖中所列的重點檔案進行介紹。
out00-PYZ.pyz
儲存打包所依賴的模組,類似於上述的library.zip,該檔案屬於ZlibArchive格式,如圖3所示,
從圖中可以看出,Table Of Contents部分包含有模組名字、在檔案中的偏移和長度。通過這些資訊可以得到模組的內容,該內容是壓縮的,需要使用zlib進行解壓。pyi-archive_viewer也可以檢視上述資訊。如圖4所示。
pyimod00_crypto_key
當使用AES加密選項後,才會有該檔案,該檔案是pyc格式檔案,使用uncompyle2得到的內容為圖5所示,
從圖中可以看出,只有一個key,實際上這就是我使用AES加密的key,因此該key相當於明文儲存。
DealProject
該檔案是我處理的python原始碼檔案,他是直接以原始碼形式存在的。
可以看出PyInstaller雖然比py2exe複雜點,但同樣也是非常容易得到原始碼的。
py2app
同樣也對Mac上該工具進行了測試,發現py2app打包後的程式同樣存在上述問題,並且不能再沒有python的機器上執行,處理的檔案也是以原始碼的形式存在,其他檔案是以pyc格式打包在壓縮檔案中。
總結
通過目前主流的打包軟體看出,他們只是提供了將python指令碼打包成可執行檔案,用於在沒有python的機器上執行,並沒有對python指令碼進行保護處理,可以很方便的得到原始碼。目前瞭解的解決方案有cython,cython是屬於python的超集,他首先會將python程式碼轉化成c語言程式碼,然後通過c編譯器生成可執行檔案,這樣會克服上述出現的情況,並且可以呼叫c庫的函式,這樣提高了程式的效能,並增加了程式碼的安全性,不失為一種不錯的方案。