向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了。

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


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

相关推荐
草梅友仁10 小时前
草梅 Auth 1.4.0 发布与 ESLint v9 更新 | 2025 年第 33 周草梅周报
vue.js·github·nuxt.js
寻月隐君11 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github
CoderJia程序员甲15 小时前
GitHub 热榜项目 - 日榜(2025-08-16)
人工智能·ai·开源·github
python_13618 小时前
web请求和响应
java·spring·github
一宿君1 天前
Github 9 个惊艳的开源 NL2SQL 项目
sql·nlp·github
x10n91 天前
GitHub宕机时的应急协作方案
github
深圳多奥智能一卡(码、脸)通系统2 天前
以下是对智能电梯控制系统功能及系统云端平台设计要点的详细分析,结合用户提供的梯控系统网络架构设计和系统软硬件组成,分点论述并补充关键要点:
github
掘金安东尼2 天前
使用自定义高亮API增强用户‘/’体验
前端·javascript·github
星哥说事2 天前
如何将堡塔云WAF迁移到新的服务器
服务器·git·github
uhakadotcom2 天前
使用postgresql时有哪些简单有用的最佳实践
后端·面试·github