我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python3代码工程化加密

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python3代码工程化加密

这几天公司的Python3需要加密,网上的文章要么提供思路不提供代码,要么加密之后自己都没法用了。。没办法只能自己写了

文章整体思路

   1、修改python源码opcode为随机值

   修改下载后的Python源码包中opcode值(opcode可以理解为python读取代码的坐标,比如一个变量的opcode是5,则cpython读取这个变量时是从第5个字符串开始读的),修改后会导致关键变量的opcode混乱,除了自己的环境外,其他人都执行和解密不了了

   2、在修改好opcode的python环境,把所有py文件编译成pyc,然后删除原始py文件


修改opcode的脚本:
#!/usr/bin/env python2.7
# encoding:utf-8
#FileName scramble-opcodes.py
__author__ = 'mafei'
import argparse
import re
import random
import os
python_version = 'Python-3.5.3'
regex_for_opcode_h = r'^#define\s+(?P<name>[A-Z_]+)\s+(?P<code>\d+)(?P<extra>.*)'
regex_for_opcode_py = r'^(?P<key>[a-z_]+)+\(\'+(?P<name>[A-Z_]+)+\'+\,\s+(?P<code>\d+)(?P<extra>.*)'


try:
    from importlib.machinery import SourceFileLoader
except ImportError:
    import imp
    
    
class replace_opcode(object):
    
    def __init__(self):
        self.replace_dict = {}
        self.not_have_argument_code_list = []
        self.have_argument_code_list = []
    
    def set_list(self, reg, file):
        f1 = open(file, 'r+')
        infos = f1.readlines()
        f1.seek(0, 0)
        for line in infos:
            rex = re.compile(reg).match(line)
            if rex:
                if rex.group('name') in ['CALL_FUNCTION', 'CALL_FUNCTION_KW', 'CALL_FUNCTION_EX', 'CALL_FUNCTION_VAR',
                                         'CALL_FUNCTION_VAR_KW']:
                    continue
                elif int(rex.group('code')) < 90:
                    self.not_have_argument_code_list.append(int(rex.group('code')))
                else:
                    self.have_argument_code_list.append(int(rex.group('code')))
    
    def replace_file(self, reg, file, is_update=False):
        if not is_update:
            self.set_list(reg, file)
        f1 = open(file, 'r+')
        infos = f1.readlines()
        f1.seek(0, 0)
        for line in infos:
            rex = re.compile(reg).match(line)
            if rex:
                n = self.replace_code(rex, is_update)
                line = line.replace(rex.group('code'), str(n))
            f1.write(line)
        f1.close()
        
    def replace_code(self, rex, is_update):
        if is_update:
            try:
                n = self.replace_dict[rex.group('name')]
            except:
                n = rex.group('code')
            return n
        if rex.group('name') == "CALL_FUNCTION":
            n = int(rex.group('code'))
        elif rex.group('name') in ['CALL_FUNCTION_KW', 'CALL_FUNCTION_EX', 'CALL_FUNCTION_VAR',
                                   'CALL_FUNCTION_VAR_KW']:
            n = int(rex.group('code'))
        else:
            if int(rex.group('code')) < 90:
                n = random.choice(self.not_have_argument_code_list)
                self.not_have_argument_code_list.remove(n)
            else:
                n = random.choice(self.have_argument_code_list)
                self.have_argument_code_list.remove(n)
        self.replace_dict[rex.group('name')] = n
        return n
        
    def run(self, source_directory):
        OPCODE_PY = 'Lib/opcode.py'
        OPTARGETS_H = "Include/opcode.h"
        print source_directory
        print('start run......', os.path.join(source_directory, OPCODE_PY))
        self.replace_file(reg=regex_for_opcode_py, file=os.path.join(source_directory, OPCODE_PY))
        print('run {} end'.format(os.path.join(source_directory, OPCODE_PY)))
        print('start run......', os.path.join(source_directory, OPCODE_PY))
        self.replace_file(reg=regex_for_opcode_h, file=os.path.join(source_directory, OPTARGETS_H), is_update=True)
        print('run {} end'.format(os.path.join(source_directory, OPTARGETS_H)))
        self.write_opcode_targets_contents()
        print('run {} end'.format(os.path.join(source_directory, OPTARGETS_H)))
    
    def write_opcode_targets_contents(self, file='Python/opcode_targets.h'):
        """Write C code contents to the target file object.
        """
        targets = ['_unknown_opcode'] * 256
        for opname, op in sorted(self.replace_dict.items(), key=lambda nc: nc[1]):
            targets[op] = "TARGET_%s" % opname
        with open(os.path.join(source_directory, file), 'w') as f:
            f.write("static void *opcode_targets[256] = {\n")
            sep = ',%s' % os.linesep
            f.write(sep.join(["    &&%s" % s for s in targets]))
            f.write("\n};\n")
            
            
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Scramble python opcodes table')
    parser.add_argument('--python-source', dest='class="lazy" data-src', type=str,
                        help='Python source code', required=True)
    args = parser.parse_args()
    source_directory = os.path.abspath(args.class="lazy" data-src)
    # main(source_directory)
    replace_opcode_class = replace_opcode()
    replace_opcode_class.run(source_directory)
cd /opt/
下载源码包 wget 
解压   tar xJf Python-3.5.3.tar.xz

执行修改opcode操作

python scramble-opcodes.py --python-source=/opt/Python-3.5.3


#后面几步就是标准的python安装步骤啦

cd /opt/Python-3.5.3 

./configure --prefix=/opt/python-3.5.3 && make && make install

加入系统路径

export PATH=/opt/python-3.5.3/bin/:$PATH

这时候执行python3就可以进入python3.5.3的修改opcode后的环境了


加密Python代码(一定要在修改过opcode的Python环境执行,否则不生效的)


#!/usr/bin/env python2.7
# encoding:utf-8
__author__ = 'mafei'
import os
import subprocess
import argparse
import sys
def compile_py3(source_dir):
    g = os.walk(source_dir)
    # compileall.compile_dir(source_dir, maxlevels=100)
    subprocess.check_output('{} -m compileall -b {}'.format(sys.executable,source_dir),shell=True)
    for path,d,filelist in g:
        for filename in filelist:
            #对所有py文件进行加密并删除原始文件
            if os.path.splitext(filename)[-1] =='.py':
                os.remove(os.path.join(path, filename))
                print('compile {}'.format(os.path.join(path, filename)))
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Scramble python opcodes table')
    parser.add_argument('--python-source', dest='class="lazy" data-src', type=str,
                        help='Python source code', required=True)
    args = parser.parse_args()
    source_directory = os.path.abspath(args.class="lazy" data-src)
    compile_py3(source_directory)

转载自https://blog.51cto.com/mapengfei/1976189

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python3代码工程化加密

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python3代码工程化加密

这几天公司的Python3需要加密,网上的文章要么提供思路不提供代码,要么加密之后自己都没法用了。。没办法只能自己写了文章整体思路   1、修改python源码opcode为随机值   修改下载后的Python源码包中opcode值(opc
2023-01-31

Unity3D 代码加密保护工具

加密方式对于Unity3D的保护方式,主要是通过Virbox Protector Standalone对Unity3D程序的整个生成目录进行加密,可以保护Unity的主要代码逻辑不被反编译,最大程度保护软件开发商的合法权益,同时DSProt
2023-01-31

(Python3) 连加 连乘 代码

a=[1,2,3,4,5,6,7,8,9,10]#连加b=0for i in a:  b+=iprint(b) #连乘c=1for i in a:  c*=iprint(c)
2023-01-30

如何加密Lua代码

要加密Lua代码,可以使用Lua的加密工具或编码器来实现。以下是一些常见的方法:1. 使用luac:Lua提供了一个名为luac的编译器,可以将Lua代码编译为字节码文件,这样代码就无法直接阅读。使用命令`luac -o encrypted
2023-09-27

Python源代码保密、加密、混淆

有时候用Python开发一些功能但不希望用户得到源代码,就希望对Python代码加一些保密措施。目前可行的方案可能是将核心代码用cython编译成os文件。分析如下:生成方式看这里。Python作为脚本语言,基本上只要是能得到pyc或pyo
2023-01-31

android md5加密与rsa加解密实现代码

代码如下: import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgori
2022-06-06

怎么给python代码加密

要给Python代码加密,可以使用以下方法之一:1. 使用编译器或打包工具:将Python代码编译成字节码或将其打包成可执行文件。这样,代码将被转换为机器语言或二进制文件,使其难以被逆向工程或修改。常用的工具有Nuitka、PyInstal
2023-10-18

shiro编码和加密代码详解

涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。编码/解码 Shiro提供了base64和16进制字符串编码/解码的AP
2023-05-31

Java Base64 加密与解密示例代码

基本的加密尽量保持简单,加密输入字符串没有增加任何换行符。输出被映射到“A-Za-z0-9+/”字符集中,解密从该字符集中解析为任意字符,这篇文章主要介绍了Java Base64 加密与解密,需要的朋友可以参考下
2022-12-12

python实现希尔密码加密的示例代码

目录原理实现原理 希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。 每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。(注意用
2022-06-02

JavaScript 模块化密码学家:破解模块化编程的代码

JavaScript 模块化编程极大地增强了代码的可维护性和可重用性。本文深入探讨模块化编程的技术和最佳实践,提供实用示例,帮助您破解模块化编程代码的复杂性。
JavaScript 模块化密码学家:破解模块化编程的代码
2024-02-18

【Unity3D】存档文件加密代码

存档文件, 被修改起来现在变的很容易了, 为了解决这个问题,请用下面的代码,修改playerPrefs.cs1.替换fileReader = new StreamReader(fileName);serializedInput =Decry
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录