向pycdc项目提的一个pr

向pycdc项目提的一个pr

前言

pycdc这个项目,我之前一直有在关注,之前使用他反编译python3.10项目,之前使用的 uncompyle6无法反编译pyhton3.10生成的pyc文件,但是pycdc可以,但是反编译效果感觉不如uncompyle6。但是版本更新很快,支持的python版本很多。

在issue看到别人提供的pyc文件

我逛github的时候,看看这个项目有没有更新啥新特性,在issue里面看到别人提的issue,带了一个pyc文件。本着乐于助人的态度,也想学习一下这个项目是如何解析pyc文件到py文件的。就下载了这个pyc。看他提的pr。是报了一个Unsupported Node type: 27错误。但是看他发的报错。感觉不止这一个报错。

E:\temp_vc\pycdc\build_v141\Release>pycdc.exe model.pyc >model.py
Unsupported Node type: 27
Unsupported Node type: 27
Unsupported Node type: 27
Unsupported argument found for LIST_EXTEND
Unsupported opcode: LIST_TO_TUPLE
Unsupported opcode: CALL_FUNCTION_EX
Unsupported opcode: DICT_MERGE
Unsupported Node type: 27
Unsupported Node type: 27
Unsupported argument found for LIST_EXTEND
Unsupported opcode: LIST_TO_TUPLE
Unsupported Node type: 27
Unsupported Node type: 27
Unsupported Node type: 27
Unsupported Node type: 27
Unsupported Node type: 27
Unsupported Node type: 27
Unsupported Node type: 27
Warning: block stack is not empty!
Unsupported Node type: 27
Unsupported Node type: 27
Warning: block stack is not empty!
下载项目

OK,先fork一下这个项目,fork完成之后了,这个项目就到你的仓库了。本地的话,就直接git clone一下自己fork的仓库。把项目先下载到本地,准备编译运行,这个pycdc项目是c++写的。用的是cmake进行编译的。

环境说明:

  1. cmake

  2. vs2022

  3. python 3.9

我这边的话,就是这么多了。编译的话很简单,下载cmake后,在项目目录,cmake一下就会自动生成vs项目,打开vs项目编译生成pycdc.exe和pycdas.exe后就行。这个pycdc是将pyc变成py,这个pycdas解析pyc文件,输出python的字节码。

我们随便写个hello,保存为test.py测试一下效果

print("hello,world")

使用命令

python -m py_compile test.py

使用pycdc对生成的test2.cpython-39.pyc进行反编译

可以看到结果,已经反编译成功了。

OK,我们继续

尝试调试程序

我们修改一下这个接受参数,再pycdc.cpp里面。

手动给他加上我们需要的参数,方便后期调试。好了,经过调试。发现问题。

class t(test.t):pass

这样的代码就会报错,会错误的识别为

def t():pass

并且会报错,Unsupported Node type: 27。

经过调试,最终将问题集中到这里ASTree.cpp

 while (TOS_type == ASTNode::NODE_NAME) {bases.resize(basecnt + 1);bases[basecnt] = TOS;basecnt++;stack.pop();TOS = stack.top();TOS_type}

这个地方,CALL_FUNCTION_A字节码这个位置。因为我们传参的是test.t。这个玩意被识别为NODE_BINARY。没有被识别为:NODE_NAME 。导致这个while循环没进入,这个NODE_NAME没有被清除,导致后面一些解析错误。变成这样就可以了

 while (TOS_type == ASTNode::NODE_NAME || TOS_type == ASTNode::NODE_BINARY) {bases.resize(basecnt + 1);bases[basecnt] = TOS;basecnt++;stack.pop();TOS = stack.top();TOS_type = TOS.type();}

修改完毕后,

git add ASTree.cpp
git commit -m "fix"
git push

上传到我们自己的仓库。

提交pr

我们就可以向源项目提交pr了,说明一下自己的修改的原因,以及效果。就可以了。我这边的话,是自己提交了一个issue,在issue里面说了这个报错。提交的pr链接的这个issue。

等待被合并

我这边大概等了一个星期左右。(我猜是为python3.12做适配了,回复我那天就更新了python3.12适配,并且后面回复就很及时了)作者回复我了,让我加一些测试文件进去。我加了之后。因为有时差,作者回复一般都是晚上12点以后了。我加完测试文件后。第二天我的请求就被merge了。

整个流程就完成了,我也成为这个项目的贡献者了,虽然实际修改代码只有一行(偷偷的笑)。


 今天就到这里,如果您觉得不错,欢迎关注。如有错误,欢迎私聊指正。

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

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

相关文章

BGP笔记

自治系统----AS AS划分的原因:如果网络太大,路由数量进一步增加,路由表规模变得太大,会导致路由收敛速度变慢,设备性能消耗加大,且全网设备对于路由信息的认知不同,造成流量通讯障碍 AS号&…

Shader的组成部分Fallback

文档 Fallback 作用 SubShader都不起作用的时候,使用Fallback确保有备有的shader起作用 语法 Fallback "Shader名字” 不使用备用shader Fabllback Off

快慢指针思想(Hare Tortoise 算法)

目录​​​​​​​ 一、快慢指针概念 二、常用场景 2.1 寻找倒数第k个节点 2.2 判断回文链表 2.3 用于判断链表中是否存在 “环” 2.4 用于判断存在“环”的链表中,“环”的起始位置 一、快慢指针概念 快慢指针是一种常用的数据结构思想,主要用于…

Django批量插入数据及分页器

文章目录 一、批量插入数据二、分页1.分页器的思路2.用一个案例试试3.自定义分页器 一、批量插入数据 当我们需要大批量创建数据的时候,如果一条一条的去创建或许需要猴年马月 我们可以先试一试for循环试试 我们首先建立一个模型类来创建一个表 models.py&#xff…

腾讯云代金券怎么领取(腾讯云代金券在哪领取)

腾讯云代金券是可抵扣费用的优惠券,领券之后新购、续费、升级腾讯云相关云产品可以直接抵扣订单金额,节省购买腾讯云的费用,本文将详细介绍腾讯云代金券的领取方法和使用教程。 一、腾讯云代金券领取 1、新用户代金券【点此领取】 2、老用户…

5、基础入门——资产架构端口应用WAF站库分离负载均衡

资产架构 目录型网站安全:一个IP对应一个域名(bbs.xiaodi8.com),该域名(bbs.xiaodi8.com)下有一个网站,该域名的某个目录下(bbs.xiaodi8.com/blog)也有一个网站。 端口型…

【软考】文件的组织结构

目录 一、说明二、逻辑结构2.1 说明2.2 记录式文件2.2.1 说明2.2.2 顺序文件2.2.3 索引文件2.2.4 索引文件 2.3 流式文件 三、物理结构3.1 说明3.2 链接方式之隐式链接3.3 链接方式之显式链接 一、说明 1.组织结构是文件的组织形式。 2.逻辑结构为用户可见的的文件结构。 3.物理…

模拟量采集----测量输入的电压

生活中的模拟量有很多 大多都为电压信号和电流信号 今天讲如何测量输入的电压信号 由图中的黄线可知,该运放是采用的同相放大器中的电压跟随器 电压跟随器的特点是电压的输入和输出隔离 同相运放的输入与输出的关系是:输出1R2/R1 在图上对应的就是输…

大数据安全 测试

测试1、用户 hive/1.common2.hadoop.fql.comLEXIN.COM 和 nn/1.common2.hadoop.fql.com 分别对 Hive 进行查询 &#xff08;1&#xff09;HDFS 配置 vim /usr/local/fqlhadoop/hadoop/conf/core-site.xml <property><name>hadoop.proxyuser.hive.hosts</name&g…

linux基本指令以及热键

基本指令 ♥clear ♥whoami ♥who ♥pwd ♥ls指令&#xff08;重点&#xff09; ls -a&#xff1a; ls -l ♥mkdir ♥cd指令 ♥touch指令 ♥stat指令 ♥rmdir指令 && rm 指令 ♥man指令 ♥nano指令 ♥cp指令 ♥mv指令 ♥cat指令 &#x1f5e1;输出/输出重定向 &#x1…

HBase之BlockCache

目录 BlockCacheLruBlockCacheBucketCacheCompressed BlockCache注意点 BlockCache 用于缓存从hdfs读的数据&#xff0c;有两种不同的实现&#xff0c;LruBlockCache(利用堆内存)和BucketCache(利用非堆内存) LruBlockCache 使用LRU算法 Single access级&#xff1a;首次从…

腾讯云HAI域AI作画

目录 &#x1f433;前言&#xff1a; &#x1f680;了解高性能应用服务 HAI &#x1f47b;即插即用 轻松上手 &#x1f47b;横向对比 青出于蓝 &#x1f424;应用场景-AI作画 &#x1f424;应用场景-AI对话 &#x1f424;应用场景-算法研发 &#x1f680;使用HAI进行…

【链表的说明、方法---顺序表与链表的区别】

文章目录 前言什么是链表链表的结构带头和不带头的区别 链表的实现&#xff08;方法&#xff09;遍历链表头插法尾插法任意位置插入一个节点链表中是否包含某个数字删除链表某个节点删除链表中所有关键字key清空链表所有节点 ArrayList 和 LinkedList的区别总结 前言 什么是链…

代码随想录二刷 | 链表 | 删除链表的倒数第N个节点

代码随想录二刷 &#xff5c; 链表 &#xff5c; 删除链表的倒数第N个节点 题目描述解题思路 & 代码实现双指针法 题目描述 19.删除链表的倒数第N个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入…

8、信息打点——系统篇端口扫描CDN服务负载均衡WAF

文章目录 获取网络信息获取服务信息获取阻碍信息 获取网络信息 服务器厂商信息&#xff08;阿里云&#xff1f;腾讯云&#xff1f;&#xff09; 收集的原因&#xff1a;如果服务器架设在云上&#xff0c;不同厂商的一些配置信息不同。判断方法&#xff1a;直接在ip/域名网站搜相…

整套数字化招采平台安全防御体系

招采平台作为数字化供应链的重要组成部分&#xff0c;需要确保招标采购过程的安全性,主体信息和交易数据信息尤为重要,通过必要的安全架构、技术和安全管理制度&#xff0c;做到事前防范、事中监管和事后审计的安全防御。 一、平台技术安全架构 1、先进的技术架构&#xff0c…

MeterSphere | 在接口自动化场景中,设置全局Token方法

目标 在接口自动化场景中&#xff0c;设置全局Token方法 方法 -- BeanShell 语言 // 导包 import org.json.*;// 创建sign值 String response prev.getResponseDataAsString();JSONObject responseJson new JSONObject(response);String token responseJson.get("bo…

java中stream常用api介绍

stream相关api对于集合操作非常方便&#xff0c;可以通过链式编程完成数据的处理&#xff0c;有时候很复杂的数据处理通过使用stream的相关api可以非常方便的完成&#xff0c;使用lambda表达式更可以简化为一行代码&#xff0c;下面就介绍一下stream的相关api方法&#xff0c;感…

Latex学习

二 实例 1. \Delta_{w}\frac{\partial l}{\partial w_{i1}}weight:\frac{\partial l}{\partial x_{i1}} 效果如下 其中对于希腊字母的大小写来说&#xff0c;可以参考&#xff1a; 【LaTeX 语法】字母表示 ( 大写、小写、异体 希腊字母 | 粗体字母 | 花体字母 )_latex字母_韩…