精华内容
下载资源
问答
  • python 反编译exe文件为py文件 万次阅读 热门讨论
    2018-11-17 00:53:01

    我们用pyinstaller把朋友文件打包成exe文件,但有时候我们需要还原,我们可以用pyinstxtractor.py
    用法:

    python pyinstxtractor.py xxx.exe

    之后得到一个这样结构的文件夹


     

    --- xxx.exe_extracted
       -- out00-PYZ.pyz_extracted
          - 各种.pyc文件
       -- out00-PYZ.pyz
       -- some
       -- others
       -- xxx(注意这些都是没后缀的)

    然后再终端pip install uncompyle安装uncompyle,

     

    然后就可以使用啦
     

    uncompyle6 input.pyc > output.py

    把pyc文件转换为py文件,希望对大家有帮助

    最后贴上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()

     

    更多相关内容
  • 反编译exe工具

    2019-02-13 13:57:41
    对于pyinstaller生成的exe解压之后的pyc乱码文件 ,生成可以阅读的源码,完成了反编译
  • java反编译exe

    2018-06-09 20:40:58
    图形界面的反编译软件,安全无毒,解压后即可使用。jd_gui.exe分享给大家,好用给好评
  • 环境python 3.6 准备工具 uncompyle6 pip pyinstaller ...2、把pyinstxtractor.py和exe文件放在同个目录下 打开cmd,进入该目录,输入: python2 pyinstxtractor.py xx.exe • 1 运行后生成xx.exe_extracted文件夹。
  • 反编译Exe

    千次阅读 2020-07-22 16:59:43
    本文只能破解指定类型的exe; 本文仅针对用exe4j打包java运行程序生成的exe。 此类exe的特点:exe一启动,就会转成jar来运行。所以本质是寻找核心jar并破解jar的过程。 (对exe4j有兴趣的,可自行下载研究:点我下载...

    前言

    本文只能破解指定类型的exe;
    本文仅针对用exe4j打包java运行程序生成的exe。
    此类exe的特点:exe一启动,就会转成jar来运行。所以本质是寻找核心jar并破解jar的过程。
    (对exe4j有兴趣的,可自行下载研究:点我下载exe4j-win-64位)

    准备

    待破解的exe,jar破解工具jd-gui【点我下载

    实战

    第一步:运行exe

    运行exe,记下此刻时间

    第二步:找到jar包所在文件夹

    C:\Users\你的用户名\AppData\Local\Temp\目录下查找相关文件夹。
    在这里插入图片描述

    窍门1:通过exe的启动时间,找到同一时刻修改的文件夹,进入即可
    窍门1:假设运行的是abc.exe,假设其中的核心jar也是abc.jar,那么可以在C:\Users\你的用户名\AppData\Local\Temp\目录下直接搜索abc.jar,进入其所在文件夹即可。
    jar包所在文件夹内容如下:(不同的exe实际情况有所不同)
    在这里插入图片描述

    第三步:反编译核心jar

    通过第二步,我们已经来到了相关文件夹。显然前几个jar都是现成的,只有最后一个是手工写的,所以最后这个就是我们需要破击的jar。
    打开jd-gui,导入核心jar,即可查看源码,效果如下:
    在这里插入图片描述

    展开全文
  • 我们用pyinstaller把朋友文件打包成exe文件,但有时候我们需要还原,我们可以用pyinstxtractor.py 用法: python pyinstxtractor.py xxx.exe 之后得到一个这样结构的文件夹 --- xxx.exe_extracted -- out00-PYZ....
  • dnSpy 反编译exe

    2021-06-12 23:02:02
    dnSpy中文版是一款net程序反编译工具,可以对net程序进行反编译,还有替代库文档的功能,如果遇到了代码丢失或者损坏的情况,可以直接恢复 软件特色 1、无需设置 由于它是一个便携式工具,它不需要您将其安装在目标...

    学习地址:https://search.bilibili.com/all?keyword=dnspy
    下载地址:https://github.com/dnSpy/dnSpy/releases
    dnSpy中文版是一款net程序反编译工具,可以对net程序进行反编译,还有替代库文档的功能,如果遇到了代码丢失或者损坏的情况,可以直接恢复

    软件特色

    1、无需设置

    由于它是一个便携式工具,它不需要您将其安装在目标计算机上,因为只需拆包其存档并启动可执行文件即可完全访问其功能。

    您还可以从可移动存储介质(如USB闪存驱动器或外部HDD)运行它。此外,它不会修改系统中的注册表项,也不会在您的PC上生成其他文件或文件夹,但未经您的明确许可。

    2、综合界面

    dnSpy配备了一个时尚,全面的用户界面,包含广泛的有用功能,它们整齐地组织在主窗口的标准菜单中。

    更重要的是,它具有标准配置窗口,您可以在其中调整各种组件的设置,如其反编译器,调试器或十六进制编辑器,但也可以修改显示或其他参数。

    3、.NET反汇编程序

    如果您需要一个高效的工具,可以通过为您提供各种有用的工具来帮助您反编译.NET程序集,您可以转到dnSpy。它配有一个反编译器,一个调试器,一个十六进制编辑器和一个程序集编辑器,让你以有效的方式处理程序集。

    主窗口附带了一个Assembly Explorer窗格,您可以在其中访问所需程序集的树视图。您可以通过从计算机指定适当的文件或使用“从GAC打开”选项打开程序集,该选项为您提供全局程序集缓存中可用的条目列表。

    4、.NET程序集的可靠反向工程工具

    所有考虑的事情,dnSpy是一个方便的应用程序,使您能够以有效的方式逆向工程.NET程序集,为您提供广泛的有用工具,包括反编译器,程序集编辑器和调试器。它不需要安装,具有全面,平滑的用户界面,并为您提供了一个标准配置窗口,您可以在其中调整各种组件的设置。

    使用

    展开全文
  • 易语言模块反编译.exe

    2020-07-15 13:08:35
    一键反编译易语言模块 支持带密码的,一直在用挺好用的
  • 【安全,亲测】易语言模块反编译工具.exe
  • 内容索引:VB源码,文件操作,反编译 VB 反编译工具,不要被吓着了,这可不是真正的反编译哦,要是的话程序员们可惨了,它实质上是一个EXE文件查看器,可以把VB编译后生成的EXE文件结构分析出来,包括窗体、模板、类、...
  • 反编译exe文件并替换图片资源

    千次阅读 2022-03-25 22:33:01
    简单地反编译替换图片示例

    目录

    背景

    工具

    步骤​​​​​​​

    下载链接

    其他


    背景

    拿到一个exe文件,需要替换其中的某个图片(当然也可以是添加、修改代码)。

    工具

    查壳软件:exeinfo

    反编译软件:dnSpy

    (软件下载链接在文末)

    步骤

    1、先查壳,看他是用了什么壳和什么语言写的,这里以RDCMan软件为例。

     2、使用反编译软件打开exe文件。dnSpy可以说是最厉害的一款C#/.NET反编译软件。

     可以直接看到详细代码

     3、资源文件一般在“资源”或者“resource”路径下。选择需要替换的图片,右击并选择“编辑资源”。

            经测试,如果是bmp等图片类型的,这里可以直接选择文件。但目前是ico文件,因此可以先删除这个旧文件,再点“创建文件资源”来新建一个同名的。

            这里我选择了这个ico文件。

     4、保存并运行试一下效果。

     有弹框就点“确定”

     可以看到已经修改成功了: 

    其他修改也是类似的。

    下载链接

    反编译软件http://xfxuezhang.cn/web/share/%E8%BD%AF%E4%BB%B6-%E7%94%B5%E8%84%91/%E5%8F%8D%E7%BC%96%E8%AF%91.zip

    其他

    现在很少软件会不加壳裸奔,在脱壳上也需要再花上一点功夫。

    展开全文
  • netbox 反编译exe提取asp逆向解压解密解包
  • - E2A.EXE - 汇编 - A2APARSE.EXE - 汇编预处理 - E2C.EXE - 转换 A2A.EXE 的结果到 pseudo-C - ENVMNU.EXE - 前几个文件的集成环境 最简单的使用方法是运行 ENVMNU, 如果你想使用参数就在DOS命令行上运行 ...
  • python反编译成.py获得源码所需要的文件
  • 对于pyinstaller生成的exe文件 使用方法pyhton pyinstxtractor.py xx.exe
  • Delphi写的EXE反编译工具,软件名称:反编译 WebCompiler,含有完整源码,本次版本修正了一处 bug, 修正了文件压缩与否的判别方式, 也稍稍增强了用户界面.  前段时间在做一个文档时需要得到一个 WebCompiler 生成...
  • 『.Net·使用ILSpy反编译exe或dll文件保存为项目结构』 编写人 | SCscHero 编写时间 | 2021/6/1 PM11:56 文章类型 | 系列 完成度 | 已完成 座右铭 每一个伟大的事业,都有一个微不足道的开始。 ...
  • 使用reflector反编译exe文件和dll文件

    千次阅读 2018-10-14 11:12:52
    使用reflector反编译exe文件和dll文件使用reflector反编译exe文件和dll文件 使用reflector反编译exe文件和dll文件 由于数据库迁移,导致原来的单机软件需要更改一下数据库连接。直接使用reflector查看exe文件和dll...
  • ilspy反编译工具是一款强大的.net平台反编译软件,使用ilspy反编译工具,可以轻松的反编译C#及VB程序,软件本身是C#程序,是一款开源软件。 步骤: 1,文件-打开-选中exe文件 2,点击导入进来的第一层级,选择...
  • VC反编译工具(Depends.exe),用于查看以及分析动态库dll的依赖项以及里面包含的函数名和变量的情况。 LoadLibrary和GetProcAddress等函数出错的时候经常用大这个工具来分析。
  • EXE反编译工具VB源码

    2016-02-04 10:24:45
    EXE反编译工具VB源码,很小的一个程序。解压密码是www.hackbase.com。
  • delphi反编译工具

    2018-09-18 10:57:58
    delphi反编译工具,支持各种delphi版本的开发的exe,dll程序的反编译
  • 序 ...二、反编译exe文件 三、防止反编译 正文 一、python如何打包成exe (常规打包方法) 1.1首先你要先把自己的程序写好,在pycharm中运行正常。我的程序文件目录结构如下图所示: 1....
  • 反编译exe/dll 工具

    2017-11-11 16:29:54
    反编译工具 isam 可以 在 没有源码的情况下 更改编译过的程序的行为
  • dnSpy反编译EXE或DLL

    千次阅读 2019-08-13 15:01:28
    ①使用dnSpy工具对刚才生成的ChangeString.exe进行反编译,如下图所示: ②在Main函数内右键点击菜单,在弹出的上下文菜单中选择"编辑方法(C#)",如下图所示: ③将str变量的内容改为"Just For Test",并点击...
  • 对于反编译的程序集,它既可以将其保存在一个文件中,也可以为所有文件创建一个项目。ILSpy是一个独立的工具,没有Visual Studio集成。,ILSpy 是为了完全替代收费的Reflector而生,它是由 iCSharpCode 团队出品,这...
  • .class反编译工具

    2018-11-21 10:19:02
    上传一个反编译.class文件的小工具,英文的,不喜勿喷
  • 使用VB6实现EXE程序反编译工具
  • ILSpy4.0反编译工具

    2018-10-05 13:56:29
    ILSpy是开源.NET程序集浏览器和...反编译为C# 整个项目反编译(csproj,而不是sln!) 搜索类型/方法/属性(子串) 基于超链接的类型/方法/属性导航 基础/派生类型导航,历史 BAML到XAML反编译器 可扩展的插件(MEF)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,633
精华内容 21,453
关键字:

如何反编译exe

友情链接: Rotating-umbrella.rar