㈠ 使用python語言如何保密源代碼以防止逆向工程
Python 這門語言本身就是一邊編譯一邊運行的,有程序,則必有源代碼。
如果你非要加密,也不是不可以,推薦你使用一些工具,可以將Python編譯成.exe文件。
此外你可以多看一下類似的文章:
如何一本正經地寫出別人無法維護的代碼?
㈡ 有沒有好的 python 混淆器 推薦一個
代碼混淆,其實很簡單。原理就是查找、替換而已。市面上有很多混淆工具,最好是在混淆工具的基礎上,自己再寫一下,二次混淆。演算法也不難。如果需要全局混淆,以及自動混淆,那麼就復雜一些了,需要再加上詞法分析和語法分析。
如何使用:
1,首先得安裝Python。
2,把這個下面這個 confuse.py 文件,復制目標文件夾。
3,更改 raw_name_list 列表裡的字元串。改成你想混淆的變數名或者類名方法名。
4,運行pythonconfuse.py 即可混淆該文件夾下的.cs文件。
這段代碼其實還是很簡單的,只是為大家說明一下混淆思想。如果想更方便的使用,需要再加入一些詞法分析、語法分析的演算法。
代碼如下:
#! /usr/bin/env python
#coding=utf-8
import hashlib
import random
import os
###############################
# Describe : 混淆Unity腳本文件
# D&P Author By: 常成功
# Create Date: 2014-11-25
# Modify Date: 2014-11-25
###############################
#想混淆的變數/方法名
raw_name_list = ["function_1", "function_2", "var_1", "var_2",]
#混淆後的變數/方法名
new_name_list = []
#隨機可選的字母表
alphabet = ["a", "b", "c", "d", "e", "f", "g",
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q",
"r", "s", "t", "u", "v", "w", "x", "y", "z",
]
#生成新的變數名
def create_new_name() :
m = hashlib.md5()
#生成隨機變數名
for raw_name in raw_name_list:
m.update(raw_name)
#生成一個16位的字串
temp_name = m.hexdigest()[0:16]
#合法名稱校驗
#強制以字母作為變數/方法名的開頭
if temp_name[0].isdigit():
initial = random.choice(alphabet)
temp_name = initial + temp_name
temp_name = temp_name[0:16]
#不能重名
while(1):
if temp_name in new_name_list :
initial = random.choice(alphabet)
temp_name = initial + temp_name
temp_name = temp_name[0:16]
else:
new_name_list.append(temp_name)
break
#混淆文件
def confuse_file(path_filename):
file_content = ""
#讀文件內容
f = file(path_filename)
# if no mode is specified, 'r'ead mode is assumed by default
while True:
line = f.readline()
if len(line) == 0: # Zero length indicates EOF
break
#混淆
name_index = 0
for raw_name in raw_name_list:
the_new_name = new_name_list[name_index]
line = line.replace(raw_name, the_new_name)
name_index += 1
file_content += line
f.close()
#重寫文件
f = file(path_filename, 'w')
f.write(file_content)
f.close()
#遍歷當前目錄下的所有.cs文件
def confuse_all():
#獲取當前目錄
dir = os.getcwd()
for root, dirs, filename in os.walk(dir):
for file in filename:
path_filename = os.path.join(root, file)
if path_filename.endswith('.cs'):
confuse_file(path_filename)
print "Confuse File: ", path_filename
if __name__=="__main__":
create_new_name()
confuse_all()
#列印一下混淆的情況.
#如果用文本保存起來, 那麼以後可以反混淆, 還原文件
print "Start Confuse ...."
for j in range(0, len(raw_name_list)) :
print raw_name_list[j] , " --> " , new_name_list[j]
print "Confuse Complete !"
㈢ 為什麼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 如何保密源代碼?
相關推薦:《Python教程》
加密方式
對 Python 加密時可能會有兩種形式,一種是對Python轉成的exe進行保護,另一種是直接對.py或者.pyc文件進行保護,下面將列舉兩種形式的保護流程。
1、對 python轉exe加密,下載最新版Virbox Protector加密工具,使用加密工具直接對demo.exe進行加密操作。
2、對.py/.pyc加密。
第一步,使用加密工具對 python 安裝目錄下的 python.exe 進行加密,將 python.exe 拖入到加密工具 VirboxProtector 中,配置後直接點擊加密。
第二步,對.py/.pyc 進行加密,使用 DSProtector 對.py/.pyc 進行保護。
㈤ 怎樣對 Python 源碼加密
代碼加密
大概整理了以下幾種方法:
編譯成pyc文件
使用py2exe將python代碼轉成window下執行的exe文件
關鍵代碼部分使用c或者c++寫,然後在python中調用
用C寫一個license,進行license驗證
作為一門解釋型的語言,加密的難度超級大。下面來簡單分析上面的解決方案:
編譯成pyc文件幾乎跟pyc沒有區別,保護力度太低
要是在linux機器上就沒法使用,而且這種exe文件也可以被破解的
核心代碼部分是計算密集型,用的是pandas,numpy等庫,用c重寫,簡直不可能,工作量太大。
沒搞過,不知道………
看來上面的解決方案都是不行的,在stackoverflow上對這個問題也進行了詳細的討論,用我蹩腳的英文來翻譯(意譯)一下得票率最高的:
「有什麼方法來解決這個問題嗎?(加密的問題)」沒有。任何保護都可以被逆向工程破解。就連DVD機的固件都可以被破解,盡管法律判定其為非法,但是AACS加密密鑰還是泄露出來。
因為沒有技術的方法可以阻止你的客戶看你的代碼,你必須用傳統的商業方法。
1. 許可證,合約,條款,條件。只要用戶簽訂了這些東西,及時用戶可以看見代碼,也會有法律約束(不過此建議在中國目前貌似不頂用)
2. 提供巨大的價值。如果你的東西非常好,而且價格很合理,那麼用戶很難拒絕——沒必要浪費時間和金錢去搞逆向工程啥的,因為逆向工程是很費銀子的。讓你的產品有足夠的性價比。
3. 經常性的升級和增加新的功能,使得逆向工程不那麼好使。當下一個版本破壞了逆向工程,那麼以前的破解就沒有意義了。
4. 定製化生產,為不同的客戶提供不同的產品。(貌似代價有點高啊)
5. 使用有時間限制的許可證,這會給你帶來不好的名聲,但是會保證你的軟體會停止工作
6. 設計為web service.
代碼混淆
既然加密不是一個好方法,那要還是不死心,那就做一個簡單的混淆算了,雖然只能」防君子,不防小人「。但是不能就這樣把代碼暴露出來。
這里推薦一個找了好久的東西: pyobfuscate這個東西在window7中的cmd中貌似總是混淆失敗,無奈用了MINGW32,居然搞定了。官方的資料有這樣的介紹:
pyobfuscate有幾種轉化代碼的方式,有些可逆,有些不可逆。
移除注釋和文檔 ( 不可逆)
改變縮進(可逆)
在tokens之間加入空格(一定程度上可逆)
重命名函數,類,和變數(不可逆)
在空白行中加入無效的代碼
我沒有選擇混淆函數名和類名,因為其他地方還要調用呢。下面是我混淆的結果,還挺好看的:
def my_fuction_to_test ( self , start_date , end_date ) :
iiiii11iII1 = self . get_something ( start_date , end_date )
O0o = [ ]
for oO0 in iiiii11iII1 :
if oO0 [ "isOpen" ] == 1 :
IIIi1i1I = { }
OOoOoo00oo = dt . strptime ( oO0 [ 'calendarDate' ] , '%Y-%m-%d' )
IIIi1i1I [ 'day' ] = OOoOoo00oo . strftime ( '%Y%m%d' )
IIIi1i1I [ 'week' ] = oO0 [ 'isWeekEnd' ]
IIIi1i1I [ 'month' ] = oO0 [ 'isMonthEnd' ]
IIIi1i1I [ 'weekday' ] = OOoOoo00oo . weekday ( )
O0o . append ( IIIi1i1I )
iiI11 = pd . DataFrame ( O0o )
return iiI11
㈥ python文本加密是什麼
python文本加密是Python 提供了諸如 hashlib,base64 等便於使用的加密庫,我們可以藉助異或操作,實現一個簡單的文件加密程序。
通過了解異或操作的性質,加密原理就非常清晰了。
首先將文件轉換成二進制數,再生成與該二進制數等長的隨機密鑰,將二進制數與密鑰進行異或操作,得到加密後的二進制數。
將加密後的二進製程序與密鑰進行異或操作,就得到原二進制數,最後將原二進制數恢復成文本文件。
相關拓展
加密,是以某種特殊的演算法改變原有的信息數據,使得未授權的用戶即使獲得了已加密的信息,但因不知解密的方法,仍然無法了解信息的內容。
加密之所以安全,絕非因不知道加密解密演算法方法,而是加密的密鑰是絕對的隱藏,流行的RSA和AES加密演算法都是完全公開的,一方取得已加密的數據,就算知道加密演算法也好,若沒有加密的密鑰,也不能打開被加密保護的信息。
單單隱蔽加密演算法以保護信息,在學界和業界已有相當討論,一般認為是不夠安全的。公開的加密演算法是給黑客和加密家長年累月攻擊測試,對比隱蔽的加密演算法要安全得多。
盡管加密或為了安全目的對信息解碼這個概念十分簡單,但在這里仍需對其進行解釋。數據加密的基本過程包括對稱為明文的原來可讀信息進行翻譯,譯成稱為密文或密碼的代碼形式。該過程的逆過程為解密,即將該編碼信息轉化為其原來的形式的過程。
以上內容參考 網路-加密
㈦ 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 編譯生成 pyc 僅僅為了提升載入速度,並不是為了防止破解,反編譯後和原來一模一樣。pyinstaller,py2exe,只是把 pyc 打個包,同樣很弱。代碼混淆也只能增加看懂代碼的難度,但並不能防止破解。所以最為穩妥的辦法只有修改Python解釋器,對源代碼進行加密,解釋器載入源代碼時再解密,這種方法雖然可以防止破解,但給自己帶來麻煩不說,發布程序是需要打包自己修改後的解釋器,相當麻煩。
㈩ python寫的程序怎樣加密
對Python加密時可能會有兩種形式,一種是對Python轉成的exe進行保護,另一種是直接對.py或者.pyc文件進行保護,下面將列舉兩種形式的保護流程。
1、對python轉exe加殼
下載最新版VirboxProtector加殼工具,使用加殼工具直接對demo.exe進行加殼操作
2、對.py/.pyc加密
第一步,使用加殼工具對python安裝目錄下的python.exe進行加殼,將python.exe拖入到加殼工具VirboxProtector中,配置後直接點擊加殼。
第二步,對.py/.pyc進行加密,使用DSProtector對.py/.pyc進行保護。
安全技術:
l虛擬機外殼:精銳5的外殼保護工具,創新性的引入了預分析和自動優化引擎,有效的解決了虛擬化保護代碼時的安全性和性能平衡問題。
l碎片代碼執行:利用自身成熟的外殼中的代碼提取技術,抽取大量、大段代碼,加密混淆後在安全環境中執行,最大程度上減少加密鎖底層技術和功能的依賴,同時大量大段地移植又保證了更高的安全性。
lVirbox加密編譯引擎:集編譯、混淆等安全功能於一身,由於在編譯階段介入,可優化空間是普遍虛擬化技術無法比擬的,對代碼、變數的混淆程度也有了根本的提升。
l反黑引擎:內置R0級核心態反黑引擎,基於黑客行為特徵 的(反黑資料庫)反制手段。精準打擊調試、注入、內存修改等黑客行為,由被動挨打到主動防護。
加密效果:
加密之前
以pyinstall 的打包方式為例,使用pyinstxtractor.py文件對log_322.exe進行反編譯,執行後會生成log_322.exe_extracted文件夾,文件夾內會生成pyc文件。
成功之後會在同目錄下生成一個文件夾