python3将exe 转支持库错误 AssertionError: None does not smell like code

news2024/11/26 2:42:14

exe -> pyc包(*.exe_extracted)

安装反编译工具

exe反编译工具:pyinstxtractor.py下载:https://sourceforge.net/projects/pyinstallerextractor/

python pyinstxtractor.py hello.exe

包反编译

懒的写!!! 这有详细说明

https://blog.csdn.net/qq_45100200/article/details/128485152

支持库部分(重点)

需要工具 uncompyle6

pip install uncompyle6

反编译

支持库一般是 PYZ-00.pyz_extracted 文件夹

命令

uncompyle6 hello.pcy -> hello.pc 

反编译错误!

由于支持库的pyc 文件也缺少了一部分
8-12字节的描述符
所以反编译会报 AssertionError: None does not smell like code

解决办法 手动补全

手动替换08–12 的字节(08-11 插入 12-15改写)
在这里插入图片描述
改写为以下内容
在这里插入图片描述

脚本处理(人类因为懒 才有了文明的进步)

不废话 直接上脚本

# -*- encoding:utf-8 -*-

# uncompyle6 支付库 pcy -> py
# 错误 AssertionError: None does not smell like code
# 由于在 第8字节缺少4字节描述符 导致失败 _PCY_Z_ADDBYTES
# 将 _PCY_Z_ADDBYTES 填入后完成
import os
import sys


class PyCException(Exception):
    pass


_PCY_Z_ADDBYTES = b"pyi0" + bytes([0x10, 0x02, 0x00, 0x00])
_PCY_Z_HEAD = bytes([0x42, 0x0d, 0x0d, 0x0a])


def loadFile(aFile: str) -> bytes:
    with open(aFile, 'rb') as f:
        buf = f.read()
    return buf


def getFileName(aFileName):
    sl = os.path.basename(aFileName).rsplit('.', 1)[0]
    return sl


def getFileSuffix(aFileName):
    return aFileName.split(".")[-1]


class TPycZDecode():
    def __init__(self, aFile: str) -> None:
        self.fileName = aFile
        self.buf = loadFile(aFile)

    def _isPyc(self):
        print(self.buf[:4], _PCY_Z_HEAD)
        if self.buf[:4] != _PCY_Z_HEAD:
            raise PyCException("不是pyc支持库文件:%s" % self.fileName)

    def _isEncyrpt(self):
        # print(self.buf[9:10], self.buf[9:10] == bytes([0]))
        return self.buf[9:10] == bytes([0])

    def _addCode(self):
        if self._isEncyrpt()
        self.buf = self.buf[:8] + _PCY_Z_ADDBYTES + self.buf[12:]
        # print(self.buf[:15])

    def _isModule(self):
        """ 插入代码后判断 是模块 __init__.py 还是 模块内文件"""
        ret_path = ''
        # print(self.buf[0x01d:0x1d+4])
        v = int.from_bytes(self.buf[0x01d:0x1d+4], byteorder='little')
        # print(v)

        if v == 1:
            slen = int.from_bytes(self.buf[0x43:0x43+1], byteorder='little')

            # print(self.buf[0x44:0x44 + slen])

            s = self.buf[0x44:0x44 + slen].decode()
            # print(s)
            ret_path = s

        return ret_path

    def decode(self, aNewPath):
        self._isPyc()
        self._addCode()

        if not os.path.isabs(aNewPath):
            aNewPath = os.path.join(os.getcwd(), aNewPath)

        path = os.path.dirname(self.fileName)

        path_m = self._isModule()

        if path_m == '':
            # 模块文件
            file_name = getFileName(self.fileName)
            path_m = file_name.replace('.', '/') + '.py'
        else:
            path_m = path_m

        path_m = os.path.join(aNewPath, path_m)

        os.makedirs(os.path.dirname(path_m), exist_ok=True)

        # 打完补丁的文件 写回
        with open(self.fileName, 'wb') as f:
            f.write(self.buf)

        cmds = "uncompyle6 %s > %s " % (self.fileName, path_m)
        print(cmds)
        os.system(cmds)


def decode_dir(path, newPath=''):
    print(dirPath)

    if newPath == '':
        newPath = os.path.join(os.getcwd(), 'pycs-d')

    for root, dirs, files in os.walk(path):
        for file in files:
            if getFileSuffix(file) == 'pyc':
                print(file)
                file_path = os.path.join(root, file)
                print(file_path)

                try:
                    pycf = TPycZDecode(file_path)
                    pycf.decode(newPath)
                except Exception as e:
                    print(e)


def test_decodePyc():
    file = 'D:\mYcode\pthon\pcy'
    pycf = TPycZDecode(file)
    pycf.decode('pycs-d')


if __name__ == '__main__':
    # decode_dir('D:\\mYcode\\pthon\\pcy')
    # 将 pyc文件放在 脚本根目录 pycs-e 文件夹下
    # 解密文件生成在 脚本根目录 pycs-d 内

    if len(sys.argv) > 1:
        dirPath = sys.argv
    else:
        print("没有参数 路径默认 ./pycs-e")
        dirPath = os.path.join(os.getcwd(), 'pycs-e')
        try:
            os.mkdir(dirPath)
        except Exception as e:
            pass

    if not os.path.exists(dirPath):
        print('路径错误:%s' % dirPath)
        exit(1)

    decode_dir(dirPath)

    print("完成")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1554442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【项目技术介绍篇】若依开源项目RuoYi-Cloud后端技术介绍

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

Matlab|电动汽车充放电V2G模型

目录 1 主要内容 1.1 模型背景 1.2 目标函数 1.3 约束条件 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序主要建立电动汽车充放电V2G模型,采用粒子群算法,在保证电动汽车用户出行需求的前提下,为了使工作区域电动汽车尽可能多的消…

跳跃游戏-java

题目描述: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 解题思想: …

【MySQL】事务日志

事务的隔离性由锁机制实现,事务的原子性、一致性和持久性由redo日志和undo日志实现。 一、redo日志 1.1、为什么需要redo日志 一方面,由于数据从内存写回磁盘需要一定的时间,假如在事务提交后,还没有写回磁盘,数据库…

中小型集群部署,Docker Swarm(集群)使用及部署应用介绍

1、Docker Swarm简介 说到集群,第一个想到的就是k8s,但docker官方也提供了集群和编排解决方案,它允许你将多个 Docker 主机连接在一起,形成一个“群集”(Swarm),并可以在这个 Swarm 上运行和管…

unity3d for web

时光噶然 一晃好多年过去了(干了5年的u3d游戏),记得最后一次使用的版本好像是 unity 2017。 那个是 unity3d for webgl 还需要装个插件。用起来很蛋疼。 最近做一个小项目 在选择是用 Layabox 还是 cocosCreate 的时候 我想起了老战友 Uni…

你管这破玩意叫网络

你是一台电脑,你的名字叫 A 很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。 直到有一天,你希望与另一台电脑 B 建立通信,于是你们各开了一个网口,用一根网线连接了起来。 用一根网线连接起来怎么就能…

开始时间大于结束时间

1.dom中代码&#xff0c;监听所选日期值的变化&#xff0c;并把需要比较的时间字段作为参数传到监听方法中&#xff0c; <el-form-item label"起始日期" prop"startTime"><el-date-picker clearable size"small":disabled"isDisa…

如何使用Docker搭建WBO在线协作工具并实现无公网IP远程编辑本地白板

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

写作类AI推荐(一)

本章要介绍的写作AI如下&#xff1a; paperpal 特点&#xff1a; 面向科研人员的AI写作工具。可以选择自己的专业&#xff0c;如本科生/教授。 链接&#xff1a;Paperpal-专业AI论文润色与论文检测平台 笔灵 特点&#xff1a; 面向专业写作领域的AI写作工具。可以选择要写的文章…

Apache Kafka + 矢量数据库 + LLM = 实时 GenAI

公众号&#xff1a;Halo咯咯 生成式人工智能 (GenAI) 支持先进的人工智能用例和创新&#xff0c;但也改变了企业架构的外观。大型语言模型 (LLM)、向量数据库和检索增强生成 (RAG) 需要新的数据集成模式和数据工程最佳实践。 Apache Kafka 和 Apache Flink 的数据流在大规模实时…

人体检测web应用

本文是一个深度学习模型web页面部署的一个demo&#xff1b;具体是利用yolox人体检测模型通过flask接口接收前端请求&#xff0c;利用简单的html页面展示检测结果。 文章目录 1、代码结构2、封装YOLOX检测类3、定义flask接口 代码地址&#xff1a; https://github.com/lishanl…

数字乡村战略实施:科技引领农村经济社会全面发展

随着信息技术的快速发展&#xff0c;数字化已经成为推动经济社会发展的重要力量。在乡村振兴战略的大背景下&#xff0c;数字乡村战略的实施成为了引领农村经济社会全面发展的关键。本文将从数字乡村战略的内涵、实施现状、面临挑战及未来展望等方面&#xff0c;探讨科技如何引…

快排(六大排序)

快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所…

C语言例4-35:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡、问鸡翁、鸡母和鸡雏各几何?

方法一&#xff1a; 代码如下&#xff1a; //鸡翁一&#xff0c;值钱五&#xff1b;鸡母一&#xff0c;值钱三&#xff1b;鸡雏三&#xff0c;值钱一。百钱买百鸡、问鸡翁、鸡母和鸡雏各几何&#xff1f; //方法一&#xff1a; #include<stdio.h> int main(void) {int x…

面向对象-接口

面向对象-接口 1. 接口的概念 ​ 接口就是规范\规则&#xff0c;我们可以使用接口来定义一些规则&#xff08;比如要求某个方法的方法名必须叫什么&#xff0c;方法的参数列表必须是什么&#xff0c;方法的返回值类型必须是什么&#xff09; ​ 现实生活中的规范 2. 接口的…

资讯头条P3自媒体搭建

自媒体素材管理与文章管理 一.后台搭建 1.1 搭建自媒体网关 导入网关模块>>>在网关模块的pom.xml文件中添加该子模块>>>刷新maven <modules><module>heima-leadnews-app-gateway</module><!--新增--><module>heima-leadnew…

HarmonyOS 应用开发之UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启动三方支付UIAbility&#xff09;。 本文将从如下场景…

使用优化型读取和 pgvector,提高 Amazon Aurora 上生成式 AI 工作负载的性能

生成式 AI 为企业带来了更多的机会&#xff0c;可以构建需要搜索和比较非结构化数据类型&#xff08;例如文本、图像和视频等&#xff09;的应用程序。通过 嵌入体 或 向量&#xff0c;以机器可读的格式捕获这些非结构化数据的含义和上下文&#xff0c;然后基于这种方法&#x…

C语言结合体和枚举的魅力展现

前言 ✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱’博客 所属栏目&#xff1a;人工智能 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 引言: 前面我们已经讲了结构体的声明&#xff0c;自引用&#xff0c;内存…