python代碼混淆
㈠ pythonpython區分大小寫嗎
python大小寫敏感,縮進敏感.
㈡ python 的混淆後的代碼可以還原么
混淆是丟失信息量的操作。
沒有辦法找回丟失的信息量。
全局批量替換變數名吧?
那你就全局查找,一個一個理順就好哇。又不是什麼加密。
㈢ 如何在Python寫的混淆矩陣
將labels、y_true 、y_pred替換為你自己的數據即可。
㈣ python如何防止反編譯
Python 編譯生成 pyc 僅僅為了提升載入速度,並不是為了防止破解,反編譯後和原來一模一樣。pyinstaller,py2exe,只是把 pyc 打個包,同樣很弱。代碼混淆也只能增加看懂代碼的難度,但並不能防止破解。所以最為穩妥的辦法只有修改Python解釋器,對源代碼進行加密,解釋器載入源代碼時再解密,這種方法雖然可以防止破解,但給自己帶來麻煩不說,發布程序是需要打包自己修改後的解釋器,相當麻煩。
㈤ python混淆代碼後還能找回來么
Python程序的混淆和加密
混淆
為了增加代碼閱讀的難度, 源代碼的混淆非常必要, 一個在線的Python代碼混淆網站. 如果你覺得有用, 可以購買離線版本.
同時需要注意的是, 這個混淆其實還是被很多人懷疑的, 因為即使混淆了, 也沒有改變代碼的結構. 所以, 必要的話, 在編程的時候, 可以故意做點提高逆向難度的事情:
結構稍微改變, 合並幾個類到同一個文件.
面向對象的結構中, 偶爾穿插一些無傷大雅的範式編程風格.
加密
最基本的方法是發布pyc文件, 也就是將所有的.py源文件轉換成pyc對外發布. 詳情可以參考一個blog.
pyc有一個局限性是依賴於python解析器的版本, 使用某一個版本的python解釋器生成的pyc必須要在相同版本下的python解釋器下才可以正常工作.
使用上述方法可以方便的生成pyc, 初步的隱藏代碼了. 不過pyc依然可以被容易的破解, 所以另一種方案是藉助cython. cython可以將python文件轉換成c, 並編譯成pyd文件. 一般將核心模塊編譯成pyd, 這樣被破解的風險就大大降低了. 關於如何使用cython可以參考官網或者這篇文章 或者 這篇
有一個經驗之談, 你可以將所有每個模塊中的某個一個位置的變數抽出, 放到一個python文件中, 使用cython來處理這個文件. 這樣就會增加破解者從其他pyc文件中移除pyd文件依賴的難度了.
總結
Stackoverflow上有一個長貼關於隱藏python代碼實現的. 有興趣的可以讀這里. 技術上方法和手段都是有的, 但是還有不可忽視的一點是法律上的保護和約定.
什麼是pyc文件
pyc是一種二進制文件,是由py文件經過編譯後,生成的文件,是一種byte code,py文件變成pyc文件後,載入的速度有所提高,而且pyc是一種跨平台的位元組碼,是由python的虛擬機來執行的,這個是類似於JAVA或者.NET的虛擬機的概念。pyc的內容,是跟python的版本相關的,不同版本編譯後的pyc文件是不同的,2.5編譯的pyc文件,2.4版本的 python是無法執行的。
什麼是pyo文件
pyo是優化編譯後的程序 python -O 源文件即可將源程序編譯為pyo文件
什麼是pyd文件
pyd是python的動態鏈接庫。
為什麼需要pyc文件
這個需求太明顯了,因為py文件是可以直接看到源碼的,如果你是開發商業軟體的話,不可能把源碼也泄漏出去吧?所以就需要編譯為pyc後,再發布出去。當然,pyc文件也是可以反編譯的,不同版本編譯後的pyc文件是不同的,根據python源碼中提供的opcode,可以根據pyc文件反編譯出 py文件源碼,網上可以找到一個反編譯python2.3版本的pyc文件的工具,不過該工具從python2.4開始就要收費了,如果需要反編譯出新版本的pyc文件的話,就需要自己動手了(俺暫時還沒這能力^--^),不過你可以自己修改python的源代碼中的opcode文件,重新編譯 python,從而防止不法分子的破解。
㈥ 為什麼python不可加密
可以加密。 python 代碼加密甚至可以做到比用匯編手寫混淆,用 c 手寫混淆更加難以解密。具體做法略復雜僅簡單說個過程。
第一級別是源碼級別的混淆,用 ast 和 astor ,再自己手寫一個混淆器,三五百行的腳本直接混淆到幾萬行,整個文件面目全非,基本可以做到就算直接放腳本給你拿去逆,除非你再寫出來一個逆向前面的混淆演算法的腳本來逆(在熟悉 python 的情況下需要花幾天,且不說需要了解程序構造原理),手動去調試腳本幾乎達到不可行的地步(話費時間再乘以 2 )
第二級別是個性化定製 pyinstaller , pyinstaller 會打包所有需要的庫,將腳本也包含進打包的 exe ,但是, pyinstaller 有一個 stub ,相當於一個啟動器,需要由這個啟動器來解密腳本和導入模塊,外面有直接導出腳本的工具,但是那是針對 pyinstaller 自帶的啟動器做的,完全可以自己修改這個啟動器再編譯,這樣逆向者就必須手動調試找到 main 模塊。配合第一級別加密,呵呵,中國就算是最頂尖的逆向專家也要花個一兩周,來破解我們的程序邏輯了,就我所知,實際上國內對於 py 程序的逆向研究不多。
第三級別是再上一層,將 py 翻譯為 c 再直接編譯 c 為 dll ,配合第一階段先混淆再轉 c 再編譯,在第一步混淆之後,會產生非常多垃圾(中間層)函數,這些中間層函數在 c 這里會和 py 解釋器互相調用,腳本和二進制之間交叉運行,本身混淆之後的源碼就極難復原,再混合這一層,想逆向,難。
第四級別是利用 py 的動態特性,絕大多數逆向者都是 c ,匯編出身,對於程序的第一直覺就是,程序就是一條一條的指令,後一條指令必然在這一條指令後面,然而, py 的動態特性可以讓代碼邏輯根本就不在程序裡面,這一點不想多講,涉及到我一個項目里的深度加密。
第五級別,數學做牆。了解過比特幣原理的知道要想用挖比特幣就得提供大量算力去幫網路計算 hash ,這個成為 pow ,那麼既然已經採用 py 了估計已經不考慮太多 cpu 利用率了,那就可以採用 pow (還有其他的手段)確保程序運行時擁有大量算力,如果程序被單步調試,呵呵,一秒鍾你也跑不出來幾個 hash 直接拉黑這個 ip (這個說法可能比較難理解,因為我第四層的加密沒有說明,不過意思就是拒絕執行就對了)
㈦ Python程序代碼混淆、編譯、打包、運行(桌面程序防破解向)
像Python這種解釋性的語言,要想私有化部署的同時又保護好源碼,就像是對於魚和熊掌的追求。
雖然做不到盡善盡美,但是對代碼進行混淆,增加一點破解的難度,或許能規避一些泄露的風險。
本次演示環境:linux
確保要發布的包根目錄("demo")中有__main__.py文件,這個是程序執行入口。
編譯
批量改名.pyc文件
移動.pyc文件
清理.py文件
清理__pycache__文件夾
打包成zip
運行時只要將zip文件作為參數即可
最終整合腳本
調用方式
對於在變數和函數名上的混淆有點小兒科,而對於跨文件的類名的混淆又太容易實現。
所以對於混淆程度的取捨,要視工程的規模而定。
2.1 混淆工具pyminifier
在原來的工具 pyminifier上修復了幾個bug。
安裝:
python3 安裝
或者clone下來,自行安裝
使用例子
2.2 源碼變更
不同的配置對於源碼的要求不同,以下是筆者踩過的坑。
其他混淆想法
結合混淆、編譯和打包,嘗試出以下發布腳本。
主要的思路 :創建一個工作目錄tmp,然後在此目錄下混淆、編譯python代碼,完成後把內容打包成pyc文件,再將pyc文件和其他配置文件移動到dist,發布dist即可。
混淆的目的是最大程度保護源碼,在發布到客戶端後不被輕易破解。
㈧ python 的混淆後的代碼可以還原么
你好,混淆後一般無法還原,但是你可以還原成MSIL語言。大多數混淆都是流程也混淆,如果流程也混淆了的話那就更不可能還原了。一般混淆後只能跟蹤執行,找出程序的執行演算法。
㈨ python3.5做分類時,混淆矩陣加在哪一步
preface:做著最近的任務,對數據處理,做些簡單的提特徵,用機器學習演算法跑下程序得出結果,看看哪些特徵的組合較好,這一系列流程必然要用到很多函數,故將自己常用函數記錄上。應該說這些函數基本上都會用到,像是數據預處理,處理完了後特徵提取、降維、訓練預測、通過混淆矩陣看分類效果,得出報告。
1.輸入
從數據集開始,提取特徵轉化為有標簽的數據集,轉為向量。拆分成訓練集和測試集,這里不多講,在上一篇博客中談到用StratifiedKFold()函數即可。在訓練集中有data和target開始。
2.處理
[python]view plain
defmy_preprocessing(train_data):
X_normalized=preprocessing.normalize(train_data,norm="l2",axis=0)#使用l2範式,對特徵列進行正則
returnX_normalized
defmy_feature_selection(data,target):
fromsklearn.feature_selectionimportSelectKBest
fromsklearn.feature_selectionimportchi2
data_new=SelectKBest(chi2,k=50).fit_transform(data,target)
returndata_new
defmy_PCA(data):#datawithouttarget,justtraindata,withoutraintarget.
pca_sklearn=decomposition.PCA()
pca_sklearn.fit(data)
main_var=pca_sklearn.explained_variance_
printsum(main_var)*0.9
importmatplotlib.pyplotasplt
n=15
plt.plot(main_var[:n])
plt.show()
defclf_train(data,target):
fromsklearnimportsvm
#fromsklearn.linear_modelimportLogisticRegression
clf=svm.SVC(C=100,kernel="rbf",gamma=0.001)
clf.fit(data,target)
#clf_LR=LogisticRegression()
#clf_LR.fit(x_train,y_train)
#y_pred_LR=clf_LR.predict(x_test)
returnclf
defmy_confusion_matrix(y_true,y_pred):
fromsklearn.metricsimportconfusion_matrix
labels=list(set(y_true))
conf_mat=confusion_matrix(y_true,y_pred,labels=labels)
print"confusion_matrix(leftlabels:y_true,uplabels:y_pred):"
print"labels ",
foriinrange(len(labels)):
printlabels[i]," ",
print
foriinrange(len(conf_mat)):
printi," ",
forjinrange(len(conf_mat[i])):
printconf_mat[i][j],' ',
print
print
defmy_classification_report(y_true,y_pred):
fromsklearn.metricsimportclassification_report
print"classification_report(left:labels):"
printclassification_report(y_true,y_pred)
- my_preprocess()函數:
- 主要參考sklearn官網
主要使用sklearn的preprocessing函數中的normalize()函數,默認參數為l2範式,對特徵列進行正則處理。即每一個樣例,處理標簽,每行的平方和為1.
my_feature_selection()函數:
使用sklearn的feature_selection函數中SelectKBest()函數和chi2()函數,若是用詞袋提取了很多維的稀疏特徵,有必要使用卡方選取前k個有效的特徵。
my_PCA()函數:
主要用來觀察前多少個特徵是主要特徵,並且畫圖。看看前多少個特徵佔據主要部分。
clf_train()函數:
可用多種機器學習演算法,如SVM, LR, RF, GBDT等等很多,其中像SVM需要調參數的,有專門調試參數的函數如StratifiedKFold()(見前幾篇博客)。以達到最優。
my_confusion_matrix()函數:
主要是針對預測出來的結果,和原來的結果對比,算出混淆矩陣,不必自己計算。其對每個類別的混淆矩陣都計算出來了,並且labels參數默認是排序了的。
my_classification_report()函數:
主要通過sklearn.metrics函數中的classification_report()函數,針對每個類別給出詳細的准確率、召回率和F-值這三個參數和宏平均值,用來評價演算法好壞。另外ROC曲線的話,需要是對二分類才可以。多類別似乎不行。
㈩ 我用python開發了一個小程序,部署在別人的伺服器上,怎麼讓他看不到源代碼
你好!
還真沒試過,,不過方法肯定是有很多中的,我想python的開發工具應該有帶封裝的程序吧!!!
或者刪Py文件,留解釋過後的文件。或者搞一個代碼混淆器,混淆一下就OK了嘛!!!(自己寫一個也行)
希望對你有所幫助,望採納。