1. 程式人生 > >Python版程式碼混淆工具

Python版程式碼混淆工具

寫在前面:

    程式碼混淆,其實很簡單。原理就是查詢、替換而已。市面上有很多混淆工具,最好是在混淆工具的基礎上,自己再寫一下,二次混淆。演算法也不難。如果需要全域性混淆,以及自動混淆,那麼就複雜一些了,需要再加上詞法分析和語法分析。

如何使用:

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 !"