1. 使用python語言如何保密源代碼以防止逆向工程
大家都很忙,誰有時間看你的的爛代碼!
如果真的怕泄露,別用python.
我以前做過這類事情,而且當時更嚴格,需要打包部署到客戶的服務只在有效期內有效,超過有效期必須更新證書才行。
Python代碼用任何方法都沒法保證保密性,這個時候你可以考慮用一個工具「nuitka」,這個工具會把你的python源代碼映射為c++然後編譯為二進制,因此對方是無論如何得不到你的源代碼的。
代價就是nuitka這個工具並不完美,有一些限制並不能100%完美的轉換所有python代碼。
1.用Cython編譯python成 Windows的pyd文件或Linux的so文件,二進制文件相對安全性較高。
2.用源碼混淆器把代碼搞的又臭又長。。。混淆完了再用Cython編譯為二進制。。。這樣靜態反編譯逆向難度也不小。
3.同其他語言程序一樣,可以對調試狀態進行檢測,當處於調試狀態時退出程序或進入混亂代碼耗費逆向工程人員心神。
4.分享一個跨平台反調試手段,檢測函數運行時間,加斷點會導致函數運行時間變長,也可感知正在被調試。
Python是提倡開源的,既然選擇Python還是擁抱開源才好~ 都開源還擔心逆向工程嘛
沒有不能逆的軟體。
只要匯編語言過關,逆向工程都是可以實現的,不要有其它想法。
你唯一可以做的,就是不讓別人用python讀取源代碼而已。那樣實現起來比較簡單。
python 適合開發伺服器程序,或者自己科研使用的程序,如果是 作為用戶程序,安裝到 pc 或手機上,還是 其它 c++ 或java 比較合適
1)可以把需要保護的部分用c語言實現,從而編譯成so等文件,這樣逆向的成本會比較高,可以防止直接打開python文件看到代碼邏輯。
2)so文件通過ida等工具也是可以反匯編的,可以通過對c語言進行代碼混淆,花指令等操作,提高通過ida等反匯編工具的分析難度。
3)不存在絕對無法逆向的技術手段,因此只能是看具體需求,選擇具體的防逆向的技術手段。
有工具類似py2exe轉成可執行程序,隱藏全部源代碼,雖然bytecode還是可以反編譯,但是難度大多了
1. 最穩的就是你改cpython載入代碼的過程,改zip包讀取最穩。
2. 藉助一些加密工具在編譯pyc之前進行一定的混淆,可以防君子,自我安慰一下。
商用一般都是用第一種辦法,小打小鬧用第二種。
可以考慮使用pymod工具,使用pymod pack 將模塊加密打包,發布的時候一個模塊就一個文件。
先睹為快,看看一個項目發布的時候,只有幾個文件,
main.py 項目程序入口
setting.py 項目配置
apps 項目模塊
plusins 項目插件目錄
創建項目 pymod create demo1
cd demo1
創建模塊 pymod add mod1
啟動pycharm 開始編寫功能模塊
一個模塊默認由三個文件組成
__init__.py 、 handlers.py 、param_schemas.py
業務邏輯主要在handlers.py中編寫
__init__.py
from pymod.blueprint import Blueprint api = Blueprint("/mod1") from .handlers import *
param_schemas.py
schema_sfz = { "type": "object", "required": ["sfz", "nl"], "properties": { "sfz": { "type": "string", "minLength": 18, "maxLength": 18, "description": "身份證明號碼" }, "nl": { "type": "integer", "minimum": 0, "maximum": 150, "description": "年齡" } } }
handlers.py
from . import api from pymod.ext import RequestHandler, params_validate,TrueResponse,FalseResponse from .param_schemas import schema_sfz from pymod.plugins import sfz_check @api.add_route('/hello') class Hello(RequestHandler): def get(self): self.write('Hello World') @params_validate(schema_sfz) def post(self): sfz = self.get_json_arg("sfz") nl =self.get_json_arg("nl") # self.write(TrueResponse(sfz=sfz, nl=nl)) if sfz_check.check_sfzmhm(sfz): self.write(TrueResponse(hint="身份證明號碼驗證通過")) else: self.write(FalseResponse(hint="身份證明號碼驗證失敗"))
三、項目部署
程序調試 修改setting.py
# 開發模式下 運行的模塊名稱必須填寫
moles = ["mod1"] moles_config ={ "mod1": { "deny_ip": "", "allow_ip": "*" } }
啟動程序 python main.py
調試沒有問題,進入發布模式
在項目目錄下
pymod pack mod1
在target目錄下生成mod1.mod文件,將其復制到apps目錄中
修改setting.py
# 開發模式下 運行的模塊名稱必須填寫
moles = []
再次運行 python main.py 測試
一切OK,系統就可以發布了。
說不能保密的,是沒有研究過python的機制的。我做個一個項目,所有源代碼自定義加密,運行時解密。
2. dlib庫,怎麼在python中安裝
這幾天剛好用到Python,其中用到了Dlib庫的人臉對齊演算法。python中需要用到import dlib.pyd文件,這個文件需要用python對dlib源碼進行編譯生成。
具體的生成步驟如下:
1. 安裝boost庫
本人用的是boost_1_61_0版本,在這里簡單說下安裝步驟,具體的方法可以參考網上其它人的博客。
也可參考本文博文《windows下使用bjam安裝Boost》。安裝完成之後,記得配置環境變數。
2. 用python的CMD窗口,進入到dlib庫的目錄下,輸入命令:python setup.py install.
如果提前配置好了boost庫,並且把生成的boost_python-vc120-mt-1_61.dll和boost_python-vc120-mt-gd-1_61.dll兩個文件放到python目錄下。
還需要配置cmake的環境變數,../cmake/bin添加在系統環境變數path里,否則出錯:cannot find cmake in the path.
成功編譯後,會在../dlib/dist/dlib/目錄下找到生成的dlib.pyd文件,把該文件拷貝放到python目錄下的Lib\site-packages\下面,這樣就完成了python編譯dlib庫的工作。
注意:在用python進行dlib編譯時,可能因為python版本的問題,在Lib\distutils\log.py文件中編譯出錯
UnicodeEncodeError: 'gbk' codec can't encode character u'\x9' in position...的問題。
stream.write('%s\n' % msg) ///源文件
修改方法:stream.write('%s\n' % msg.decode('gbk')),即可編譯通過。這是python2.7版本中的gbk和unicode編解碼的原因造成的。
注意:上面的方法本人成功編譯過一次,但是後來又有問題。總是顯示"Could Not Found Boost."(期間卸載了電腦上的vs2008和vs2010,僅保留vs2013).
後來,借鑒了其他網友的方法如下:
首先,添加系統變數 BOOST_ROOT = D:\boost_1_59_0 和 BOOST_LIBRARYDIR = D:\boost_1_59_0\stage\lib。然後打開cmd,進入到boost目錄,輸入以下指令編譯python library(我的python是32位,因此address-model=32):
編譯python庫生成兩個lib文件:libboost_python-vc120-mt-s-1_61和libboost_python-vc120-mt-sgd-1_61,復制到...\stage\lib目錄下面。
再鍵入命令:python setup.py install,顯示如下:
不過按下面這種方式編譯dlib,對於32位的筆記本需要把stream.write('%s\n' % msg.decode('gbk'))恢復為原來的stream.write('%s\n' % msg). 而在64位的PC機上,保留下面的修改的方法:stream.write('%s\n' % msg.decode('gbk'))stream.flush()並且在python的Lib\site-packages文件夾下新建一個sitecustomize.py,內容為:import sys
reload(sys)
sys.setdefaultencoding('utf8') #set default encoding to utf-8
兩台機器上都可以編譯成功。
Ps:在win7系統下用python編譯dlib,花了我兩天時間去琢磨調試,上面的經驗需要的朋友請拿去進一步整理,以免浪費不必好的時間。有問題的童鞋請在下面留言。
3. python 怎麼調用pyd文件
python並非完全是解釋性語言,它是有編譯的,先把源碼py文件編譯成pyc或者pyo,然後由python的虛擬機執行,相對於py文件來說,編譯成pyc和pyo本質上培告察和py沒有太大區別,只是對於這個模塊的載入速度提高了
並沒有提高代友早碼的執行速度,通常情況下不用主動去編譯pyc文件,文檔上說只要調用了import model那配茄么model.py就會先編譯成pyc然後載入!
4. Python3如何將py文件編譯為pyd文件
不想裝VS可以使用第三方庫nuitka,同時安裝mingw64
5. Python 怎麼調用 pyd文件
python文件名.py就可以了。
就這樣,Python在Guido手中誕生了。可以說,Python是從ABC發展起來,主要受到了Mola-3(另一種相當優美且強大的語言,為小型團體所設計的)的影響。並且結合了Unixshell和C的習慣。
Python已經成為最受歡迎的程序設計語言之一。自從2004年以後,python的使用率呈線性增長。Python2於2000年10月16日發布,穩定版本是Python2.7。Python3於2008年12月3日發布,不完全兼容Python2。2011年1月,它被TIOBE編程語言排行榜評為2010年度語言。
6. python的腳本文件的擴展名是pyd
擴展名說明
1、通常寫Python腳本都是以.py為擴展名,.pyc二進制文件可以反編譯成.py文件。
2、反編譯軟體叫EasyPythonDecompiler,可以反編譯一個文件,也可以是一個文件夾。
7. Python 代碼例子,怎樣編譯成.py文件
直截復制保存到文本文件中就行,然後把文件擴展文改為.py。
要注意縮進,python代碼是靠 縮進 確定代碼層次關系的。
8. python文件後綴名是什麼
python的後綴名是py。
9. Python關於.pyd文件無法import的問題的解決方法
當我想載入pyd文件,用Python調用裡面的函數時
使用語句:import tick_gy as gal
pycharm編譯器報錯: MoleNotFoundError error from .pyd file: MoleNotFoundError: No mole named"tick_gy" 表示一直找不到該模塊
找了半天,最終解決了此問題,特此分享給大家。卜芹笑如果大神有更好的辦法請留言,謝謝分享。
一種可能是:.pyd文件名稱 於該語句中的「import tick_gy as gal」不一致
另外一種可能是:.pyd文件目錄錯誤,應放在在Python編譯器的Lib/site-packages目錄下
還有一種可能是:環境變數。Python文件找不到.pyd文件目錄,應將.pyd文件目錄添加至環境變數中
1. 手動添加環境變數。採用系統手動添加
2.將該語句放置在import tick_gy as gal語句前
sys.path.append('C:\\Users\\lenovo\\AppData\\Local\\Programs\\Python\\Python39\\Lib\\site-packages')
os.environ['path'] += ';C:\\Users\\lenovo\\AppData\\Local\\Programs\\Python\\Python39\\Lib\\site-packages'
在嘗試了三種可能性操作了,統統失敗。最終原因是因為pycahrm編譯器為Python39,首模而生成.pyd文件的編譯器是Python37。兩者編譯器版本不兼容,將Python39卸載,重裝Python37,無需上述操作型含,成功!
10. python怎麼編譯成pyc文件
如下命令:
python-mcompileallxxx.py
可以對當前目錄下的xxx.py文件生成pyc