新聞中心
python?的混淆后的代碼可以還原么
你好,混淆后一般無法還原,但是你可以還原成MSIL語言。大多數(shù)混淆都是流程也混淆,如果流程也混淆了的話那就更不可能還原了。一般混淆后只能跟蹤執(zhí)行,找出程序的執(zhí)行算法。
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供宜城網(wǎng)站建設(shè)、宜城做網(wǎng)站、宜城網(wǎng)站設(shè)計、宜城網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、宜城企業(yè)網(wǎng)站模板建站服務(wù),十載宜城做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
Python sklearn.metrics模塊混淆矩陣常用函數(shù)
1.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
參數(shù)分別為y實際類別、預(yù)測類別、返回值要求(True返回正確的樣本占比,false返回的是正確分類的樣本數(shù)量)
eg:
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
accuracy_score(y_true, y_pred)
0.5
accuracy_score(y_true, y_pred, normalize=False)
2.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2)
參數(shù):真是類別,預(yù)測類別,目標(biāo)類別名稱
eg:
3.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
輸出為混淆矩陣
eg:
太多了,寫3個常用的吧,具體參考help(metrics)
defcm_plot(y,yp):#參數(shù)為實際分類和預(yù)測分類
fromsklearn.metricsimportconfusion_matrix
#導(dǎo)入混淆矩陣函數(shù)
cm = confusion_matrix(y,yp)
#輸出為混淆矩陣
importmatplotlib.pyplotasplt
#導(dǎo)入作圖函數(shù)
plt.matshow(cm,cmap=plt.cm.Greens)
# 畫混淆矩陣圖,配色風(fēng)格使用cm.Greens
plt.colorbar()
# 顏色標(biāo)簽
forxinrange(len(cm)):
foryinrange(len(cm)):
plt.annotate(cm[x,y],xy=(x,y),horizontalalignment='center',verticalalignment='center')
#annotate主要在圖形中添加注釋
# 第一個參數(shù)添加注釋
# 第一個參數(shù)是注釋的內(nèi)容
# xy設(shè)置箭頭尖的坐標(biāo)
#horizontalalignment水平對齊
#verticalalignment垂直對齊
#其余常用參數(shù)如下:
# xytext設(shè)置注釋內(nèi)容顯示的起始位置
# arrowprops 用來設(shè)置箭頭
# facecolor 設(shè)置箭頭的顏色
# headlength 箭頭的頭的長度
# headwidth 箭頭的寬度
# width 箭身的寬度
plt.ylabel('True label')# 坐標(biāo)軸標(biāo)簽
plt.xlabel('Predicted label')# 坐標(biāo)軸標(biāo)簽
returnplt
#函數(shù)調(diào)用
cm_plot(train[:,3],tree.predict(train[:,:3])).show()
python loc=None
這是一個值。
在Python中有一個值稱為None,它表示沒有值None是NoneType數(shù)據(jù)類型的唯一值就像布爾值True和False一樣,None必須大寫首字母N如果你希望變量中存儲的東西不會與一個真正的值混淆,這個沒有值的值就可能有用有一個使用None的地方就是print()的返回值print()函數(shù)在屏幕上顯示文本,但它不需要返回任何值,這和len()或input()不同但既然所有函數(shù)調(diào)用都需要求值為一個返回值,那么print()就返回None。
Python由荷蘭數(shù)學(xué)和計算機科學(xué)研究學(xué)會的吉多·范羅蘇姆于1990年代初設(shè)計,作為一門叫做ABC語言的替代品Python提供了高效的高級數(shù)據(jù)結(jié)構(gòu),還能簡單有效地面向?qū)ο缶幊獭?/p>
python混淆代碼后還能找回來么
Python程序的混淆和加密
混淆
為了增加代碼閱讀的難度, 源代碼的混淆非常必要, 一個在線的Python代碼混淆網(wǎng)站. 如果你覺得有用, 可以購買離線版本.
同時需要注意的是, 這個混淆其實還是被很多人懷疑的, 因為即使混淆了, 也沒有改變代碼的結(jié)構(gòu). 所以, 必要的話, 在編程的時候, 可以故意做點提高逆向難度的事情:
結(jié)構(gòu)稍微改變, 合并幾個類到同一個文件.
面向?qū)ο蟮慕Y(jié)構(gòu)中, 偶爾穿插一些無傷大雅的范式編程風(fēng)格.
加密
最基本的方法是發(fā)布pyc文件, 也就是將所有的.py源文件轉(zhuǎn)換成pyc對外發(fā)布. 詳情可以參考一個blog.
pyc有一個局限性是依賴于python解析器的版本, 使用某一個版本的python解釋器生成的pyc必須要在相同版本下的python解釋器下才可以正常工作.
使用上述方法可以方便的生成pyc, 初步的隱藏代碼了. 不過pyc依然可以被容易的破解, 所以另一種方案是借助cython. cython可以將python文件轉(zhuǎn)換成c, 并編譯成pyd文件. 一般將核心模塊編譯成pyd, 這樣被破解的風(fēng)險就大大降低了. 關(guān)于如何使用cython可以參考官網(wǎng)或者這篇文章 或者 這篇
有一個經(jīng)驗之談, 你可以將所有每個模塊中的某個一個位置的變量抽出, 放到一個python文件中, 使用cython來處理這個文件. 這樣就會增加破解者從其他pyc文件中移除pyd文件依賴的難度了.
總結(jié)
Stackoverflow上有一個長貼關(guān)于隱藏python代碼實現(xiàn)的. 有興趣的可以讀這里. 技術(shù)上方法和手段都是有的, 但是還有不可忽視的一點是法律上的保護和約定.
什么是pyc文件
pyc是一種二進制文件,是由py文件經(jīng)過編譯后,生成的文件,是一種byte code,py文件變成pyc文件后,加載的速度有所提高,而且pyc是一種跨平臺的字節(jié)碼,是由python的虛擬機來執(zhí)行的,這個是類似于JAVA或者.NET的虛擬機的概念。pyc的內(nèi)容,是跟python的版本相關(guān)的,不同版本編譯后的pyc文件是不同的,2.5編譯的pyc文件,2.4版本的 python是無法執(zhí)行的。
什么是pyo文件
pyo是優(yōu)化編譯后的程序 python -O 源文件即可將源程序編譯為pyo文件
什么是pyd文件
pyd是python的動態(tài)鏈接庫。
為什么需要pyc文件
這個需求太明顯了,因為py文件是可以直接看到源碼的,如果你是開發(fā)商業(yè)軟件的話,不可能把源碼也泄漏出去吧?所以就需要編譯為pyc后,再發(fā)布出去。當(dāng)然,pyc文件也是可以反編譯的,不同版本編譯后的pyc文件是不同的,根據(jù)python源碼中提供的opcode,可以根據(jù)pyc文件反編譯出 py文件源碼,網(wǎng)上可以找到一個反編譯python2.3版本的pyc文件的工具,不過該工具從python2.4開始就要收費了,如果需要反編譯出新版本的pyc文件的話,就需要自己動手了(俺暫時還沒這能力^--^),不過你可以自己修改python的源代碼中的opcode文件,重新編譯 python,從而防止不法分子的破解。
python是否有繪制混淆矩陣的函數(shù),怎么來實現(xiàn)
#?-*-?coding:?UTF-8?-*-
"""繪制混淆矩陣圖"""
import?matplotlib.pyplot?as?plt
from?sklearn.metrics?import?confusion_matrix
def?confusion_matrix_plot_matplotlib(y_truth,?y_predict,?cmap=plt.cm.Blues):
"""Matplotlib繪制混淆矩陣圖
parameters
----------
y_truth:?真實的y的值,?1d?array
y_predict:?預(yù)測的y的值,?1d?array
cmap:?畫混淆矩陣圖的配色風(fēng)格,?使用cm.Blues,更多風(fēng)格請參考官網(wǎng)
"""
cm?=?confusion_matrix(y_truth,?y_predict)
plt.matshow(cm,?cmap=cmap)??#?混淆矩陣圖
plt.colorbar()??#?顏色標(biāo)簽
for?x?in?range(len(cm)):??#?數(shù)據(jù)標(biāo)簽
for?y?in?range(len(cm)):
plt.annotate(cm[x,?y],?xy=(x,?y),?horizontalalignment='center',?verticalalignment='center')
plt.ylabel('True?label')??#?坐標(biāo)軸標(biāo)簽
plt.xlabel('Predicted?label')??#?坐標(biāo)軸標(biāo)簽
plt.show()??#?顯示作圖結(jié)果
if?__name__?==?'__main__':
y_truth?=?[1,?0,?1,?1,?1,?1,?1,?1,?1,?1,?0,?0,?0,?0,?0]
y_predict?=?[1,?0,?0,?1,?0,?1,?1,?1,?1,?1,?0,?1,?0,?1,?0]
confusion_matrix_plot_matplotlib(y_truth,?y_predict)
Python程序代碼混淆、編譯、打包、運行(桌面程序防破解向)
像Python這種解釋性的語言,要想私有化部署的同時又保護好源碼,就像是對于魚和熊掌的追求。
雖然做不到盡善盡美,但是對代碼進行混淆,增加一點破解的難度,或許能規(guī)避一些泄露的風(fēng)險。
本次演示環(huán)境:linux
確保要發(fā)布的包根目錄("demo")中有__main__.py文件,這個是程序執(zhí)行入口。
編譯
批量改名.pyc文件
移動.pyc文件
清理.py文件
清理__pycache__文件夾
打包成zip
運行時只要將zip文件作為參數(shù)即可
最終整合腳本
調(diào)用方式
對于在變量和函數(shù)名上的混淆有點小兒科,而對于跨文件的類名的混淆又太容易實現(xiàn)。
所以對于混淆程度的取舍,要視工程的規(guī)模而定。
2.1 混淆工具pyminifier
在原來的工具 pyminifier上修復(fù)了幾個bug。
安裝:
python3 安裝
或者clone下來,自行安裝
使用例子
2.2 源碼變更
不同的配置對于源碼的要求不同,以下是筆者踩過的坑。
其他混淆想法
結(jié)合混淆、編譯和打包,嘗試出以下發(fā)布腳本。
主要的思路 :創(chuàng)建一個工作目錄tmp,然后在此目錄下混淆、編譯python代碼,完成后把內(nèi)容打包成pyc文件,再將pyc文件和其他配置文件移動到dist,發(fā)布dist即可。
混淆的目的是最大程度保護源碼,在發(fā)布到客戶端后不被輕易破解。
網(wǎng)站題目:混淆函數(shù)python 函數(shù)名混淆
URL標(biāo)題:http://www.ef60e0e.cn/article/dosdged.html