exe反编译_exe反编译看到源码 - CSDN
精华内容
参与话题
  • EXE反编译方法及工具

    万次阅读 2017-09-30 16:50:18
    方法一:VS自带反编译DLL工具  VS命令提示符下输入ILDasm。 VS命令提示符:开始-程序-Visual Studio-命令提示符 方法二:OLLYDBG https://jingyan.baidu.com/article/dca1fa6f59cc6bf1a540524a.html 方法三:...

    方法一:VS自带反编译DLL工具  

    VS命令提示符下输入ILDasm。

    VS命令提示符:开始-程序-Visual Studio-命令提示符

    方法二:OLLYDBG

    https://jingyan.baidu.com/article/dca1fa6f59cc6bf1a540524a.html

    方法三:ILSpy

    https://jingyan.baidu.com/article/5bbb5a1b027f6b13eba17920.html

    反编译软件ILSpy使用教程:

    http://blog.csdn.net/qq_34533514/article/details/54696065


    参考资料:

    常用exe反编译工具:

    http://blog.csdn.net/qiuzhping/article/details/17629731


    展开全文
  • 战斗名族开发的,一款反编译工具,好用看得见!
  • 反编译工具Depends 推荐使用比较不错的Depends.exe,分析dll和exe所依赖的dll。可以看到dll以及dll的函数,可以查看导入导出函数,挺好用的。VC++ Depends用来显示与一个可执行文件(exe或者dll)相关的依赖项(dll...

    反编译工具Depends 推荐使用比较不错的Depends.exe,分析dll和exe所依赖的dll。可以看到dll以及dll的函数,可以查看导入导出函数,挺好用的。VC++ Depends用来显示与一个可执行文件(exe或者dll)相关的依赖项(dll),以及该exe或dll引用了这些dll中的哪些接口。

    Depends Wallker是一个VC反编译工具,可以查看PE模块的导入模块以及导入和导出的函数以及动态剖析PE模块的依赖性和解析C++的函数名称。。

    查询软件所需的环境:

    近期很多兄弟们问怎么样打包程序,如何获取所需dll的信息,这就需要使用VC所带的Depends软件,该软件在VC6安装目录下的tools文件夹里面D:/Microsoft Visual Studio/Common/Tools,直接
    双击执行,然后打开exe文件即可,它主要有下面几个注意事项:

    1)所编的软件所需的Dll文件,可以得到相应的Dll路径,版本,属性等。

    2)窗口分四部分:
    左上角是Dll信息窗口,显示你程序所需的Dll模块,
    右边第一个窗口是所选的Dll模块所使用的函数,
    右边第二个窗口是所选Dll模块的所有的导出函数,
    下面窗口是所有需要的Dll模块的属性

    3)右边两个窗口出现四个标签:序号,提示,函数,入口点
    如果利用导出是函数,那么出现函数名,如果导出的是序号,那么函数项就是N/A(无法显示)
    出现红色提示表示不正常,一般为没有该导出函数

    4)该工具得到的是你软件中隐式链接的Dll库,也就是用lib关联的Dll模块,
    无法显示显式链接的Dll模块,也就是用LoadLibrary函数导入的Dll函数。(切记切记!)

    5)无法提供Borland C++ Builder所提供的Dll文件,无法提供vxd软件的调用。

    Depends主要功能:

    该工具得到的是你软件中隐式链接的Dll库,也就是用lib关联的Dll模块,无法显示显式链接的Dll模块,也就是用LoadLibrary函数导入的Dll函数

    查看 PE 模块的导入模块
    查看 PE 模块的导入和导出函数
    动态剖析 PE 模块的模块依赖性
    解析 C++ 函数名称

    软件截图

    反编译工具Depends 2.2.600绿色免费版
    展开全文
  • 常用EXE文件反编译工具

    万次阅读 2015-06-04 18:54:12
    常用EXE文件反编译工具 PE Explorer V1.99 R5 绿色汉化特别版_强大的可视化汉化集成工具  功能极为强大的可视化汉化集成工具,可直接浏览、修改软件资源,包括菜单、对话框、字符串表等; 另外,还具备有...
    
    
    PE Explorer V1.99 R5 绿色汉化特别版_强大的可视化汉化集成工具

       功能极为强大的可视化汉化集成工具,可直接浏览、修改软件资源,包括菜单、对话框、字符串表等; 另外,还具备有 W32DASM 软件的反编译能力和PEditor 软件的 PE 文件头编辑功能,可以更容易的分析源代码,修复损坏了的资源,可以处理 PE 格式的文件如:EXE、DLL、DRV、BPL、DPL、SYS、CPL、OCX、SCR 等 32 位可执行程序。 该软件支持插件,你可以通过增加插件加强该软件的功能, 原公司在该工具中捆绑了 UPX 的脱壳插件、扫描器和反汇编器,非常好用。
       唯一遗憾的是欠缺字典功能……
    点击这里下载文件
    eXeScope V6.5 修改QQ版本号 绿色汉化版  

        小巧但功能极其强大的本地化工具,可以直接修改 VC++ 及 DELPHI 编制的 PE 格式文件的资源,包括菜单、对话框、字符串和位图等,也可与其它本地化工具配合使用。
       在汉化中不推荐使用 eXeScope 作为汉化工具,仅作为汉化辅助工具。6.50 版主要对 DELPHI 7 编译的程序支持较好,对 DELPHI 7 以前版本编译的程序,建议使用 6.30 版本,因为该程序对 Unicode 字符显示支持不好。
    点击这里下载文件
    Resource Hacker 3.4.0.79 官方简体

       一个类似于eXeScope的但在某些方面比它还好一些的工具。1. 查看 Win32 可执行和相关文件的资源 (*.exe, *.dll, *.cpl, *.ocx),在已编译和反编译的格式下都可以。2. 提取 (保存) 资源到文件 (*.res) 格式,作为二进制,或作为反编过的译资源脚本或图像。图标,位图,指针,菜单,对话,字符串表,消息表,加速器,Borland 窗体和版本信息资源都可以被完整地反编译为他们各自的格式,不论是作为图像或 *.rc 文本文件。3. 修改 (替换) 可执行文件的资源。图像资源 (图标,指针和位图) 可以被相应的图像文件 (*.ico, *.cur, *.bmp),*.res 文件,甚至另一个 *.exe 文件所替换。对话,菜单,字符串表,加速器和消息表资源脚本 (以及 Borland 窗体) 可以通过使用内部资源脚本编辑器被编辑和重新编译。资源也可以被一个 *.res 文件所替换,只要替换的资源与它是同一类型并且有相同的名称。4. 添加新的资源到可执行文件。允许一个程序支持多种语言,或者添加一个自定义图标或位图 (公司的标识等) 到程序的对话中。5. 删除资源。大多数编译器添加了应用程序永远不会用到的资源到应用程序中。删除这些不使用的资源可以减小一个应用程序的大小。
    点击这里下载文件
    PASSOLO 7.0.01.1_绿色汉化修正版_功能强大的软件本地化工具

       Passolo 是一款功能强大的软件本地化工具,它支持以 Visual C++ 、Borland C++ 及 Delphi 语言编写的软件(.exe、.dll、.ocx)的本地化。以往针对这两种不同语言编写的软件,我们大多是需要分别使用 Visual Localize 和 Language Localizator 来进行软件的中文化。而现在,Passolo 把二者的功能结合在了一起,并且性能稳定、易于使用,用户即不需要进行专门的训练,也不需要丰富的编程经验,在本地化的过程中可能发生的许多错误也都能由 Passolo 识别或自动纠正。作为专业性的本地化工具,Passolo 的功能主要包括:
    - 支持 VC 软件新旧版本套用资源或字典的翻译中文化;
    - 支持 Delphi 软件使用专用 / 通用字典翻译中文化;
    - 利用已有的多种格式的 Passolo 字典对新建方案进行自动翻译;
    - 对 VC 、Delphi 软件都支持标准资源的可视化编辑(酷!);
    - 使用 Passolo 自带的位图编辑器可以直接对图片资源进行修改;
    - 可以把目标资源导出后借用外部程序翻译后再重新导入。
       Passolo 还自带了 XML 、.NET 、 VB 和 Java 等数种插件(Add-in),专业的编程人员可以借用它们对相应的资源文件进行本地化编辑。
    点击这里下载文件
    以上就是对EXE文件进行汉化,反编译,资源编辑中最常用的4个工具。
    转:http://www.cnblogs.com/ejiyuan/archive/2009/09/08/1562624.html
    展开全文
  • PyInstaller:编译exe反编译

    万次阅读 2019-11-08 23:21:42
    1 简单Python代码示例 TestAdd.py #__author__ = 'StubbornHuang' #coding = utf-8 import io import os import sys def addTest(a,b): print ("a+b={}".format(a+b)) ...2 ...

    1 简单Python代码示例

    TestAdd.py

    #__author__ = 'StubbornHuang'
    #coding = utf-8
    
    import io
    import os
    import sys
    
    def addTest(a,b):
    	print ("a+b={}".format(a+b))
    	
    
    if __name__ == '__main__':
    	addTest(1,5)
    

    2 安装PyInstaller

    输入以下命令安装pyinstaller:

    pip install pyinstaller
    

    验证是否安装成功,输入以下命令:

    pyinstaller
    

    在这里插入图片描述

    3 不加密直接编译exe

    在需要打包的py文件目录下启动cmd.exe,或者PowerShell.exe,我自己用的是Cmder.exe。
    在这里插入图片描述
    输入以下命令:

    pyinstaller TestAdd.py
    

    在这里插入图片描述
    在这里插入图片描述
    打包的exe在py文件所在目录的dist子目录下
    在这里插入图片描述
    如果直接运行TestAdd.exe会一闪而过,最好在当前exe所在目录下执行命令运行:

    ./TestAdd.exe
    

    我们可以看到直接运行成功。
    在这里插入图片描述

    4 对PyInstaller打包的不加密编译exe进行反编译

    使用pyinstxtractor.py 对上述不加密的exe进行反编译,其中pyinstxtractor.py文件内容如下:

    """
    PyInstaller Extractor v1.9 (Supports pyinstaller 3.3, 3.2, 3.1, 3.0, 2.1, 2.0)
    Author : Extreme Coders
    E-mail : extremecoders(at)hotmail(dot)com
    Web    : https://0xec.blogspot.com
    Date   : 29-November-2017
    Url    : https://sourceforge.net/projects/pyinstallerextractor/
    
    For any suggestions, leave a comment on
    https://forum.tuts4you.com/topic/34455-pyinstaller-extractor/
    
    This script extracts a pyinstaller generated executable file.
    Pyinstaller installation is not needed. The script has it all.
    
    For best results, it is recommended to run this script in the
    same version of python as was used to create the executable.
    This is just to prevent unmarshalling errors(if any) while
    extracting the PYZ archive.
    
    Usage : Just copy this script to the directory where your exe resides
            and run the script with the exe file name as a parameter
    
    C:\path\to\exe\>python pyinstxtractor.py <filename>
    $ /path/to/exe/python pyinstxtractor.py <filename>
    
    Licensed under GNU General Public License (GPL) v3.
    You are free to modify this source.
    
    CHANGELOG
    ================================================
    
    Version 1.1 (Jan 28, 2014)
    -------------------------------------------------
    - First Release
    - Supports only pyinstaller 2.0
    
    Version 1.2 (Sept 12, 2015)
    -------------------------------------------------
    - Added support for pyinstaller 2.1 and 3.0 dev
    - Cleaned up code
    - Script is now more verbose
    - Executable extracted within a dedicated sub-directory
    
    (Support for pyinstaller 3.0 dev is experimental)
    
    Version 1.3 (Dec 12, 2015)
    -------------------------------------------------
    - Added support for pyinstaller 3.0 final
    - Script is compatible with both python 2.x & 3.x (Thanks to Moritz Kroll @ Avira Operations GmbH & Co. KG)
    
    Version 1.4 (Jan 19, 2016)
    -------------------------------------------------
    - Fixed a bug when writing pyc files >= version 3.3 (Thanks to Daniello Alto: https://github.com/Djamana)
    
    Version 1.5 (March 1, 2016)
    -------------------------------------------------
    - Added support for pyinstaller 3.1 (Thanks to Berwyn Hoyt for reporting)
    
    Version 1.6 (Sept 5, 2016)
    -------------------------------------------------
    - Added support for pyinstaller 3.2
    - Extractor will use a random name while extracting unnamed files.
    - For encrypted pyz archives it will dump the contents as is. Previously, the tool would fail.
    
    Version 1.7 (March 13, 2017)
    -------------------------------------------------
    - Made the script compatible with python 2.6 (Thanks to Ross for reporting)
    
    Version 1.8 (April 28, 2017)
    -------------------------------------------------
    - Support for sub-directories in .pyz files (Thanks to Moritz Kroll @ Avira Operations GmbH & Co. KG)
    
    Version 1.9 (November 29, 2017)
    -------------------------------------------------
    - Added support for pyinstaller 3.3
    - Display the scripts which are run at entry (Thanks to Michael Gillespie @ malwarehunterteam for the feature request)
    
    """
    
    from __future__ import print_function
    import os
    import struct
    import marshal
    import zlib
    import sys
    import imp
    import types
    from uuid import uuid4 as uniquename
    
    
    class CTOCEntry:
        def __init__(self, position, cmprsdDataSize, uncmprsdDataSize, cmprsFlag, typeCmprsData, name):
            self.position = position
            self.cmprsdDataSize = cmprsdDataSize
            self.uncmprsdDataSize = uncmprsdDataSize
            self.cmprsFlag = cmprsFlag
            self.typeCmprsData = typeCmprsData
            self.name = name
    
    
    class PyInstArchive:
        PYINST20_COOKIE_SIZE = 24           # For pyinstaller 2.0
        PYINST21_COOKIE_SIZE = 24 + 64      # For pyinstaller 2.1+
        MAGIC = b'MEI\014\013\012\013\016'  # Magic number which identifies pyinstaller
    
        def __init__(self, path):
            self.filePath = path
    
    
        def open(self):
            try:
                self.fPtr = open(self.filePath, 'rb')
                self.fileSize = os.stat(self.filePath).st_size
            except:
                print('[*] Error: Could not open {0}'.format(self.filePath))
                return False
            return True
    
    
        def close(self):
            try:
                self.fPtr.close()
            except:
                pass
    
    
        def checkFile(self):
            print('[*] Processing {0}'.format(self.filePath))
            # Check if it is a 2.0 archive
            self.fPtr.seek(self.fileSize - self.PYINST20_COOKIE_SIZE, os.SEEK_SET)
            magicFromFile = self.fPtr.read(len(self.MAGIC))
    
            if magicFromFile == self.MAGIC:
                self.pyinstVer = 20     # pyinstaller 2.0
                print('[*] Pyinstaller version: 2.0')
                return True
    
            # Check for pyinstaller 2.1+ before bailing out
            self.fPtr.seek(self.fileSize - self.PYINST21_COOKIE_SIZE, os.SEEK_SET)
            magicFromFile = self.fPtr.read(len(self.MAGIC))
    
            if magicFromFile == self.MAGIC:
                print('[*] Pyinstaller version: 2.1+')
                self.pyinstVer = 21     # pyinstaller 2.1+
                return True
    
            print('[*] Error : Unsupported pyinstaller version or not a pyinstaller archive')
            return False
    
    
        def getCArchiveInfo(self):
            try:
                if self.pyinstVer == 20:
                    self.fPtr.seek(self.fileSize - self.PYINST20_COOKIE_SIZE, os.SEEK_SET)
    
                    # Read CArchive cookie
                    (magic, lengthofPackage, toc, tocLen, self.pyver) = \
                    struct.unpack('!8siiii', self.fPtr.read(self.PYINST20_COOKIE_SIZE))
    
                elif self.pyinstVer == 21:
                    self.fPtr.seek(self.fileSize - self.PYINST21_COOKIE_SIZE, os.SEEK_SET)
    
                    # Read CArchive cookie
                    (magic, lengthofPackage, toc, tocLen, self.pyver, pylibname) = \
                    struct.unpack('!8siiii64s', self.fPtr.read(self.PYINST21_COOKIE_SIZE))
    
            except:
                print('[*] Error : The file is not a pyinstaller archive')
                return False
    
            print('[*] Python version: {0}'.format(self.pyver))
    
            # Overlay is the data appended at the end of the PE
            self.overlaySize = lengthofPackage
            self.overlayPos = self.fileSize - self.overlaySize
            self.tableOfContentsPos = self.overlayPos + toc
            self.tableOfContentsSize = tocLen
    
            print('[*] Length of package: {0} bytes'.format(self.overlaySize))
            return True
    
    
        def parseTOC(self):
            # Go to the table of contents
            self.fPtr.seek(self.tableOfContentsPos, os.SEEK_SET)
    
            self.tocList = []
            parsedLen = 0
    
            # Parse table of contents
            while parsedLen < self.tableOfContentsSize:
                (entrySize, ) = struct.unpack('!i', self.fPtr.read(4))
                nameLen = struct.calcsize('!iiiiBc')
    
                (entryPos, cmprsdDataSize, uncmprsdDataSize, cmprsFlag, typeCmprsData, name) = \
                struct.unpack( \
                    '!iiiBc{0}s'.format(entrySize - nameLen), \
                    self.fPtr.read(entrySize - 4))
    
                name = name.decode('utf-8').rstrip('\0')
                if len(name) == 0:
                    name = str(uniquename())
                    print('[!] Warning: Found an unamed file in CArchive. Using random name {0}'.format(name))
    
                self.tocList.append( \
                                    CTOCEntry(                      \
                                        self.overlayPos + entryPos, \
                                        cmprsdDataSize,             \
                                        uncmprsdDataSize,           \
                                        cmprsFlag,                  \
                                        typeCmprsData,              \
                                        name                        \
                                    ))
    
                parsedLen += entrySize
            print('[*] Found {0} files in CArchive'.format(len(self.tocList)))
    
    
    
        def extractFiles(self):
            print('[*] Beginning extraction...please standby')
            extractionDir = os.path.join(os.getcwd(), os.path.basename(self.filePath) + '_extracted')
    
            if not os.path.exists(extractionDir):
                os.mkdir(extractionDir)
    
            os.chdir(extractionDir)
    
            for entry in self.tocList:
                basePath = os.path.dirname(entry.name)
                if basePath != '':
                    # Check if path exists, create if not
                    if not os.path.exists(basePath):
                        os.makedirs(basePath)
    
                self.fPtr.seek(entry.position, os.SEEK_SET)
                data = self.fPtr.read(entry.cmprsdDataSize)
    
                if entry.cmprsFlag == 1:
                    data = zlib.decompress(data)
                    # Malware may tamper with the uncompressed size
                    # Comment out the assertion in such a case
                    assert len(data) == entry.uncmprsdDataSize # Sanity Check
    
                with open(entry.name, 'wb') as f:
                    f.write(data)
    
                if entry.typeCmprsData == b's':
                	print('[+] Possible entry point: {0}'.format(entry.name))
    
                elif entry.typeCmprsData == b'z' or entry.typeCmprsData == b'Z':
                    self._extractPyz(entry.name)
    
    
        def _extractPyz(self, name):
            dirName =  name + '_extracted'
            # Create a directory for the contents of the pyz
            if not os.path.exists(dirName):
                os.mkdir(dirName)
    
            with open(name, 'rb') as f:
                pyzMagic = f.read(4)
                assert pyzMagic == b'PYZ\0' # Sanity Check
    
                pycHeader = f.read(4) # Python magic value
    
                if imp.get_magic() != pycHeader:
                    print('[!] Warning: The script is running in a different python version than the one used to build the executable')
                    print('    Run this script in Python{0} to prevent extraction errors(if any) during unmarshalling'.format(self.pyver))
    
                (tocPosition, ) = struct.unpack('!i', f.read(4))
                f.seek(tocPosition, os.SEEK_SET)
    
                try:
                    toc = marshal.load(f)
                except:
                    print('[!] Unmarshalling FAILED. Cannot extract {0}. Extracting remaining files.'.format(name))
                    return
    
                print('[*] Found {0} files in PYZ archive'.format(len(toc)))
    
                # From pyinstaller 3.1+ toc is a list of tuples
                if type(toc) == list:
                    toc = dict(toc)
    
                for key in toc.keys():
                    (ispkg, pos, length) = toc[key]
                    f.seek(pos, os.SEEK_SET)
    
                    fileName = key
                    try:
                        # for Python > 3.3 some keys are bytes object some are str object
                        fileName = key.decode('utf-8')
                    except:
                        pass
    
                    # Make sure destination directory exists, ensuring we keep inside dirName
                    destName = os.path.join(dirName, fileName.replace("..", "__"))
                    destDirName = os.path.dirname(destName)
                    if not os.path.exists(destDirName):
                        os.makedirs(destDirName)
    
                    try:
                        data = f.read(length)
                        data = zlib.decompress(data)
                    except:
                        print('[!] Error: Failed to decompress {0}, probably encrypted. Extracting as is.'.format(fileName))
                        open(destName + '.pyc.encrypted', 'wb').write(data)
                        continue
    
                    with open(destName + '.pyc', 'wb') as pycFile:
                        pycFile.write(pycHeader)      # Write pyc magic
                        pycFile.write(b'\0' * 4)      # Write timestamp
                        if self.pyver >= 33:
                            pycFile.write(b'\0' * 4)  # Size parameter added in Python 3.3
                        pycFile.write(data)
    
    
    def main():
        if len(sys.argv) < 2:
            print('[*] Usage: pyinstxtractor.py <filename>')
    
        else:
            arch = PyInstArchive(sys.argv[1])
            if arch.open():
                if arch.checkFile():
                    if arch.getCArchiveInfo():
                        arch.parseTOC()
                        arch.extractFiles()
                        arch.close()
                        print('[*] Successfully extracted pyinstaller archive: {0}'.format(sys.argv[1]))
                        print('')
                        print('You can now use a python decompiler on the pyc files within the extracted directory')
                        return
    
                arch.close()
    
    
    if __name__ == '__main__':
        main()
    

    将pyinstxtractor.py文件复制到TestAdd.exe同目录下,运行cmd.exe,输入以下命令进行反编译:

    python pyinstxtractor.py TestAdd.exe
    

    在这里插入图片描述
    反编译的文件在exe所在目录的后缀为exe_extracted文件夹下,示例的提取目录为TestAdd.exe_extracted/PYZ-00.pyz_extracted文件下
    在这里插入图片描述
    在TestAdd.exe_extracted下有从TextAdd.exe提取出来的pyc文件,我们可以使用反编译工具进行反编译。

    5 加密编译exe

    如果我们要增加反编译pyinstaller打包的exe文件的难度该怎么办?添加key值。
    在py目录启动cmd.exe,输入以下命令:

    pyinstaller -F --key 123456789 TestAdd.py
    

    其中运行选项:
    -F:强制编译为单个exe文件,不要多余的文件;
    –key 123456789:使用key123456789进行加密编译;

    5.1 注意事项

    需要注意的是,在运行上述命令时如果你没有安装pycrypto第三方库,则需要执行下述命令进行安装:

    pip install pycrypto
    

    进行安装,在这其中大概率会出现如下错误:

    error C2061: 语法错误: 标识符“intmax_t”;
    
    error C2059: 语法错误:“;” ;
    
    error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)等等
    

    等。
    在这里插入图片描述
    解决方案:
    1 进入电脑VS安装目录下,搜索stdint.h(示例路径:D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include),将该文件复制到以下路径,示例路径:C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt/
    2 然后在C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt/下找到inttypes.h文件,进行文件编译,
    将包含头文件的代码:

    #include <stdint.h>
    

    修改为

    #include "stdint.h"
    

    3 重新运行

    pip install pycrypto
    

    进行安装pycrypto,应该就可以了。

    5.2 加密编译

    在这里插入图片描述
    在这里插入图片描述
    这是dist目录下只有单个的TestAdd.exe文件。
    在这里插入图片描述
    这是我们依然采用pyinstxtractor.py对其进行反编译
    在这里插入图片描述
    可以看到出现了较多的decompress Error 解压错误,TestAdd.exe_extracted/PYZ-00.pyz_extracted文件夹下的文件都是加密的。
    在这里插入图片描述
    这种方式增加了反编译pyinstaller打包的exe文件的难度,在一定程度上增加了python源代码的保护性。

    6 将外部数据打包到exe中

    将TestAdd.py文件内容修改如下:

    #__author__ = 'StubbornHuang'
    #coding = utf-8
    
    import io
    import os
    import sys
    
    def resource_path(relative_path):
        """ Get absolute path to resource, works for dev and for PyInstaller """
        base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
        return os.path.join(base_path, relative_path)
    
    def printTestFile1():
    	file = 'Test1.txt'
    	print(resource_path(file))
    	with open(resource_path(file), 'r',encoding='UTF-8') as f:
    		while True:
    			line = f.readline()     # 逐行读取
    			if not line:
    				break
    			print(line)
    
    def printTestFile2():
    	file = 'data/Test2.txt'
    	print(resource_path(file))
    	with open(resource_path(file), 'r',encoding='UTF-8') as f:
    		while True:
    			line = f.readline()     # 逐行读取
    			if not line:
    				break
    			print(line)
    
    	
    
    if __name__ == '__main__':
    	printTestFile1()
    	printTestFile2()
    

    然后在py所在目录新建Test1.txt,并输入以下内容:

    pyinstaller外部数据打包测试(单文件)

    然后在py所在目录新建data子文件夹,在data文件夹下新建Test2.txt,并输入以下内容:

    pyinstaller外部数据打包测试(文件夹下的目录)

    在这里插入图片描述
    在这里插入图片描述
    好的,将上述准备工作做好之后则开始进行将外部数据增加到exe中

    6.1 如果不需要加密编译

    则在py文件所在目录输入以下命令

    pyi-makespec -F TestAdd.py
    

    执行完命令后,可以看到py所在目录下新增了文件TestAdd.spec

    在这里插入图片描述
    该文件内容为:

    # -*- mode: python -*-
    
    block_cipher = None
    
    
    a = Analysis(['TestAdd.py'],
                 pathex=['C:\\Users\\Administrator\\Desktop\\PythonExe\\Test'],
                 binaries=[],
                 datas=[],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              [],
              name='TestAdd',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True )
    

    将上述文件进行修改,添加外部数据,修改如下:

    # -*- mode: python -*-
    
    block_cipher = None
    
    
    a = Analysis(['TestAdd.py'],
                 pathex=['C:\\Users\\Administrator\\Desktop\\PythonExe\\Test'],
                 binaries=[], 
                 datas=[('Test1.txt','.'),('data/Test2.txt','data')],#修改处
                 hiddenimports=[], #填入需要导入的第三方库,例如flask
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              [],
              name='TestAdd',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True )
    
    

    上述修改会将Test1.txt以及/data/Test2.txt文件在运行时复制到可执行程序的临时目录以便可执行程序可以找到相应的文件。
    修改后,使用命令:

    pyinstaller TestAdd.spec
    

    进行编译。
    在这里插入图片描述
    如果出现找不到Test1.txt或者/data/Test2.txt的错误,是因为运行可执行文件时,会先将可执行文件进行压缩,压缩的位置在 /tmp 下,再执行,所以被打包进去的数据文件在被解压的路径下,而,程序是在运行的路径下搜索,即可执行文件的目录下,所以找不到数据文件。
    所以我们在编写TestAdd.py文件时,添加了如下函数

    def resource_path(relative_path):
        """ Get absolute path to resource, works for dev and for PyInstaller """
        base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
        return os.path.join(base_path, relative_path)
    

    用于寻找pyinstaller临时文件目录。

    6.2 如果需要加密编译

    如果需要加密编译,参照第5节,运行以下命令:

    pyinstaller -F --key 123456789 TestAdd.py
    

    生成TestAdd.spec,其文件内容如下:

    # -*- mode: python -*-
    
    block_cipher = pyi_crypto.PyiBlockCipher(key='123456789')
    
    
    a = Analysis(['TestAdd.py'],
                 pathex=['C:\\Users\\Administrator\\Desktop\\PythonExe\\Test'],
                 binaries=[],
                 datas=[],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              [],
              name='TestAdd',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True )
    
    

    将其修改为:

    # -*- mode: python -*-
    
    block_cipher = pyi_crypto.PyiBlockCipher(key='123456789')
    
    
    a = Analysis(['TestAdd.py'],
                 pathex=['C:\\Users\\Administrator\\Desktop\\PythonExe\\Test'],
                 binaries=[],
                 datas=[('Test1.txt','.'),('data/Test2.txt','data')],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              [],
              name='TestAdd',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True )
    

    保存之后,执行命令:

    pyinstaller TestAdd.spec
    

    编译文件,这样,编译出来的exe既是加密后的也是引入外部数据的。

    7 为exe添加图标

    找一个在线生成图标ico的网站,生成自己想要的图标,我用的是http://www.faviconico.org/favicon,然后将图标放在py同目录下。
    在这里插入图片描述
    然后修改TestAdd.spec文件,源文件内容如下:

    # -*- mode: python -*-
    
    block_cipher = pyi_crypto.PyiBlockCipher(key='123456789')
    
    
    a = Analysis(['TestAdd.py'],
                 pathex=['C:\\Users\\Administrator\\Desktop\\PythonExe\\Test'],
                 binaries=[],
                 datas=[],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              [],
              name='TestAdd',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True)
    
    

    修改为:

    # -*- mode: python -*-
    
    block_cipher = pyi_crypto.PyiBlockCipher(key='123456789')
    
    
    a = Analysis(['TestAdd.py'],
                 pathex=['C:\\Users\\Administrator\\Desktop\\PythonExe\\Test'],
                 binaries=[],
                 datas=[('Test1.txt','.'),('data/Test2.txt','data')],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              [],
              name='TestAdd',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True,
    		  icon='ico.ico') #增加的图标
    
    

    然后使用命令

    pyinstaller TestAdd.spec

    生成exe文件,我们可以看到exe是带图标的了
    在这里插入图片描述

    如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com/,更多博文干货等着您。

    展开全文
  • exe程序 反编译

    2019-06-16 06:48:54
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • exe4j生成的exe反编译成java代码

    千次阅读 2018-06-06 14:35:47
    很早以前写了一个java串口小程序,现在只有exe4j打包后的源程序了,最近又要用,折腾了一下发现其实要找回来也很简单...所以反编译的步骤如下: 1.运行exe程序 我的程序是camera.exe 这是自己写的一个小程序,
  • 已知已经写好的EXE程序是 易语言写的 我现在想编译他写好的代码 需要用到什么反编译工具 去反编译源码? 只是想去掉他 几个弹窗和弹出网页 和一些文字 求大神!
  • 利用IDA Pro反编译破解.exe

    万次阅读 2015-03-12 13:38:07
    参考文章:http://www.cnblogs.com/vento/archive/2013/02/09/2909579.html
  • python编译exe及防止被反编译

    万次阅读 2019-06-20 21:12:53
    https://blog.csdn.net/ZhaDeNianQu/article/details/87717293
  • exe4j打包的java exe程序反编译过程

    万次阅读 2013-11-25 23:09:35
    开始,我用了http://blog.csdn.net/lanximu/article/details/16879545的方法,但十六进制文件看着有乱码,试着截了几次进行压缩,但都不对,...于是,查询了exe4j打包exe原理:将jar全部解压然后调用java运行库执行,
  • 反编译DLL。并且修改DLL内容

    万次阅读 2018-11-13 15:33:39
    1:反编译工具ILSpy.exe:是个很不错的反编译软件,而且是免费了; 2:微软的工具ildasm.exe:这个是把DLL生成IL文件的一个软件,是微软自带了;可以在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin找到...
  • 第一次写博客,也些有些问题。...首先打开exe文件,让它一直保持运行状态,然后打开计算机,在搜索栏中输入你exe文件的名字,找到你一个和你exe名字一样的.jar文件,使用反编译软件打开这个.jar,就可以查看源码了。
  • VS2013添加反编译工具-ILDasm

    万次阅读 2019-09-28 17:23:48
    首先找到ildasm.exe 路径为:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools 然后在vs中点击工具,选择外部工具 标题是自己起的标识名称 命令是ildasm.exe的绝对路径 此时再点击...
  • pyinstaller生成的exe反编译 加壳 pyinstaller 版本高于3.0 命令行: pyinstaller -F -key=xxxxxx --clean xxx.py -F 生成一个单个的exe文件 -key 用于加密Python字节码的密钥 执行exe文件时直接读入...
  • Unity3d-反编译C#和提取资源

    万次阅读 2015-07-15 11:19:53
    使用MonoDevelop查看代码  1.... ...2.拖拽一个Assembly-CSharp.dll文件到MonoDevelop工具栏,即可查看C#...其他C#反编译工具: .NET Reflector:http://www.red-gate.com/products/dotnet-development/reflector
  • 反编译工具Reflector使用方法

    万次阅读 2014-04-24 15:31:39
    1.下载Reflector.FileDisassembler.zip,解压后得到一些文件,其中Reflector.FileDisassembler.dll是已经编译好的,其它是它源码; 2.打开Reflector,在view菜单下的Add-Ins,将Reflector.FileDisassembler.dll添加...
  • 就是用C或者C++之类的写的一个小程序 但是只剩.exe文件了 怎么把源代码找出来?
  • 反编译 jdk1.8 工具 [Procyon-Decompiler]

    万次阅读 2017-06-19 11:03:42
    反编译 jdk1.8 工具javak开发的小伙伴应该都知道,java反...用jd-gui.exe反编译的时候竟然显示不出来了!!! 网上搜了下资料,发现可能有两个问题 1.jd-gui.exe只支持jdk1.7及以下的版本。 2.jdk1.8小版本问题(有同
  • jd-gui.exe反编译查看工具包官方绿色版

    万次下载 热门讨论 2020-07-30 23:32:31
    jd-gui.exe 工具类 用于查看反编译的jar包
1 2 3 4 5 ... 20
收藏数 45,258
精华内容 18,103
关键字:

exe反编译