Python版程式碼混淆工具
阿新 • • 發佈:2019-02-20
寫在前面:
程式碼混淆,其實很簡單。原理就是查詢、替換而已。市面上有很多混淆工具,最好是在混淆工具的基礎上,自己再寫一下,二次混淆。演算法也不難。如果需要全域性混淆,以及自動混淆,那麼就複雜一些了,需要再加上詞法分析和語法分析。
如何使用:
1,首先得安裝Python。
2,把這個下面這個 confuse.py 檔案,複製目標資料夾。
3,更改 raw_name_list 列表裡的字串。改成你想混淆的變數名或者類名方法名。
4,執行python confuse.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 !"