精华内容
下载资源
问答
  • jar包加密防止反编译

    2020-11-16 17:55:01
    Java加密Jar包和Class文件防止反编译的方法,此为防止反编译程序,亲测可用。如果大神有啥破解方法,希望能与楼主分享下,谢谢。
  • 本文更新地址 一、编译 1. 编译为 pyc 2. 编译为 pyo 或者 opt-n.pyc 文件 3. 编译成 pyd 或 so 链接库 编译方法一 编译方法二 ...1. pyc 、pyo 文件反编译 在线网站:https://tool.lu/pyc/ unco...

    本文更新地址

    一、编译

    提示:编译过程中所有文件路径最好不要出现中文

    1. 编译为 pyc

    说明

    • pyc 是由 py 文件经过编译后生成的二进制字节码(byte code)文件;

    • pyc 文件的加载速度比 py 文件快;

    • pyc 文件是一种跨平台的字节码,由 python 的虚拟机来执行;

    • pyc 文件的内容跟 python 版本相关,不同的 python 版本编译生成不同的 pyc 文件,只能在相同版本环境下执行;

    • .pyc 文件结构介绍参考:https://www.iteye.com/topic/382423https://yq.aliyun.com/articles/599833#
      .pyc 文件的前 8 个字节含义:

      - 四个字节的 magic number
      - 四个字节的 timestamp
      

      头四个是 magic number 很多 pyc 都在这个上面做文章,这修改成不合法的,然后你反编译就是败了,你可以找你自己编译成功的 pyc 头直接覆盖掉他的头 8 个字节就可以了, timestamp 是文件的修改时间,主要是当源码有改变的时候 python 就可以重新生成 pyc 文件.

    编译方法

    利用compileallpy_compile来预编译 python 代码:
    这两个从某种意义上是互通的,python 预装了这两个东西,

    python -m compileall test.py #把单个.py文件编译为字节码文件
    python -m compileall /path/src/ #批量生成字节码文件,/path/src/是包含.py文件名的路径
    
    python -m py_compile test.py #把单个.py文件编译为字节码文件
    python -m py_compile /path/src/ #批量生成字节码文件,仅将/path/src/的下一层.py文件编译,不会递归执行
    

    上面的 py_compile 针对文件夹是会有一些问题,但理论上这种语法应该是可以的。

    可根据项目需要写成编译脚本:

    • compileall

    对于 compileall 更详细的参数以及命令解析可以参考的链接:https://docs.python.org/3/library/compileall.html

    import compileall
    
    # compileall.compile_file编译单个文件;
    compileall.compile_file('main.py')
    
    #compile_dir 函数编译文件夹下的py文件
    compileall.compile_dir('Lib/', force=True)
    
    # 使用多处理器编译
    compileall.compile_dir('Lib/', workers=2)
    
    # Perform same compilation, excluding files in .svn directories.
    import re
    compileall.compile_dir('Lib/', rx=re.compile(r'[/\\][.]svn'), force=True)
    
    # pathlib.Path objects can also be used.
    import pathlib
    compileall.compile_dir(pathlib.Path('Lib/'), force=True)
    
    • py_compile

    函数原型:

    py_compile.compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=None):

    • file: 表示需要编译的 py 文件的路径
    • cfile: 表示编译后的 pyc 文件名称和路径,默认为直接在 file 文件名后加 c 或者 o,o 表示优化的字节码
    • dfile: 错误消息保存的路径,默认为源文件名
    • doraise: 如果为 True,编译发生错误时则会引发一个 PyCompileError; 如果为False, 编译文件出错时,则会有输出一个错误信息,而不会引发异常
    • optimize: 编译优化等级,可取-1, 0, 1, 2. 值-1 表示使用当前解释器的优化等级,就像命令行参数-O 的个数。
    import py_compile
    
    py_compile.compile(r'Downloads/md5.py')
    'Downloads/__pycache__/md5.cpython-37.pyc'
    

    使用

    与 py 文件一样使用,最好将文件名中间类似 cpython-36 的部分去掉,否则可能出现导包错误 ModuleNotFoundError:

    2. 编译为 pyo 或者 opt-n.pyc 文件

    说明

    源代码文件经过优化编译后生成的文件,无法用文本编辑器进行编辑
    Python3.5 之后,不再使用.pyo 文件名,而是使用类似“xxx.opt-n.pyc 的文件名;
    编译成 pyc 和 pyo 本质上和 py 没有太大区别,只是对于这个模块的加载速度提高了,并没有提高代码的执行速度。

    编译方法

    pyo 文件其实很简单,就是上面 pyc 命令的改版:

    python -O -m py_compile file.py
    python -O -m py_compile /path/src/
    python -O -m compileall file.py
    python -O -m compileall /path/src/
    
    或者
    python -OO -m py_compile file.py
    python -OO -m py_compile /path/src/
    python -OO -m compileall file.py
    python -OO -m compileall /path/src/
    

    运行

    与 py 文件一样运行、导入

    python sample.cpython-36.pyo
    
    from sample import *
    

    3. 编译成 pyd 或 so 链接库

    说明

    pyd 格式是 D 语言(C/C++综合进化版本)生成的二进制文件,是 python 的动态链接库;
    参考信息:https://docs.python.org/3/faq/windows.html?highlight=pyd#is-a-pyd-file-the-same-as-a-dll

    windows 编译环境鄙人用的 Visual Studio 2019

    编译方法一

    Cython

    利用 Cython 模块,根据编译环境不同生成不同文件。

    • 前提安装 Cython
    pip intall Cython
    
    • 编辑一个 setup.py 文件,写入以下代码并运行

    注意:程序所在的目录路径不能包含中文文字

    
    # 脚本文件
    from distutils.core import setup
    from Cython.Build import cythonize
    
    setup(
      name = 'Hello world app',
      ext_modules = cythonize("test.py"),
    )
    

    然后我们就退回到目录下运行命令,就会在 windows 上生成 pyd 文件,或者 linux 上生成 so 文件:

    python setup.py build_ext --inplace
    
    • build_ext 是指明 python 生成 C/C++的扩展模块(build C/C++ extensions
    • –inplace 的意思是在当前文件目录下生成.pyd 文件,不加这一句就会在 build 文件夹中生成

    最终生成如下文件:
    在这里插入图片描述
    其中,build 是生成过程使用到的临时文件。test.c 也是临时文件
    注:可能会出现“Unable to find vcvarsall.bat”错误
    在这里插入图片描述

    参考这里

    附:编译选定文件夹下所有 py 文件脚本

    import os
    import re
    import shutil
    from distutils.core import Extension, setup
    
    from Cython.Build import cythonize
    from Cython.Compiler import Options
    
    # __file__ 含有魔术变量的应当排除,Cython虽有个编译参数,但只能设置静态。
    exclude_so = ['__init__.py']
    sources = ['.']    # 选定文件夹
    
    extensions = []
    for source in sources:
        # 递归遍历文件夹(深度优先)
        for dirpath, foldernames, filenames in os.walk(source):
            # 删除pyc文件
            if '__pycache__' in foldernames:
                foldernames.remove('__pycache__')
                shutil.rmtree(os.path.join(dirpath, '__pycache__'))
            for filename in filter(lambda x: re.match(r'.*[.]py$', x), filenames):
                file_path = os.path.join(dirpath, filename)
                print(file_path, end='\t')
                if filename not in exclude_so:
                    temp = re.sub(r'[/\\]', '.', file_path[:-3]).strip('.')
                    print(temp)
                    extensions.append(
                        Extension(temp, [file_path], extra_compile_args=["-Os", "-g0"],
                                  extra_link_args=["-Wl,--strip-all"]))
    Options.docstrings = False
    compiler_directives = {'optimize.unpack_method_calls': False}
    setup(
        # cythonize的exclude全路径匹配,不灵活,不如在上一步排除。
        # language_level是python的主版本号
        ext_modules=cythonize(extensions, exclude=None, nthreads=20, quiet=True, build_dir='./build',
                              language_level=3, compiler_directives=compiler_directives))
    

    编译方法二

    安装 easycython

    这个最方便只要一行代码就可以搞定。
    https://github.com/cjrh/easycython

    pip install easycython
    

    这个模块也会自动安装依赖的 cython

    转换步骤

    将 .py 文件重命名为.pyx
    运行命令

    easycython *.pyx
    

    上面会将当前文件夹下所有的.pyx 文件生成为.pyd (Linux 下是.so)
    在这里插入图片描述
    html 文件可以查看 .py 文件与 .c 文件的转换对照关系。
    在这里插入图片描述

    编译方法三

    Nuitka:用户手册
    100%兼容标准 python2/python3,静态编译你的 python 程序
    鄙人还没来得及仔细研究。。。

    使用建议

    同样的,最好重命名 pyd 文件名,将中间的部分删除,前后部分不要动
    可以通过import test使用该文件
    在这里插入图片描述
    个人建议:将核心的代码编译为 pyd 或者 so 文件,然后再写一个简单的 main.py 去 import 调用这些链接库文件,达到隐藏核心代码的作用。

    另外,cython 在 jupyter notebook 里使用真的很刺激 😱😱
    在这里插入图片描述
    关于 cython 与 python 混合编程的使用可以参考:


    二、打包

    各种打包工具的对比如下(来自文章Freezing Your Code)

    SolutionWindowsLinuxOS XPython 3LicenseOne-file modeZipfile importEggspkg_resources support
    bbFreezeyesyesyesnoMITnoyesyesyes
    py2exeyesnonoyesMITyesyesnono
    pyInstalleryesyesyesnoGPLyesnoyesno
    cx_FreezeyesyesyesyesPSFnoyesyesno
    py2appnonoyesyesMITnoyesyesyes

    其中 pyInstallercx_Freeze 都是不错的,stackoverflow 上也有人建议用 cx_Freeze,说是更便捷些。pkg_resources 新版的 pyInstaller 貌似是支持的。

    1. PyInstaller

    说明

    官方 WIKI

    PyInstaller 的原理简介
    PyInstaller 其实就是把 python 解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行者的机器上不用安装 python 和你的脚本依赖的库。在 Linux 操作系统下,它主要用的 binutil 工具包里面的 ldd 和 objdump 命令。

    PyInstaller 输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括 Python 解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。

    使用方法

    1. 安装

      pip install pyinstaller
      
    2. PyInstaller 支持的常用选项

      • -h,–help 查看该模块的帮助信息

      • -F,-onefile 产生单个的可执行文件

      • -D,–onedir 产生一个目录(包含多个文件)作为可执行程序

      • -w,–windowed,–noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效)

      • -a,–ascii 不包含 Unicode 字符集支持

      • -d,–debug 产生 debug 版本的可执行文件

      • -c,–nowindowed,–console 指定使用命令行窗口运行程序(仅对 Windows 有效)

      • -o DIR,–out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件

      • -p DIR,–path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径

      • -n NAME,–name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

      了解 PyInstaller 选项的详细信息,可通过 pyinstaller -h 来查看。

    3. 基本用法:

      • 指定打包成单个可执行的 exe 文件
        pyinstaller -F test.py
      • 指定打包生成一个目录(包含多个文件)来作为程序
        pyinstaller -D test.py
      • 通过结合-w 参数不生成命令行界面 及 在代码中结合 tkiner 模块构建 来实现图形用户界面程序。

      当生成完成后,将会在此目录下看到多了一个 dist 目录,并在该目录下看到有一个 test.exe 文件

    2. 压缩成 pyz

    说明

    从 Python 3.5 开始,定义了.pyz 和.pyzw 分别作为“Python Zip 应用”和“Windows 下 Python Zip 应用”的扩展名。
    新增了内置 zipapp 模块来进行简单的管理,可以用 Zip 打包成 Python 程序解释器可直接执行.pyz 的文件。

    • 可以用解压缩软件直接打开,并查看源码,此方式没有任何加密作用, 甚至还降低了运行效率。

    • 不能将 python 解释器一起打包,所以不能单独发布、运行。可以通过 pip 的–target 参数将依赖包添加进去,并且打包时指定运行该 pyz 文件的解释器路径,然后在 linux 上(默认已经安装了 python) 赋予运行权限+x,就能直接运行,但是 Windows 下需要额外的 python.dll 链接文件才可。

    • 更多注意事项参考:zipapp — Manage executable python zip archives
      https://docs.python.org/3/library/zipapp.html
      详细内容请见 PEP441(https://www.python.org/dev/peps/pep-0441/)

    Python API:(参数说明见官方文档)

    zipapp.create_archive(source, target=None, interpreter=None, main=None, filter=None, compressed=False
    

    基本用法

    shell 基本用法:

    $ python -m zipapp source [options]
    
    • source 参数:
      代表要打包的 Python 源程序或目录,该参数既可以是单个的 Python 文件,也可以是文件夹。 如果是文件夹,那么 zipapp 模块会打包该文件夹中的所有 Python 文件。

    [options]参数选项:

    • -o , --output=<output>
      将输出写入名为 output 的文件。如果未指定此选项,则输出文件名将与输入源相同,并带有扩展名.pyz。如果给出了明确的文件名,则按原样使用(因此,如果需要,应包括.pyz 扩展名)。
      如果源是 .pyz 文件,则必须指定输出文件名(在这种情况下,输出不得与源文件相同)

    • -p <interpreter>, --python=<interpreter>

      在首行添加#!指定解释器 作为运行命令。另外,在 POSIX 上,使归档文件可执行。默认为不写#!首行,并且不使文件可执行。

    • -m <mainfn>, --main=<mainfn>
      指定的程序入口 “模块名:函数名” 需要用 双引号 括起来,单引号则报错。 如果不指定该选项,则默认从模块中的 __main__.py 文件开始执行。
      复制 pyz 时无法指定–main。

    • -c, --compress

      使用 deflate 方法压缩文件,以减小输出文件的大小。默认情况下,文件未压缩地存储在存档中。
      –compress 在复制档案时无效。

    New in version 3.7.

    • –info
      显示嵌入在归档文件中的解释器,以进行诊断。在这种情况下,任何其他选项都将被忽略,并且 SOURCE 必须是归档文件,而不是目录。

    • -h, --help
      Print a short usage message and exit.

    打包示例

    python -m zipapp app -m "app:main"
    

    即:指定将当前目录下的 app 子目录下的所有 Python 源文件打包成一个档案包,
    并通过-m 选项指定使用 app.py 模块中的 main 函数作为程序入口。
    如果不指定该-m 选项,则默认从模块中的 __main__.py 文件开始执行。

    用代码实现相同效果:

    import zipapp
    zipapp.create_archive('app', 'app.pyz', main='app:main')
    
    • 使应用程序直接在 POSIX 上可执行,指定要使用的解释器(效果如同在首行写入!# /usr/bin/python)。
    python -m zipapp myapp -p "/usr/bin/env python"
    
    • 修改现有 pyz 文件:
    import zipapp
    zipapp.create_archive('old_archive.pyz', 'new_archive.pyz', '/usr/bin/python3')
    
    • 其他用法
    
    import zipapp
    import io
    temp = io.BytesIO()
    zipapp.create_archive('myapp.pyz', temp, '/usr/bin/python2')
    with open('myapp.pyz', 'wb') as f:
        f.write(temp.getvalue())
    

    使用

    $ python3 app.pyz
    

    如果在打包时指定了解释器路径,就可以这样:

    sudo chmod +x app.pyz
    ./app.pyz
    

    三、反编译

    1. pyc 、pyo 文件反编译

    在线网站:https://tool.lu/pyc/

    (效果好像不太好)

    uncompyle6

    是 decompyle, uncompyle, and uncompyle2 的继承者,个人感觉效果不错。

    • https://github.com/rocky/python-uncompyle6

      • 安装
      pip install uncompyle6
      
      • 使用
        将 models.pyc 反编译成 py 文件
       uncompyle6 models.pyc > models.py
      

      递归将/usr/lib/python1.5 文件夹中所有的 .pyc 文件反编译并保存到/tmp

      uncompyle6 -r -o /tmp /usr/lib/python1.5
      

      反编译后的效果可以说很理想,如果你的代码格式符合 PEP8 规范的要求,那就基本和源来的文件一样,不过各种注释就没有了。

      查看更多用法:

      uncompyle6 --help

      
      Usage:
      uncompyle6 [OPTIONS]... [ FILE | DIR]...
      uncompyle6 [--help | -h | --V | --version]
      
      Examples:
      uncompyle6      foo.pyc bar.pyc       # decompile foo.pyc, bar.pyc to stdout
      uncompyle6 -o . foo.pyc bar.pyc       # decompile to ./foo.pyc_dis and ./bar.pyc_dis
      uncompyle6 -o /tmp /usr/lib/python1.5 # decompile whole library
      
      Options:
      -o <path>     output decompiled files to this path:
                      if multiple input files are decompiled, the common prefix
                      is stripped from these names and the remainder appended to
                      <path>
                      uncompyle6 -o /tmp bla/fasel.pyc bla/foo.pyc
                          -> /tmp/fasel.pyc_dis, /tmp/foo.pyc_dis
                      uncompyle6 -o /tmp bla/fasel.pyc bar/foo.pyc
                          -> /tmp/bla/fasel.pyc_dis, /tmp/bar/foo.pyc_dis
                      uncompyle6 -o /tmp /usr/lib/python1.5
                          -> /tmp/smtplib.pyc_dis ... /tmp/lib-tk/FixTk.pyc_dis
      --compile | -c <python-file>
                      attempts a decompilation after compiling <python-file>
      -d            print timestamps
      -p <integer>  use <integer> number of processes
      -r            recurse directories looking for .pyc and .pyo files
      --fragments   use fragments deparser
      --verify      compare generated source with input byte-code
      --verify-run  compile generated source, run it and check exit code
      --syntax-verify compile generated source
      --linemaps    generated line number correspondencies between byte-code
                      and generated source output
      --encoding  <encoding>
                      use <encoding> in generated source according to pep-0263
      --help        show this message
      
      Debugging Options:
      --asm     | -a        include byte-code       (disables --verify)
      --grammar | -g        show matching grammar
      --tree={before|after}
      -t {before|after}     include syntax before (or after) tree transformation
                              (disables --verify)
      --tree++ | -T         add template rules to --tree=before when possible
      
      Extensions of generated files:
      '.pyc_dis' '.pyo_dis'   successfully decompiled (and verified if --verify)
          + '_unverified'       successfully decompile but --verify failed
          + '_failed'           decompile failed (contact author for enhancement)
      

    其他 Python 反编译工具 uncompyle2, decompyle2, DePython, unpyc, uncompyle, pycdc

    Decompyle++
    A Python Byte-code Disassembler/Decompiler
    https://github.com/zrax/pycdc

    Easy Python Decompiler
    Easy Python Decompiler is python bytecode decompiler, decompiles pyc & pyo files.
    https://sourceforge.net/projects/easypythondecompiler/

    2. exe 反编译

    针对 pyinstaller 打包的程序破解:
    假如源程序生成过程如下:

    pyinstaller -F main.py
    

    生成了 main.exe
    工具:pyinstxtractor 下载连接

    还原步骤

    1)将 pyinstxtractor.py 和将要还原的 xxx.exe 文件放在同一个目录下;
    2)运行以下命令:

    python pyinstxtractor.py main.exe
    

    如果成功执行,将在同目录下生成新的反编译文件夹——main.exe_extracted

    3)接着使用 010 editor 或者 winhex 软件打开文件夹里面的两个文件,一个是没有任何后缀的主程序(此处是 main)文件和一个 struct 文件。

    4)将 struct 文件里的前 8 个字节(magic 和时间戳)复制到 main 文件里,如果使用的是 010 editor 软件,先在 main 文件开头插入 8 个空白字节,再从 struct 文件复制粘贴过来。

    5)参考上文反编译 pyc 过程将 main 文件反编译为 py 文件。


    四、混淆加密

    参考文章:

    1. 代码混淆

    如果代码被混淆到一定程度,连作者看着都费劲的话,是不是也能达到保护源码的目的呢?

    既然我们的目的是混淆,就是通过一系列的转换,让代码逐渐不让人那么容易明白,那就可以这样下手:

    • 移除注释和文档。没有这些说明,在一些关键逻辑上就没那么容易明白了。
    • 改变缩进。完美的缩进看着才舒服,如果缩进忽长忽短,看着也一定闹心。
    • 在 tokens 中间加入一定空格。这就和改变缩进的效果差不多。
    • 重命名函数、类、变量。命名直接影响了可读性,乱七八糟的名字可是阅读理解的一大障碍。
    • 在空白行插入无效代码。这就是障眼法,用无关代码来打乱阅读节奏。

    1.1 在线网站:http://pyob.oxyry.com/

    使用方法

    下拉菜单选择混淆方式,还有底部的选项,将代码填到左侧文本框,点击上方红色按钮,即可生成。
    在这里插入图片描述

    说明

    此方式仅仅是将变量替换为 O 、0 组合的字符串,让人难以直接阅读,但是代码结构以及导入的包名没变,将这些 0O 组合的变量名做简单替换,再通过 debug 等方式还是能了解代码的整体运行流程的。

    可以再配合其他加密方式,增加破解难度,哈哈。

    这个混淆算法也可以自己实现。QAQ

    1.2 Intensio-Obfuscator

    Intensio-Obfuscator 可以直接将 Python 源代码进行转换,并输出经过混淆处理后的 Python 代码。它会自动将变量名、类名以及函数名替换为随机字符,并定义长度,移除注释内容,自动换行,并给每一行代码增加随机脚本(所有的随机值都是不同的)。

    支持的 Python 文件代码版本为 v2.x 以及 v3.x 版本.

    Github 地址

    功能介绍

    • 替换:替换所有的变量名、类名以及函数名,移除所有的换行符
    • 填充:在每一行代码后添加随机脚本,并移除所有的换行符
    • 移除:移除代码中的全部注释以及换行
    • 低级混淆:生成 32 个字符的随机字符串,替换源代码中定义的变量名、类名以及函数名
    • 中级混淆:生成 64 个字符的随机字符串,替换源代码中定义的变量名、类名以及函数名
    • 高级混淆:生成 128 个字符的随机字符串,替换源代码中定义的变量名、类名以及函数名

    工具使用

    git clone https://github.com/Hnfull/Intensio-Obfuscator.git
    pip3 install -r Intensio-Obfuscator/requirements.txt
    cd Intensio-Obfuscator/intensio/
    
    python intensio_obfuscator.py --help
    
    参数描述
    -h, –help显示帮助菜单
    -f, –onefile指定一个代码文件
    -d, –multiplefiles指定多个代码文件(项目)
    -i, –input源文件或目录
    -c, –code输入文件或目录中使用的语言,默认值为[python]
    -o, –output混淆处理后的输出文件或目录
    -m, –mixer输出变量混淆的字符数量/长度,默认值为: [medium],可选项为: [lower, medium, high]
    -r, –replace激活“替换”混淆功能
    -p, –padding激活“填充”混淆功能
    -rm, –remove激活“移除”混淆功能

    工具使用样例

    python3.xintensio_obfuscator.py -d -i test/python/multiplefiles/basic/input/basicRAT -cpython -o test/python/multiplefiles/basic/output/basicRAT -m lower -r –rm

    python3.xintensio_obfuscator.py -d -i test/python/multiplefiles/advanced/input/basicRAT-c python -o test/python/multiplefiles/advanced/output/basicRAT -m high -r -p-rm

    1.3 pyminifier

    对代码压缩、混淆等
    Github
    官方文档

    1.4 Opy

    Github
    OPY - Obfuscator for Python, string obfuscation added

    1.5 pyobfuscate

    pyobfuscate 算是一个颇具年头的 Python 代码混淆库了,但却是“老当益壮”了。
    (一次只能混淆一个文件,好像只能用于 python 2)

    git clone https://github.com/astrand/pyobfuscate.git
    cd pyobfuscate/
    python setup.py install
    # 使用
    pyobfuscate example.py
    

    2.加密

    推荐阅读如何保护你的 Python 代码 —— 现有加密方案

    定制 python 解释器

    从源码下手:https://github.com/python/cpython/tree/3.6/Modules

    假定我们有一个算法,能够加密原始的 Python 代码,这些加密后代码随发行程序一起,可被任何人看到,却难以破解。另一方面,有一个定制好的 Python 解释器,它能够解密这些被加密的代码,然后解释执行。而由于 Python 解释器本身是二进制文件,人们也就无法从解释器中获取解密的关键数据。从而达到了保护源码的目的。

    要实现上述的设想,首先需要掌握基本的加解密算法,其次探究 Python 执行代码的方式从而了解在何处进行加解密,最后禁用字节码用以防止通过 .pyc 反编译。

    详细内容见:如何保护你的 Python 代码 —— 定制 Python 解释器

    修改 opcode

    其实还是定制 python 解释器,只不过相对简单一些。

    博客原文不方便转载,详细步骤见其他转载连接:https://blog.51cto.com/juispan/2065568

    博主是 3.5.3 版本的环境,本人在 3.7 环境下已经不能正常编译了,原程序应该需要改动,本人没做深入研究,到此只提供一种加密思路,如有成功的朋友还望告知此方法使用的注意事项。

    PyArmor

    加密原理
    Pyarmor 网站主页

    (收费版 266RMB)

    保护 Python 脚本的工具,能够加密 Python 脚本,保护运行时刻的 Python 代码不被泄露,设置加密脚本的有效期限,绑定加密脚本到硬盘、网卡等硬件设备。
    PyArmor 使用动态代码生成和交叉保护机制来保证加密脚本的安全性

    它的保障机制主要包括:

    • 加密编译后的代码块,保护模块中的字符串和常量
    • 在脚本运行时候动态加密和解密代码块的二进制代码
    • 代码块执行完成之后清空堆栈局部变量
    • 通过授权文件限制加密后脚本的有效期和设备环境

    参考文章:

    展开全文
  • .so文件反编译工具

    2017-11-03 16:19:55
    在参考apk开发应用程序时,经常遇到.so文件,工具中readelf.exe,经测试可有效反编译.so文件
  • 简单来说,pyc文件就是Python的字节码文件,我们都知道Python是一种全平台的解释性语言,全平台其实就是Python文件在经过解释器解释之后(或者称为编译)生成的pyc文件可以在多个平台下运行,这...

    引言

    因为python是作为一种动态语言,所以如果要将python代码进行加密其实是一件很难的事情。但听说2018年python官方还是公布了一些针对现有python代码比较好的加密方式,本篇对此作出一些简单的总结。

    打包成.pyc文件

    简单来说,pyc文件就是Python的字节码文件,我们都知道Python是一种全平台的解释性语言,全平台其实就是Python文件在经过解释器解释之后(或者称为编译)生成的pyc文件可以在多个平台下运行,这样同样也可以隐藏源代码。

    pyc文件只有在文件被当成模块导入时才会生成。也就是说,Python解释器认为,只有import进行的模块才需要被重用。 生成pyc文件的好处显而易见,当我们多次运行程序时,不需要重新对该模块进行重新的解释。另外其实当我们运行程序的时候就自动生成了pyc文件,下面就来详细介绍。

    当我们之前有启动项目成功时,python自动就会创建在每一级有调用到文件的目录一个叫_pycache_的文件夹当成缓存,那么之后启动的速度会极大的提升。
    在这里插入图片描述
    但自动生成的缓存文件夹中,我们需要运用Linux命令 mv * ../ 将编译的pyc文件弄到上一级,然后用rename批量改名,并且每一个文件目录都需要运行相同的命令,这样感觉太过于麻烦,所以这里就需要引入其它方法了。


    利用compileall和py_compile来预编译python代码:

    这两个从某种意义上是互通的,一般anaconda预装了这两个东西,原装python的话不太清楚,所以我们可以直接用,语法格式为:

    python -m py_compile file.py #把单个.py文件编译为字节码文件
    python -m py_compile /path/to/src/ #批量生成字节码文件,/path/to/src/是包含.py文件名的路径
    python -m compileall file.py #把单个.py文件编译为字节码文件
    python -m compileall /path/to/src/ #批量生成字节码文件,/path/to/src/是包含.py文件名的路径
    

    上面的py_compile针对文件夹是会有一些问题,但理论上这种语法应该是可以的。我们用compileall对一个还未运行过的项目进行compile,当跑完程序后,会在所有可以运行的文件下自动生成编译pyc文件:
    在这里插入图片描述
    但Windows比较坑的是,当我在上面运行完命令后,发现在我项目文件夹下多了一个_pycache_文件夹,这就和上面的一样了,然后我回到Linux服务器跑,则不会出现这种问题。所以建议最好在Linux环境下编译,Windows感觉有点莫名其妙,我猜它是直接去把代码运行了一遍,提前生成了pyc文件,目录格式为:

              |---test.py
    
              |---test2.py
    
              |---test3.py
    
              |---__pycache__
    
                        |----test.cpython-36.pyc
    
                        |----test2.cpython-36.pyc
    
                        |----test3.cpython-36.pyc
    

    然后我们还可以写成一个脚本对项目文件进行编译加密:

    # 批量编译py文件
    import compileall
    compileall.compile_dir("/usr/to/src")
    
    sudo find /usr/to/src -name "*.py" | xargs rm -rf	# 删除该目录下所有的py文件
    

    对于compileall更详细的参数以及命令解析可以看下面的链接:https://docs.python.org/3/library/compileall.html

    编译成pyd文件或pyo文件

    与上面的编译类似,我们可以写一个脚本文件,然后对某一个文件进行编译,但在此之前,我们需要先下载Cpython模块,步骤为:

    # 前提
    pip intall Cpython
    
    # 脚本文件
    from distutils.core import setup
    from Cython.Build import cythonize
     
    setup(
      name = 'Hello world app',
      ext_modules = cythonize("test.py"),
    )
    

    然后我们就退回到目录下运行命令就会生成pyd文件:

    python setup.py build_ext --inplace
    

    另外这个是基于Windows环境下编译成pyd文件,如果是linux,那么就是so文件了。

    而pyo文件其实更简单,就是上面pyc命令的改版:

    python -O -m py_compile file.py
    python -O -m py_compile /path/to/src/
    python -O -m compileall file.py
    python -O -m compileall /path/to/src/
    
    或者
    python -OO -m py_compile file.py
    python -OO -m py_compile /path/to/src/
    python -OO -m compileall file.py
    python -OO -m compileall /path/to/src/
    

    在这里插入图片描述


    pyc文件反编译

    这里可以推荐一个在线网站:https://tool.lu/pyc/ ,当我们提交一个pyc文件时,它会自动反编译出一个py文件出来:
    在这里插入图片描述
    当然,不太清楚这个网站到底是怎样进行反编译的,不过确实有效,另外就是另一个python的包了:uncompyle

    我们可以pip安装:

    pip install uncompyle
    

    安装成功后help一下,如果有下述命令与信息那么就表明安装成功。

    Usage:
      uncompyle6 [OPTIONS]... [ FILE | DIR]...
      uncompyle6 [--help | -h | --V | --version]
    
    Examples:
      uncompyle6      foo.pyc bar.pyc       # decompile foo.pyc, bar.pyc to stdout
      uncompyle6 -o . foo.pyc bar.pyc       # decompile to ./foo.pyc_dis and ./bar.pyc_dis
      uncompyle6 -o /tmp /usr/lib/python1.5 # decompile whole library
    
    Options:
      -o <path>     output decompiled files to this path:
                    if multiple input files are decompiled, the common prefix
                    is stripped from these names and the remainder appended to
                    <path>
                      uncompyle6 -o /tmp bla/fasel.pyc bla/foo.pyc
                        -> /tmp/fasel.pyc_dis, /tmp/foo.pyc_dis
                      uncompyle6 -o /tmp bla/fasel.pyc bar/foo.pyc
                        -> /tmp/bla/fasel.pyc_dis, /tmp/bar/foo.pyc_dis
                      uncompyle6 -o /tmp /usr/lib/python1.5
                        -> /tmp/smtplib.pyc_dis ... /tmp/lib-tk/FixTk.pyc_dis
      --compile | -c <python-file>
                    attempts a decompilation after compiling <python-file>
      -d            print timestamps
      -p <integer>  use <integer> number of processes
      -r            recurse directories looking for .pyc and .pyo files
      --fragments   use fragments deparser
      --verify      compare generated source with input byte-code
      --verify-run  compile generated source, run it and check exit code
      --weak-verify compile generated source
      --linemaps    generated line number correspondencies between byte-code
                    and generated source output
      --encoding  <encoding>
                    use <encoding> in generated source according to pep-0263
      --help        show this message
    
    Debugging Options:
      --asm     | -a  include byte-code       (disables --verify)
      --grammar | -g  show matching grammar
      --tree    | -t  include syntax tree     (disables --verify)
      --tree++        add template rules to --tree when possible
    
    Extensions of generated files:
      '.pyc_dis' '.pyo_dis'   successfully decompiled (and verified if --verify)
        + '_unverified'       successfully decompile but --verify failed
        + '_failed'           decompile failed (contact author for enhancement)
    
    

    安装好后的可执行文件名叫uncompyle6,根据上面的提示,我们需要输入uncompyle6 models.pyc > models.py将models.pyc反编译成py文件
    uncompile -o . *.pyc将当前文件夹中所有的pyc文件反编译成后缀名为.pyc_dis的源文件
    反编译后的效果可以说很理想,如果你的代码格式符合PEP8规范的要求,那就基本和源来的文件一样,不过各种注释就没有了。
    最后改的代码还没有运行(没有生成pyc)的,就真的丢了,不过不多,再写一遍吧!

    反编译库总结与说明

    其实不仅仅只有这一种反编译的uncompyle,还有很多比如说uncompyle2, decompyle2, DePython, unpyc, uncompyle, pycdc,我们都可以进行相关的破解,它们相对应的pyo、pyd文件的破解形式,我们还可以对这些进行二次加密,这里限于篇幅与使用情况,我就不一一叙述了。


    在线网站进行加密

    网上加密是有很多地方的,不同于转成pyc的二进制加密,这种多了一些模糊层,比如说下面这个网站,注释基本也看不出端倪,如果文件不多的话可以看看。
    在这里插入图片描述
    这种看起来是二进制的加密方式,但我将一个文件在这个网站编译后,再用上面的uncompile,发现并没有什么太大的作用,但这样我就不知道是基于什么情况进行的加密的,破解难度会稍微大一点。

    python解释器加密

    这里是看到知乎的一篇文章提到了改变python编译器的方式,因为主流是Cpython,所以可以针对某些地方进行修改,达到代码在运行的同时就达到了加密的效果,并且这里用的是RSA加密,算是目前最流行也是比较难破解的几种加密方式之一。

    在这里插入图片描述
    在这里插入图片描述
    上述两图的详细地址为如何保护你的 Python 代码 (二)—— 定制 Python 解释器

    总结

    这篇文章写得有点艰辛,可能整体的流程安排有些乱,主要是最近感冒影响了博文进度,导致中途断断续续,不过自己正在恢复,另外,可能里面还有些小错误,后期会修改,希望看完本篇博文或多或少有所收获。



    参考与推荐:

    1. http://pyob.oxyry.com/
    2. https://tool.lu/pyc/
    3. windows 下Python3.x生成pyd文件(python加密)
    4. python py、pyc、pyo、pyd文件区别
    展开全文
  • 反编译,混淆加密代码教程

    千次阅读 2016-09-05 16:06:25
    计算机软件反向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序...反编译作为自己开发软件时的参考,或者直接用于自己的软件产品中---------------好了 下面我把自己研究的反编译

    计算机软件反向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。反编译作为自己开发软件时的参考,或者直接用于自己的软件产品中---------------好了 下面我把自己研究的反编译的过程给大家分享一下,不喜勿喷~~~

    我们要用到一个反编译软件  这里有网址 大家可以下载http://www.dayanzai.me/android-hack.html


    我在这里就自己模拟创建一个项目,放三个类A,B,C

     

    然后打包APK   步骤不多说,大家应该都了解  注意打包的过程中会用到keystore

    打包完之后  找到自己保存到相关地方的APK,我这里是放到了一个文件夹里  ,然后把APK的后缀改成zip然后解压  会得到这些东西



    这时候就可以打开你下载好的反编译软件进行反编译了


    看这里有好多选项     选择你的dex文件直接拖过来就可以反编译了  这时候你看到的代码  应该是看不懂了



    这就是java文件的反编译   但是我们看到这里

    为什么只有两个类  

    因为我在proguard-project.txt中加了一句:      -keep class com.example.zcx.A

    因为我们反编译的代码默认只保留一个activity的入口,所以这里我保留了一个A类 。你想保留更多的类  可以继续keep。


    下面我们讲一下代码的加密,其实很简单;;;;;

    打开你项目的/project.properties添加一句:proguard.config=proguard-project.txt

    就可以搞定了,你要重新打包一下APK,重新反编译,我把加密和不加密的给你们对比一下

       不加密的:                                                                          


    加密的:


     你们可以看加密的比不加密的少很多文件   这里是看不到的,这就是代码的混淆,也叫加密

    写的不好的地方大家可以批评指正!










    展开全文
  • 反编译完全版EX4-MQL 4.0.509.5,可反编译加密程序,非常好用
  • java class加密防止反编译v2.0

    热门讨论 2011-03-10 21:24:45
    本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全...
  • 用此工具反混淆后 然后用reflector软件反编译下就能还原任何经过混淆后的代码 百度下reflector网上有下载
  • Java类文件很容易被反编译,需要经过特殊的加密处理才能保护代码不被反编译破解 我们都知道Java类文件很容易被反编译,即使进行了混淆处理,仍然容易被反编译破解,因此用Java开发的项目和程序在代码保护方面基本...
  • 注意: 1. 一定要先阅读文档再...3. 包里已经包含大部分依赖项,只需要按照README 文件指引执行即可 NodeJS下载地址:https://nodejs.org/en/ 参考文档: https://blog.csdn.net/qq_40126542/article/details/80285802 ...
  • 主要介绍了PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 威纶触摸屏XOB反编译解密 适合EB8000所有型号的XOB反编译, 禁止反编译反编译密码错误
  • 1.本地数据加密 对NSUserDefaults,sqlite存储文件数据... // 获取需要加密文件的二进制数据 NSData *data = [NSData dataWithContentsOfFile:@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"]; // 或 base...

    1.本地数据加密

    对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息

    将文件进行加密

        // 获取需要加密文件的二进制数据
        NSData *data = [NSData dataWithContentsOfFile:@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"];
        
        // 或 base64EncodedStringWithOptions
        NSData *base64Data = [data base64EncodedDataWithOptions:0];
        
        // 将加密后的文件存储到桌面
        [base64Data writeToFile:@"/Users/wangpengfei/Desktop/123" atomically:YES];
        
    

    将文件进行解密

        // 获得加密后的二进制数据
        NSData *base64Data = [NSData dataWithContentsOfFile:@"/Users/wangpengfei/Desktop/123"];
        
        // 解密 base64 数据
        NSData *baseData = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];
        
        // 写入桌面
        [baseData writeToFile:@"/Users/wangpengfei/Desktop/IMG_5551.jpg" atomically:YES];
        
    

    2.URL编码加密

    对程序中出现的URL进行编码加密,防止URL被静态分析

    2.1 ARC模式下

    编码

    + (NSString *)encodeToPercentEscapeString: (NSString *) input
    
    {
        
        NSString *outputStr =
        
        (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                     
                                                                     NULL, /* allocator */
                                                                     
                                                                     (__bridge CFStringRef)input,
                                                                     
                                                                     NULL, /* charactersToLeaveUnescaped */
                                                                     
                                                                     (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                     
                                                                     kCFStringEncodingUTF8);
        
        return outputStr;
        
    }
    

    解码

    + (NSString *)decodeFromPercentEscapeString: (NSString *) input
    
    {
        
        NSMutableString *outputStr = [NSMutableString stringWithString:input];
        
        [outputStr replaceOccurrencesOfString:@"+"
         
                                   withString:@""
         
                                      options:NSLiteralSearch
         
                                        range:NSMakeRange(0,[outputStr length])];
        
        return
        
        [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        
    }
    

    2.1 非ARC模式下

    编码

    + (NSString *)encodeToPercentEscapeString: (NSString *) input {    // Encode all the reserved characters, per RFC 3986    // ()
        
        NSString *outputStr = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)input,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                  
                                                                                  kCFStringEncodingUTF8);
        
        return outputStr;
        
    }
    

    解码

    + (NSString *)decodeFromPercentEscapeString: (NSString *) input {
        
        NSMutableString *outputStr = [NSMutableString stringWithString:input];
        
        [outputStr replaceOccurrencesOfString:@"+"
         
                                   withString:@" "
         
                                      options:NSLiteralSearch
         
                                        range:NSMakeRange(0, [outputStr length])];
        
        return [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        
    }
    

    3.网络传输数据加密

    对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取数据, 使用MD5加密。
    把一个任意长度的字节串变换成一定长度的十六进制的大整数。

    注意,字符串的转换过程是不可逆的,不能通过加密结果,反向推导出原始内容。

    3.1 MD5特点

    • 压缩性 : 任意长度的数据,算出的 MD5 值长度都是固定的。
    • 容易计算 : 从原数据计算出 MD5 值很容易。
    • 抗修改性 : 对原数据进行任何改动,哪怕只修改一个字节,所得到的 MD5 值都有很大区别。
    • 弱抗碰撞 : 已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难的。
    • 强抗碰撞: 想找到两个不同数据,使他们具有相同的 MD5 值,是非常困难的

    3.2 MD5应用

    • 一致性验证:MD5将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的MD5信息摘要。
      就像每个人都有自己独一无二的指纹,MD5对任何文件产生一个独一无二的数字指纹。
      利用 MD5 来进行文件校验,被大量应用在软件下载站,论坛数据库,系统文件安全等方面(是否认为添加木马,篡改文件内容等).百度‘MD5’第一个网站进去,利用数据库伪解密,即反查询。
    • 数字签名
    • 安全访问认证

    3.3 MD5使用

    需要导入第三方框架: NSString+Hash

    • 利用 MD5 对字符串进行加密
      NSString *password = @"WangPengfei";
      password = [password md5String];
      NSLog(@"password1:%@", password);
    
    • 加盐:可以保证 MD5加密之后更加安全
       NSString *salt = @"234567890-!@#$%^&*()_+QWERTYUIOP{ASDFGHJKL:XCVBNM<>";
       [password stringByAppendingString:salt];
       password = [password md5String];
       NSLog(@"password2:%@", password);
    

    每一个公司都有自己的“盐值”,盐值越复杂,越安全

    4.方法体,方法名高级混淆

    对应用程序的方法名和方法体进行混淆,保证源码被逆向后无法解析代码。
    使用hopper disassembler 反编译iPA之后不能得到相应的方法调用信息。

    4.1 创建shell脚本:

    TABLENAME=symbols
    SYMBOL_DB_FILE="symbols"
    STRING_SYMBOL_FILE="fun.list"
    HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
    export LC_CTYPE=C
    
    createTable(){
        echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
    }
    
    insertValue(){
        echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3  $SYMBOL_DB_FILE
    }
    
    query(){
        echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
    }
    
    ramdomString(){
        openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
    }
    
    rm -f $SYMBOL_DB_FILE
    rm -f $HEAD_FILE
    createTable
    
    touch $HEAD_FILE
    echo '#ifndef Demo_codeObfuscation_h
    #define Demo_codeObfuscation_h' >> $HEAD_FILE
    echo "//confuse string at `date`" >> $HEAD_FILE
    cat "$STRING_SYMBOL_FILE" | while read -ra line; do
    if [[ ! -z "$line" ]]; then
    ramdom=`ramdomString`
    echo $line $ramdom
    insertValue $line $ramdom
    echo "#define $line $ramdom" >> $HEAD_FILE
    fi
    done
    echo "#endif" >> $HEAD_FILE
    sqlite3 $SYMBOL_DB_FILE .dump
    

    4.2 声明要替换的方法名列表

    //在上边脚本中提到了 STRING_SYMBOL_FILE="fun.list",意思就是运行脚本的时候会到这个文件去读取需要替换的方法名,重新写入符号表中。
    nameAction
    refreshAction
    

    4.3 生成对应的转义之后的无序字符串

    5.程序结构混排加密

    对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低

    6.借助第三方APP加固

    例如:网易云易盾

    关注 【网罗开发】微信公众号,网罗天下方法,方便你我开发,更多iOS技术干货等待领取,所有文档会持续更新,欢迎关注一起成长!

    希望可以帮助大家,如有问题可加QQ群: 668562416 交流

    如果哪里有什么不对或者不足的地方,还望读者多多提意见或建议

    如需转载请联系我,经过授权方可转载,谢谢

    展开全文
  • .calss文件反编译工具

    2018-09-26 14:03:28
    用于.calss文件反编译,适合开发人用进行使用,解压即可使用
  • 今天小编就为大家分享一篇Cython编译python为so 代码加密示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • dll加密/反编译工具(官方原版+破解补丁)
  • > jar包中的class经过简单加密,需要反编译出源码,求大神指教,能直接帮忙解析出来更好。附上jar文件,链接:https://pan.baidu.com/s/11gTyyQ0s2yCAWHqz5EAFyw 提取码:l985;![图片说明]...
  • PHP反编译,可以将威盾加密的PHP源文件反编译
  • 中间语言很容易被反编译,所以研究下如何有效的保护dll文件。 我大致的方法为 :强签名+混淆+加密。强签名 强命名程序集,可以确保你的程序集唯一,而不被篡改、冒用等;即使相同名字的程序集如果签名也会不同。强...
  • LUAC 脚本加密 , 用于LUAC 脚本反编译,有用得同学可以下载,
  • dnSpy反编译工具,查看DLL源码,简单实用 dnSpy反编译工具,查看DLL源码,简单实用
  • 新版本的apktool反编译时会将assets目录下的dex也反编译(移动安全联盟的SDK中,assets目录下就有dex文件),通过修改源码解决了此问题
  • Android反编译加密(代码混淆)

    千次阅读 多人点赞 2019-02-16 09:50:03
    #反编译 win系统好久不用了而且win系统下的反编译工具和教程一大堆,这里讲讲Mac下反编译工具。 目前,mac下有两款工具不错,分别是Jadx和AndroidDecompiler 这里介绍一下Jadx: Jadx下载地址: ...
  • 解决Lua文件反编译后汉字乱码问题。开发环境vs2013,语言c#
  • 使用手册一、准备好源程序(.class文件)1. 把程序发布到某个目录下,比如tomcat的webapps目录下。 二、注意事项2....4. 加密文件最好不超过200个,否则系统运行可能出现问题。5. 不支持spring,请将涉及...
  • 这两个软件,是用来【加密】和【反编译】 EXE 和 DLL 文件的。 注意: 1、加密,其实是混淆。(混淆之后,反编译就看不见源码了,而是看见一堆乱码,而且 DLL 还是能正常使用的。 2、编程语言,是 .NET(C#),别搞...
  • Jar包加密,防止反编译

    千次阅读 2020-08-20 14:59:00
    Jar包加密,防止反编译方法XJar加密工具XJar功能特性使用方法(手动执行方式)使用方法(Maven插件方式)exe4j加密工具使用方法jvmti加密工具使用方法参考 XJar加密工具 XJar功能特性 基于对JAR包内资源的加密以及...
  • 众所周知,Java编译后的Jar包和Class文件,可以轻而易举的使用反编译工具(如JD-GUI)进行反编译,拿到源码。为了保护自己发布的Jar包和Class文件,采用的方式大多是混淆或加密(混淆工具如ProGuard),本文介绍的是...
  • 只要反编译他们,就很容易把一些api调用去掉,这样硬件加密锁也就不起作用了,但是现在到底有没有好的办法呢? 市场上现有的几款防止反编译工具其实都是改进了加载过程。但是加载到JAVA虚拟机后一样可以得到CLASS...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,512
精华内容 18,604
关键字:

反编译加密文件