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

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("完成")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

英语广场期刊投稿发表论文

《英语广场》是由国家新闻出版总署批准的正规期刊,杂志本着“轻松读原作,快乐学英语”的宗旨,倡导“寓学于乐”的学习理念,其活泼的办刊风格和优秀的文章选材受到读者特别是广大中学生的广泛欢迎,取得了良好的社会效益…

redis 的设计与实现(三)——对象

1. 前言: 在第一章节我们了解到了,redis底层所涉及的数据结构,但是这并非是离我们最近的一层,在此之上,redis实现了一层对象与我们交互。我们在本篇内容中将了解到: 对象对应的实现redis一些常用特性的实现…

数字化坚鹏:小熊电器面向数字化转型的大数据顶层设计实践培训

小熊电器面向数字化转型的大数据顶层设计实践培训圆满结束 ——努力打造“数据技术营销”三轮驱动的数字化领先企业 小熊电器股份有限公司由李一峰创立于2006年,是一家专业从事创意小家电研发、设计、生产和销售的实业型企业。2019年8月23日正式在深交所挂牌上市。…

rust使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

想要在不同的平台上运行flutter doctor命令,就需要知道对应的平台是windows还是linux,如果是windows就需要调用cmd命令,如果是linux平台,就需要调用sh命令,所以可以通过cfg!实现不同平台的判断,然后调用不同…

【21-40】操作系统基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【21-40】操作系统基础知识(非常详细)从零基础入门到精通,看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用44、程序从堆中动态分配内存时,虚拟内存上怎么操作的45、常见的几种磁盘调度算法1. 先来…

codesys通过moudbus TCP连接西门子1214c,西门子做客户端

思路在codesys中发送数据到西门子,西门子原封不动的将数据传回。 1.首先配置codesys; 我设置了500个,但是好像发不这么多,只能120多个。因为什么来我忘了。但是这里不影响。 2.配置映射: 3.写代码 PROGRAM PLC_PRG VARarySendDa…

URL编码:原理、应用与安全性

title: URL编码:原理、应用与安全性 date: 2024/3/29 18:32:42 updated: 2024/3/29 18:32:42 tags: URL编码百分号编码特殊字符处理网络安全应用场景标准演变未来发展 在网络世界中,URL(统一资源定位符)是我们访问网页、发送请求…

Laya1.8.4 UI长按选择对应位置释放技能

需求: 需要实现拖拽摇杆选择技能释放位置,释放技能。 原理:首先拆分需求,分为两部分,UI部分和场景部分,UI部分需要实现长按效果,长按后又要有拖动效果,将官方文档的示例代码改了改…

HANA-公司间销售ICS-IDOC系统配置-保姆级配置文档

HANA公司间销售ICS-IDOC系统配置—保姆级配置文档 在项目实施过程中经常会遇到关联方交易的问题,有公司间采购的业务场景,也会存在公司间销售的业务场景,本文将着重讲解公司间销售在SAP系统中的实现场景。很多公司会在香港设置一个公司用于对外的销售接单,然后将接到的销售…

企业微信知识库:从了解到搭建的全流程

你是否也有这样的疑惑:为什么现在的企业都爱创建企业微信知识库?企业微信知识库到底有什么用?如果想要使用企业微信知识库企业应该如何创建?这就是我今天要探讨的问题,感兴趣的话一起往下看吧! | 为什么企业…

小白python爬虫基础教程(看这一篇就完了)

爬虫的五个步骤: 1)需求分析,找到需求相关的网址 2)获取网址的返回信息(urllib,requests) 3)定位需要的信息所在位置(re正则表达式,XPATH, CSS selector) 4&#xff…

argo rollout使用

一、前言 argorollout是比argocd更高级的发布工具,其中包含自动化金丝雀发布、自动化蓝绿发布、还可以通过argo命令或者dashboard查看发布的过程 二、使用 需要先部署argo rollout服务 参考:https://github.com/argoproj/argo-rollouts/tree/master/m…

关于web_server项目的学习记录(自用)

主要参考资料: 我在地铁吃闸机 基础处理框架:Multi-reactor muduo库有三个核心组件实现持续监听reactor的fd:channel;epoll/poller/eventloop类 channel 事件监听器epoll_ctl监听到了fd发生了什么事件,channel类会封装每个fd和fd感兴趣的事…

036—pandas 按行将列名根据值由大到小排序

前言 数据处理中,按行排列的列名可以提供更直观的数据探索和分析方式。 你可以逐行查看列名,了解每列的含义和特征,有助于更好地理解数据集的结构和内容。 需求: 需要增加一列「分布方式」,每行的值是本行基金名称对…

C++多线程:thread构造源码剖析与detach大坑(三)

1、thread源码浅剖析 基于Ubuntu18.04版本64位操作系统下进行分析thread源码分析,与Window或者其他版本可能有出入。 1.1、thread线程id的源头 typedef pthread_t __gthread_t; typedef __gthread_t native_handle_type;/// thread::id class id {native_handl…

常用类(日期时间)

目录 一、JDK 8之前的日期时间API1.1、System类中获取时间戳的方法1.2、Java中两个Date类的使用1.3、SimpleDateFormat的使用1.4、Calendar日历类的使用 二、JDK8中日期时间API的介绍2.1、LocalDate、LocalTime、LocalDateTime的使用2.2、Instant类的使用2.3、DateTimeFormatte…

Abaqus模拟新能源汽车电池理论概念

在新能源汽车电池的分析过程中,存在众多典型问题,这些问题跨越了机械、热管理和电气三大关键领域。其中,结构仿真分析作为一种重要的技术手段,主要聚焦于解决机械和热管理方面的挑战,为电池系统的性能优化和安全性提升…

集合(未完。。。)

集合 例题引入1.java集合引入2.为什么要使用集合?3.List、Set、Queue和Map的区别4.ListList——ArrayList(!!实用!!)ArrayList常用方法 List——VectorList——LinkedList 5.Set6.MapHashMapHas…

【CTFshow 电子取证】套的签到题

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

Spring 源码调试问题 ( List.of(“bin“, “build“, “out“); )

Spring 源码调试问题 文章目录 Spring 源码调试问题一、问题描述二、解决方案 一、问题描述 错误&#xff1a;springframework\buildSrc\src\main\java\org\springframework\build\CheckstyleConventions.java:68: 错误: 找不到符号 List<String> buildFolders List.of…