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


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值