Python 3コードエンジニアリング暗号化

4290 ワード

ここ数日、会社のPython 3は暗号化が必要で、ネット上の文章は構想を提供してコードを提供しないか、暗号化してから自分では使えません.仕方なく自分で書くしかない
文章全体の構想.
1、pythonソースコードopcodeをランダム値に変更する
ダウンロードしたPythonソースパッケージのopcode値を変更します(opcodeはpythonがコードを読み取る座標と理解できます.例えば、1つの変数の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[A-Z_]+)\s+(?P\d+)(?P.*)'
regex_for_opcode_py = r'^(?P[a-z_]+)+\(\'+(?P[A-Z_]+)+\'+\,\s+(?P\d+)(?P.*)'


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'))  
  
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='src', type=str,
                        help='Python source code', required=True)
    args = parser.parse_args()
    source_directory = os.path.abspath(args.src)
    compile_py3(source_directory)

https://blog.51cto.com/mapengfei/1976189