精华内容
下载资源
问答
  • Python3 如何反编译EXE

    2021-05-21 09:36:42
    所以今天在网上看到有相关牛人,github开源写了一个反编译代码程序,可以将Windows EXE文件反编译处pyc文件,最终再将pyc文件转换成可以编译查看的py文件,觉得比较牛,今天测试一下,看看效果如何,已经整个操作...

    1. 需求分析


    只支持通过py2exe和pyinstaller 工具编译生成的EXE文件

    公司内部使用Python编写的代码,最终需要在发布前编译成windows执行的.EXE文件,所以今天在网上看到有相关牛人,github开源写了一个反编译代码程序,可以将Windows EXE文件反编译处pyc文件,最终再将pyc文件转换成可以编译查看的py文件,觉得比较牛,今天测试一下,看看效果如何,已经整个操作步骤是怎样的,做一个留存。

    2. 环境描述


    两个测试使用环境来完成反编译:

    本地主测试是Mac,Python版本3.7.5

    一台Windows10,主要用来安装16进制编译器,方便我们来可视化分析,目前这个16进制编译器010Editor 只能安装到windows系统下,所以使用了windows10系统,主要的作用是在这。

    3. 步骤分解


    主要的步骤分为以下几个步骤来完成整个反编译过程。

    这里再确认下我们的最终需求,将EXE可执行文件反编译成最终可视、可编辑的py结尾的Python代码文件

    有了目标之后,那我们整理具体的操作步骤,并进行细化分解

    1. 获取可执行的EXE文件
    2. 下载反编译程序包
    3. 分析EXE可执行文件的打包工具(是否为py2exe和pyinstaller)
    4. 执行解包操作
    5. 执行反编译操作

    4. 操作步骤


    4.1. 获取可执行EXE文件

    我这里准备的EXE可执行文件是通过pyinstaller打包工具完成的编译,软件包名称如下:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpHrmUXN-1621560980688)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/90e57e05-4cc6-4e6a-95ba-f13648e54353/Untitled.png)]

    4.2. 下载反编译程序包

    github下载连接地址:

    countercept/python-exe-unpacker

    # git clone https://github.com/countercept/python-exe-unpacker.git
    (venv_3.7.5)  CarltonXu@CarltonXus-MacBook-Pro # cd python-exe-unpacker
    (venv_3.7.5)  CarltonXu@CarltonXus-MacBook-Pro # ls -tlr
    total 160
    -rw-r--r--  1 CarltonXu  wheel  35096 Apr  7 20:41 LICENSE
    -rw-r--r--  1 CarltonXu  wheel   4110 Apr  7 20:41 README.md
    -rw-r--r--  1 CarltonXu  wheel  12392 Apr  7 20:41 pyinstxtractor.py
    -rw-r--r--  1 CarltonXu  wheel  15377 Apr  7 20:41 python_exe_unpack.py
    -rw-r--r--  1 CarltonXu  wheel     97 Apr  7 20:41 requirements.txt
    drwxr-xr-x  3 CarltonXu  wheel     96 Apr  7 20:42 __pycache__
    

    4.2.1. 安装依赖包

    在代码下载后,需要安装运行代码所需要的依赖包,执行下面指令即可完成安装

    (venv_3.7.5)  CarltonXu@CarltonXus-MacBook-Pro # sudo pip3 install -r requirements.txt
    Password:
    WARNING: The directory '/Users/CarltonXu/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
    Looking in indexes: http://pypi.douban.com/simple/
    Requirement already satisfied: pefile==2017.9.3 in /Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages (from -r requirements.txt (line 1)) (2017.9.3)
    Requirement already satisfied: unpy2exe==0.3 in /Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages (from -r requirements.txt (line 2)) (0.3)
    Collecting uncompyle6==2.11.5
      Downloading http://pypi.doubanio.com/packages/35/a5/f0b734adba414239e144007904207b2fa2ce3ac0b4c87f4a7b0edcf74c0b/uncompyle6-2.11.5.tar.gz (1.4 MB)
         |████████████████████████████████| 1.4 MB 2.2 MB/s
    Requirement already satisfied: xdis==3.5.5 in /Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages (from -r requirements.txt (line 4)) (3.5.5)
    Requirement already satisfied: pycrypto==2.6.1 in /Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages (from -r requirements.txt (line 5)) (2.6.1)
    Requirement already satisfied: configparser==3.5.0 in /Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages (from -r requirements.txt (line 6)) (3.5.0)
    Requirement already satisfied: future in /Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages (from pefile==2017.9.3->-r requirements.txt (line 1)) (0.18.2)
    Collecting spark-parser<1.7.0,>=1.6.1
      Downloading http://pypi.doubanio.com/packages/f3/4e/a95a1ff543744bfaa33449b301fe74272556db2e852c5c3852517a5024be/spark_parser-1.6.1-py3-none-any.whl (17 kB)
    Requirement already satisfied: six in /Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages (from uncompyle6==2.11.5->-r requirements.txt (line 3)) (1.13.0)
    Collecting argparse
      Downloading http://pypi.doubanio.com/packages/f2/94/3af39d34be01a24a6e65433d19e107099374224905f1e0cc6bbe1fd22a2f/argparse-1.4.0-py2.py3-none-any.whl (23 kB)
    Requirement already satisfied: click in /Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages (from spark-parser<1.7.0,>=1.6.1->uncompyle6==2.11.5->-r requirements.txt (line 3)) (7.0)
    Using legacy 'setup.py install' for uncompyle6, since package 'wheel' is not installed.
    Installing collected packages: spark-parser, argparse, uncompyle6
      Attempting uninstall: spark-parser
        Found existing installation: spark-parser 1.8.9
        Uninstalling spark-parser-1.8.9:
          Successfully uninstalled spark-parser-1.8.9
      Attempting uninstall: uncompyle6
        Found existing installation: uncompyle6 3.7.4
        Uninstalling uncompyle6-3.7.4:
          Successfully uninstalled uncompyle6-3.7.4
        Running setup.py install for uncompyle6 ... done
    Successfully installed argparse-1.4.0 spark-parser-1.6.1 uncompyle6-2.11.5
    

    4.3. 分析EXE文件属性

    这里分析EXE文件属性其实就是看EXE是否为py2exe及pyinstaller工具打包出来的,其实这个动作在执行解包动作的时候会进行precheck动作,如果检测失败会终止并提示,我们看下代码里面怎么做检测的。

    文件路径:python-exe-unpacker/pyinstxtractor.py
    在这里插入图片描述
    检测的逻辑,如果是通过pyinstaller打包的,会在EXE文件的添加一个Magic number,这个Magic number就是 b"MEI\014\013\012\013\016" 划算成16进制就是 “4d45490c0b0a0b0e”

    # 转换成16进制
    In [30]: MAGIC = b'MEI\014\013\012\013\016'
    
    In [31]: MAGIC.encode('hex')
    Out[31]: '4d45490c0b0a0b0e'
    
    检测公式:(文件大小 - PYINSTALL COOKIE SIZE)字节之后的 8个字节 是否为b"MEI\014\013\012\013\016"
    

    下面我们再通过010Edit工具打开EXE文件,找到最后位置的8个字节看看16进制显示的值
    在这里插入图片描述

    最后我们看到代码解析EXE文件和通过010Editor工具解析,EXE文件是属于pyinstaller进行打包的,那我们就可以进行后续操作了

    4.4. 执行解包操作

    解包操作通过下载的python-exe-unpacker说明,执行以下指令即可。

    # (venv_3.7.5)  ✘ CarltonXu@CarltonXus-MacBook-Pro # python python_exe_unpack.py -i /Users/CarltonXu/Downloads/SMS-Agent.exe
    [*] On Python 3.7
    [*] Processing /Users/CarltonXu/Downloads/SMS-Agent.exe
    [*] Pyinstaller version: 2.1+
    [*] This exe is packed using pyinstaller
    [*] Unpacking the binary now
    [*] Python version: 37
    [*] Length of package: 17411420 bytes
    [*] Found 1631 files in CArchive
    [*] Beginning extraction...please standby
    [*] Found 754 files in PYZ archive
    [*] Successfully extracted pyinstaller exe.
    

    最终执行完成,看到成功后,如果没有-o指定输出目录的话,默认会在当前目录输出unpacked/SMS-agent.exe/目录,此目录下便是解包后的代码,有一堆的文件和一个目录
    在这里插入图片描述
    下面输出的目录也就是源代码目录,但是目录下面全是pyc文件,我们还注意到此目录下还有一个PYZ-00.pyz_extracted文件夹,里面都是引入的依赖库,当然程序的源代码在下这个下面,当然也是我们需要反编译的对象。
    在这里插入图片描述

    4.4. 执行反编译操作

    前边我们看到找到了pyc文件,下面自然就是对它进行解密了。pyc其实是python程序执行过程中产生的缓存文件,我们直接运行python代码时也会看到。对于这种格式的反编译是比较简单的,网上有许多工具,甚至还有很多在线工具及开源代码,我们也可以使用最长用的uncompyle6工具来恢复py文件,操作试试。

    # 现将解压主目录下的sms_agent主程序,后缀修改为sms_agent.pyc
    (venv_3.7.5)  ✘ CarltonXu@CarltonXus-MacBook-Pro [ /tmp ] # cp /tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent /tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent.pyc
    # 执行反编译指令
    (venv_3.7.5)  ✘ CarltonXu@CarltonXus-MacBook-Pro [ /tmp ] # uncompyle6 /tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent.pyc > /tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent.py
    Traceback (most recent call last):
      File "/Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages/xdis/load.py", line 197, in load_module_from_file_object
        float_version = magic_int2float(magic_int)
      File "/Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages/xdis/magics.py", line 426, in magic_int2float
        return py_str2float(magicint2version[magic_int])
    KeyError: 227
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/Users/CarltonXu/workspace/venv_3.7.5/bin/uncompyle6", line 8, in <module>
        sys.exit(main_bin())
      File "/Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages/uncompyle6/bin/uncompile.py", line 194, in main_bin
        **options)
      File "/Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages/uncompyle6/main.py", line 324, in main
        do_fragments,
      File "/Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages/uncompyle6/main.py", line 184, in decompile_file
        filename, code_objects
      File "/Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages/xdis/load.py", line 170, in load_module
        get_code=get_code,
      File "/Users/CarltonXu/workspace/venv_3.7.5/lib/python3.7/site-packages/xdis/load.py", line 205, in load_module_from_file_object
        % (ord(magic[0:1]) + 256 * ord(magic[1:2]), filename)
    ImportError: Unknown magic number 227 in /tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent.pyc
    

    我们执行上面的代码将pyc转换成py,发现失败了,提示是Unknown magic number 227,这个失败因为pyinstaller工具打包的时候,会将代码文件的magic number(python的版本及编译时间)给清除掉,所以反编译时候需要将magic number添加回去才能识别,magic number我们可以通过解压主目录下的struct结构体文件中提取出来(一般是前16个字节,可以对比打包前的源文件),将struct文件体中的前16个字节提取出来,然后在添加到文件中,然后再执行uncompyle6反编译试试。那struct前16个字节值如何获取,我们可以有两种方式获取

    4.4.1. 获取struct文件结构体magic number

    • 第一种:通过010Editor获取

    对比两个文件,获取struct的前16个字节内容

    第一张图struct结构体文件E3之前的16个字节便是magic number

    第二张图sms_agent主程序文件E3之前为空,所以缺少了16个字节magic number

    第一张图黄色框里面的内容都是16进制的值
    在这里插入图片描述

    第一张图:struct
    在这里插入图片描述
    第二张图:sms_agent

    • 第二种:通过python获取
    In [1]: struct_path = "/tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/struct"
    
    In [2]: fn = open(struct_path, 'rb')   # 以2进制读模式打开文件
    
    In [3]: fn.seek(0) # 切换指针位置到开头
    Out[3]: 0
    
    In [5]: fn.tell()   # 查看当前指针位置
    Out[5]: 0
    
    In [8]: magic_number = fn.read(16)    # 读取文件的前16个字节,从0开始
    
    In [10]: magic_number
    Out[10]: b'B\r\r\n\x00\x00\x00\x00pyi0\x10\x01\x00\x00'    # 因为我们是2进值打开的文件,这里输出的是前16个字节的2进制值
    
    In [11]: magic_number.hex()
    Out[11]: '420d0d0a000000007079693010010000'     # 转换成16进制,是不是和010Editor文件打开的是一致的
    
    In [12]: fn.tell()     # 获取当前指针位置
    Out[12]: 16
    
    In [13]: fn.read(1)   # 再读取第17个字节,输出值是e3
    Out[13]: b'\xe3'
    
    In [14]: fn.read(1).hex()   # 再读取第17个字节,输出值是e3
    Out[14]: 'e3'
    

    这时候,我们两种方式都可以获取struct前16个字节的magic number值,我们记录下来,添加到pyc文件中,magic number 2进制值:b’B\r\r\n\x00\x00\x00\x00pyi0\x10\x01\x00\x00’

    4.4.2. 将Magic number添加到pyc文件

    In [1]: struct_path = "/tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent"
    
    In [2]: add_magic_num_file_name = "/tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent"
    
    In [3]: MAGIC_NUMBER = b'B\r\r\n\x00\x00\x00\x00pyi0\x10\x01\x00\x00'
    
    In [4]: f = open(add_magic_num_file_name, 'rb')
    
    In [5]: f.seek(0)
    Out[5]: 0
    
    In [6]: f.tell()
    Out[6]: 0
    
    In [7]: new_content = f.read()
    
    In [8]: new_add_magic_number_file_name = "/tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent.pyc"
    
    In [9]: n_f = open(new_add_magic_number_file_name, "wb")
    
    In [10]: n_f.seek(0)
    Out[10]: 0
    
    In [11]: n_f.tell()
    Out[11]: 0
    
    In [12]: n_f.write(MAGIC_NUMBER + new_content)
    Out[12]: 10972
    
    In [13]: f.close()
    
    In [14]: n_f.close()
    

    4.4.3. 反编译新添加magic number的pyc文件

    (venv_3.7.5)  CarltonXu@CarltonXus-MacBook-Pro [ /tmp ] # python /Users/CarltonXu/workspace/venv_3.7.5/bin/uncompyle6 /tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent.pyc > /tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/sms_agent.py
    

    执行反编译指令没有出错,证明一切正常,查看新生成的sms_agent.py,代码一切正常。
    在这里插入图片描述
    通过反编译出来的py文件,我们看到已经可以正常看到代码了,只不过有些中文字符被解析成了Unicode编码,可以再使用相应工具转换即可。这个不影响正常查看,我们反编译的sms_agent是主目录的主程序文件,其实还有最重要的,我们需要将PYZ-00.pyz_extracted文件夹下的所有pyc文件都进行反编译。

    这里需要注意下PYZ-00.pyz_extracted目录下的依赖库的pyc文件缺少的字节数与主程序不同,通过010Editor查看,依赖库下面的pyc文件不是缺少了16个字节,而是中间少了4个字节,那么,我们只需要把struct头部的16个字节覆盖掉PYZ-00.pyz_extracted目录下的依赖库的pyc的前12个字节。

    4.4.5. 反编译PYZ-00.pyz_extracted依赖库下的pyc文件

    由于依赖库下的文件较多,这里我写了一个脚本来自动完成转换,仅供参

    # vim: tabstop=4 shiftwidth=4 softtabstop=4
    #
    # Copyright 2019 OneProCloud (Shanghai) Ltd
    #
    # Authors: XuXingZhuang xuxingzhuang@oneprocloud.com
    #
    # Copyright (c) 2019. This file is confidential and proprietary.
    # All Rights Reserved, OneProCloud (Shanghai) Ltd(http://www.oneprocloud.com).)
    #
    
    import os
    
    MAGIC_HEAD = b'B\r\r\n\x00\x00\x00\x00pyi0\x10\x01\x00\x00'
    FILES_DIRS = "/Users/CarltonXu/Downloads/SMS-Agent-unpacked/SMS-Agent.exe/PYZ-00.pyz_extracted/"
    CONVERT_CMD = "/Users/CarltonXu/workspace/venv_3.7.5/bin/python /Users/CarltonXu/workspace/venv_3.7.5/bin/uncompyle6"
    
    num = 0
    for root, dirs, files in os.walk(FILES_DIRS):
        print(files)
        for f_name in files:
            num += 1
            print("Execute Number: %s" %num)
            if not f_name.endswith(".pyc"):
                continue
            old_file = os.path.join(root, f_name)
            new_file = os.path.join(root + "/pyz_workspace/" + f_name)
            with open(old_file, "rb") as o_f:
                o_f.seek(12)
                od_content = o_f.read()
    
            with open(new_file, "wb") as n_f:
                n_f.seek(0)
                new_content = MAGIC_HEAD + od_content
                n_f.write(new_content)
    
            GENERA_PY_FILE = os.path.join(root + "/pyz_workspace/" + f_name[0:-4] + ".py")
            EXEC_CONVERT_CMD = CONVERT_CMD + " %s > %s" %(new_file, GENERA_PY_FILE)
            exec_ret = os.popen(EXEC_CONVERT_CMD).read()
            if exec_ret:
                print("INFO: Execute convert cmd successful.")
            else:
                print("[ERROR]: Execute convert cmd filed, please check it.")
    

    4.4.6. 整理PYZ-00.pyz_extracted依赖库下的py文件

    由于反编译完成后的py文件较多,而且没有相关目录,所有的文件名称都是xxx.xxxx.xxx.py
    在这里插入图片描述
    我们正常的代码编写会进行目录划分,用于不同的功能,以及程序调用,所以这里写了一个脚本,来将py文件进行归类创建目录,后续好进行查看

    # vim: tabstop=4 shiftwidth=4 softtabstop=4
    #
    # Copyright 2019 OneProCloud (Shanghai) Ltd
    #
    # Authors: XuXingZhuang xuxingzhuang@oneprocloud.com
    #
    # Copyright (c) 2019. This file is confidential and proprietary.
    # All Rights Reserved, OneProCloud (Shanghai) Ltd(http://www.oneprocloud.com).)
    #!/usr/bin/env python
    # coding=utf-8
    #
    
    import os
    import shutil
    
    ORDER_DIRS = "/Users/CarltonXu/Downloads/SMS-Agent-unpacked/SMS-Agent.exe/PYZ-00.pyz_extracted/pyz_workspace/"
    
    # 遍历所有目录下的文件
    for f in os.listdir(ORDER_DIRS):
        if f.split(".")[-1].endswith("pyc"):
            continue
        mk_dir = f.split(".")[0:-2]
        if mk_dir:
            mk_path = ORDER_DIRS + "/".join(mk_dir)
            mv_file = ORDER_DIRS + f
            mv_to_path = mk_path + "/"
            new_file_name = ".".join(f.split(".")[-2:])
            os.makedirs(mk_path, exist_ok=True)
            shutil.move(mv_file, mv_to_path)
            os.renames(mv_to_path + f, mv_to_path + new_file_name)
        else:
            continue
    

    4.4.7. 整体脚本

    # vim: tabstop=4 shiftwidth=4 softtabstop=4
    #
    # Copyright 2019 OneProCloud (Shanghai) Ltd
    #
    # Authors: XuXingZhuang xuxingzhuang@oneprocloud.com
    #
    # Copyright (c) 2019. This file is confidential and proprietary.
    # All Rights Reserved, OneProCloud (Shanghai) Ltd(http://www.oneprocloud.com).)
    #
    
    import os
    import shutil
    
    MAGIC_HEAD = b'B\r\r\n\x00\x00\x00\x00pyi0\x10\x01\x00\x00'
    FILES_DIRS = "/tmp/python-exe-unpacker/unpacked/SMS-Agent.exe/PYZ-00.pyz_extracted"
    CONVERT_CMD = "/Users/CarltonXu/workspace/venv_3.7.5/bin/python /Users/CarltonXu/workspace/venv_3.7.5/bin/uncompyle6"
    
    def order_dirs(dirs):
        for f in os.listdir(dirs):
            if f.split(".")[-1].endswith("pyc"):
                os.popen("rm -rf %s" %(dirs + f)).read()
                continue
            mk_dir = f.split(".")[0:-2]
            if mk_dir:
                mk_path = dirs + "/".join(mk_dir)
                mv_file = dirs + f
                mv_to_path = mk_path + "/"
                new_file_name = ".".join(f.split(".")[-2:])
                os.makedirs(mk_path, exist_ok=True)
                shutil.move(mv_file, mv_to_path)
                os.renames(mv_to_path + f, mv_to_path + new_file_name)
            else:
                continue
    
    num = 0
    for root, dirs, files in os.walk(FILES_DIRS):
        print(files)
        for f_name in files:
            num += 1
            print("Execute Number: %s" %num)
            if not f_name.endswith(".pyc"):
                continue
            new_dirs = root + "/pyz_workspace/"
            os.makedirs(new_dirs, exist_ok=True)
            old_file = os.path.join(root, f_name)
            new_file = os.path.join(new_dirs + f_name)
            with open(old_file, "rb") as o_f:
                o_f.seek(12)
                od_content = o_f.read()
    
            with open(new_file, "wb") as n_f:
                n_f.seek(0)
                new_content = MAGIC_HEAD + od_content
                n_f.write(new_content)
    
            GENERA_PY_FILE = os.path.join(new_dirs + f_name[0:-4] + ".py")
            EXEC_CONVERT_CMD = CONVERT_CMD + " %s > %s" %(new_file, GENERA_PY_FILE)
            exec_ret = os.popen(EXEC_CONVERT_CMD).read()
            if not exec_ret:
                print("INFO: Execute convert cmd successful.")
                order_dirs(new_dirs)
                print("INFO: Order directory successful.")
            else:
                print("[ERROR]: Execute convert cmd filed, please check it.")
    

    在这里插入图片描述

    展开全文
  • 如何反编译App手机程序 如何反编译软件安装包apk文 件 大家都知道如何反编译exe文件,但是手机的apk文件要如何反编译从而修改其中的源代码,资源文件呢?
  • 序 ...二、反编译exe文件 三、防止反编译 正文 一、python如何打包成exe (常规打包方法) 1.1首先你要先把自己的程序写好,在pycharm中运行正常。我的程序文件目录结构如下图所示: 1....

            最近根据公司生产需求写了个小脚本,想打包成exe文件分发给其他人使用,但又担心代码本反编译而泄露信息,所以花了一整天时间,磕磕绊绊的,终于搞定了!来之不易的“成果”需要总结和记载(毕竟耗费了生命中一天之久的时长)。

    目录

    一、python如何打包成exe (常规打包方法)

    二、反编译exe文件

    三、防止反编译方式生成exe

    正文

    一、python如何打包成exe (常规打包方法)

    1.1首先你要先把自己的程序写好,在pycharm中运行正常。我的程序文件目录结构如下图所示:

    1.2直接控制台输入命令:pyinstaller -p C:\Users\Administrator\PycharmProjects\ExportCustomerInfo\venv\Lib\site-packages -i v6.ico -F main.py

    此句解释如下:

    这里输入自己的第三方引用包的路径(不懂的看我上一篇文章);

    这里是将要生成exe的图标设置(友情提示:非ico格式的图片会出错哦)

    这里是你要发布的主程序文件

    1.3运行结果如下:Building EXE from EXE-00.toc completed successfully.代表成功!

    1.4新产生的文件及文件夹如下,请到dist文件夹里去找exe双击运行效果如下:

     

     

    二、反编译exe文件

    2.1先去网上下载一个pyinstxtractor.py的文件,将其和exe文件放到一个新文件夹里面如12345。

    下载地址:https://download.csdn.net/download/hmy123cq3/16231988

    2.2在电脑cmd命令行,切换到12345这个文件夹路径里并执行如下代码:

    python pyinstxtractor.py main.exe

    执行效果如下:

    2.3可以到如下路径查找文件,可见很多pyc文件,其中我们的机密代码就在这些文件内,反编译pyc文件是很容易的可以借助工具或在线反编译,这里就不详细介绍了。

     

    三、防止反编译方式生成exe

    3.1首先,清理环境,将一、二两步产生的文件,全部删除掉。我删除的文件如下图所示:

    3.2然后,创建一个py文件,命名为create_pyd.py,然后在此文件中敲入如下代码:

    # -*- coding: utf-8 -*-
    """
    Created on Wed Aug 29 13:33:20 2018
    @author: Li Zeng hai
    
    python build_pyd.py build_ext --inplace
    """
    
    from distutils.core import setup
    from Cython.Build import cythonize
    
    setup(
        name='any words.....',
        ext_modules=cythonize(["jr_customer_excel.py", "send_mail.py"]), )

    注意最后一行代码了吗,ext_modules=cythonize(["jr_customer_excel.py", "send_mail.py"])...,这里面的数组就是你想要编译成pyd格式的文件,有多少就添加多少。

    3.3然后在pycharm控制台执行如下代码:

    python create_pyd.py build_ext --inplace

    结果如下图所示:

    接着将这几个pyd后缀的文件名中的cp39-win_amd64部分去掉,去掉后如下图所示:

    3.4执行步骤一中的打包exe(常规方法),即直接执行代码:

    pyinstaller -p C:\Users\Administrator\Pycharm Projects\ExportCustomerInfo\venv\Lib\site-packages -i v6.ico -F main.py

    执行结果如下图所示,Building EXE from EXE-00.toc completed successfully.代表成功了!

    此步骤需要注意的一个坑就,main.py顶部的引用,已经要把其他py文件里的引用都加上,不然会提示找不到模块,什么原因我也不知道,我是按错误提示操作的,如下所示:

    3.5到dist文件夹里运行exe文件看看成果吧!

    3.5重复执行一下步骤二作为校验,结果如下所示:

    此时,已经找不到这里面的两个文件了。

    至此,本文全部完毕!

     

    展开全文
  • 主要介绍了PyInstaller将Python文件打包为exe如何反编译(破解源码)以及防止反编译,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • android反编译 第一:准备工作: 1:下载反编译工具:apktool dex2jar jd-gui  apktool:反编译获取纲xml文件,读取应用程序的资源文件  dex2jar:把classes.dex文件转换成jar文件  jd-gui.exe:把jar文件转换...

    android反编译

    第一:准备工作:

    1:下载反编译工具:apktool dex2jar jd-gui

                       apktool:反编译获取纲xml文件,读取应用程序的资源文件
                      dex2jar:把classes.dex文件转换成jar文件
                     jd-gui.exe:把jar文件转换成java文件

                    官方下载网址:

                    apktool官方下载网址:http://code.google.com/p/android-apktool/downloads/list

                     dex2jar官方下载网址:http://code.google.com/p/dex2jar/downloads/list

                     jd-gui官方下载网址:http://jd.benow.ca/

    2:配置环境变量(为了使用方便,不需要每次都进入apktool和dex2jar的目录)

                   如:配置adb(方便使用adb命令) ; 配置apktool (方便使用apktool d file.apk命令) 配置dex2jar(方便使用dex2jar.bat  file.apk)

                  下面是我的配置:

                  D:\Android\adt-bundle-windows-x86-20131030\adt-bundle-windows-x86-20131030\sdk\platform-tools;D:\Android\apkTool;D:\Android\apkTool\dex2jar;

    如本人电脑配置截图:



    第二:反编译XML文件

    1:反编译:
    命令说明:apktool d file.apk
    apktool d为反编译命令,其中d代表decode


    2:编译打包:(重新把修改过的文件打包为APK格式)
    打包命令为:apktool b Ganji(Ganji为刚才的文件夹名称)
    重新编译完成后,DJ文件夹内会新增一个dist文件夹,里面的DJ.apk文件就是重新编译好的apk
    安装包,签名后即可安装。


    第三:反编译classes.dex文件

    1:先把Ganji.apk重命名为Ganji.rar,直接解压得到classes.dex,运行下面命令得到classes_dex2jar.jar

    dex2jar.bat file.apk



    2:把得到的classes_dex2jar.jar,用jd-gui打开就可以啦。


    第三:如何防止我们的代码被反编译

    由于apk是Android虚拟机加载的,它有一定的规范,加密apk后Dalvik无法识别apk了,完全避免是不可能的,总有人能够在破解你的代码。但是有几种方式来提高被反编译代码的难度。
    1:关键代码使用jni调用本地代码,用C或C++编写,因此相对比较难于反编译。
    2:代码混淆:混淆代码是不改变代码逻辑的情况下,增加无用代码,或者重命名,使反编译后的源代码难于看懂。
    网上开源的java代码混淆工具比较多,一般是用ant的方式来编译的。



    展开全文
  • 如何反编译Android apk

    2018-01-16 23:24:35
    下载反编译工具,加压后获得:aapt.exe,apktool.bat,apktool.jar ,将需要反编译的APK文件放到该目录下, 打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:apktool.bat d -f (文件名)....

    反编译过程:

    首先下载反编译工具类:反编译工具

    一、获取要编译的apk文件

    下载反编译工具,加压后获得aapt.exeapktool.batapktool.jar ,将需要反编译的APK文件放到该目录下,

    打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:apktool.bat d -f  (文件名).apk  test    


    执行成功后apktool目录获得到一个test的文件夹

    test文件夹里面包含了要编译的文件目录,不要着急还没结束。

    如果你想将反编译完的文件重新打包成apk,那你可以:输入apktool.bat   b    test(你编译出来文件夹)便可,效果如下:


    之后在之前的test文件下便可以发现多了2个文件夹:

    build

    dist(里面存放着打包出来的APK文件)


    二、反编译得到Java源代码

    下载上述工具中包含 dex2jar-0.0.9.15.zip 和 jd-gui-0.3.5.windows.zip解压

    将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内,

    在命令行下定位到 dex2jar 所在目录,输入dex2jar.bat   classes.dex效果如下:

    在改目录下会生成一个classes_dex2jar.jar的文件,然后打开工具jd-gui文件夹里的jd-gui.exe,之后用该工具打开之前生成的classes_dex2jar.jar文件,便可以看到源码了,效果如下:

    参考文章:http://blog.csdn.net/vipzjyno1/article/details/21039349/

    最后希望对各位同学有所帮助,欢迎关注我的博客。





    展开全文
  • 在上一篇文章《StringBuilder、StringBuffer与Java字符串...那么,我们如何反编译指定的Java字节码文件呢?其实,在Sun公司提供的JDK中,就已经内置了Java字节码文件反编译工具javap.exe(位于JDK安装目录的bin文件夹下)
  • 直接使用文件夹中的Androidby 文件夹中的Android反编译工具(64)位.exe或者使用Android反编译工具.exe,双击后选择需要反编译的apk文件即可。但是该方法往往不成功,会由于签名等原因报错,如果成功反编译生成的文件...
  • python3.7.4反编译生成的.exe

    千次阅读 2019-10-18 14:49:18
    第一步:上搜索引擎搜一下如何反编译,大概总结一下:一、获取python的.pyc(即将exe解压) 参考链接:https://www.jianshu.com/p/4da8dada77bc 推荐另一篇关于防止python exe反编译的方法:...
  • python3.7反编译生成的.exe

    千次阅读 热门讨论 2019-07-25 23:41:50
    然后 自然是第一步上搜索引擎搜一下如何反编译,大概总结一下: 1.获取python的.pyc 这里用到的工具是:pyinstxtractor.py 将pyinstxtractor.py与目标exe放置在同一个文件夹 python pyinstxtracto...
  • 今天讨论两个问题第一如何反编译dll,第二如何将反编译的文件生成dll。 反编译dll 安装vs,最好是最新版本的,如果要反编译的dll使用新版本创建的,也能反编译成功。下面是详细的反编译步骤。 1.打开C:\Program ...
  • java中如何反编译class文件

    千次阅读 2019-06-27 10:13:48
    作为一个软件开发人员,在自学的成长道路上,不可避免的会...这就要用到反编译工具了。 1.首先我们需要一个辅助工具JD-GUI.exe 可以到http://www.downza.cn/soft/228025.html进行下载,这是中文版,免安装。 ① J...
  • 如题,求高手讨论如何解决!
  • 为了方便使用,我们一般会用 Pyinstaller 将 Python 程序打包,这样就可以在没有安装 Python 解释器的机器上运行了。对于普通人来讲,这无疑是极其方便的...本文就来介绍一下,如何exe 文件反编译为 Python 源代码!

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 311
精华内容 124
关键字:

如何反编译exe