资讯动态

pycdc 反编译 Python 3.13 字节码指南:从 .pyc 到源码只需三步

发布时间:2026/10/17 10:08:31 来源:尧图企业网站定制
pycdc 反编译 Python 3.13 字节码指南从 .pyc 到源码只需三步【免费下载链接】pycdcC python bytecode disassembler and decompiler项目地址: https://gitcode.com/GitHub_Trending/py/pycdcpycdcDecompyle已经能读懂 Python 3.13 的字节码了——把 3.13 编译出来的.pyc丢给它就能拿回反汇编清单或可读的 Python 源码。这是目前少有的从 Python 1.0 一路覆盖到 3.13 的 C 字节码工具对拿着新字节码却找不到反编译手段的逆向、审计和教学场景来说这次升级直接补上了缺口3.13 重排了整张指令表工具还顺手补上了 9 条全新的仪器化指令。先上结果一个 .pyc 进去指令清单和源码出来不聊原理先看效果。工具链提供两个可执行文件各管一件事pycdas负责逐条列出字节码pycdc负责把指令流还原成接近手写的 Python 代码。先用反汇编器看一个 3.13 编译的.pyc确认工具能正确解读 3.13 的指令编号./pycdas tests/compiled/example.3.13.pyc输出按“行号 偏移 指令 参数”四列排列3.13 的插桩指令会以本来面目出现下面是示意实际参数取决于编译方式4 4 FORMAT_SIMPLE 0 6 6 INSTRUMENTED_CALL_A 2 (func) 8 8 INSTRUMENTED_LINE_A 3想要源码就用反编译器输出直接打到 stdout./pycdc tests/compiled/example.3.13.pyc out.py跑出来的就是可以直接读、可以 diff 的 Python 源码。版本判断不需要你操心.pyc文件头部的 magic number 对应固定的 CPython 版本pycdc 读到什么号就自动加载什么版本的指令表遇到不认识的版本会在 stderr 报Unsupported version。三步编译出 pycdcclone、cmake、make整个项目是一个 CMake 工程要求 CMake ≥ 3.12跑通只需三步git clone https://gitcode.com/GitHub_Trending/py/pycdc cd pycdc cmake -DCMAKE_BUILD_TYPERelease . make -j4编译完你会得到两个产物产物职责一句话用法pycdas字节码反汇编器./pycdas 路径.pyc指令清单打到 stdoutpycdc字节码反编译器./pycdc 路径.pyc还原源码错误走 stderr两个工具也都支持marshal.dumps(compile(...))得到的裸 code 对象此时版本信息不在数据里要手动传-c -v version指定。想验证安装是否完整可以跑一遍自带的测试套件。它会调用 Python 解释器对反编译结果逐文件比对支持并行和按名字过滤make check JOBS4 FILTER3.13原理速览指令字典、语法树与代码生成pycdc 干的事可以拆成三步查字典、搭树、翻译。下面各说一段每段对应一块源码。一本指令对照字典难点在于每个 Python 版本的指令编号都是各排各的——POP_TOP在 3.12 里是 1 号到了 3.13 变成 32 号。所以bytes/目录放着一套按版本命名的映射文件每个版本一份专属字典。以 bytes/python_3_13.cpp 为例BEGIN_MAP(3, 13)到END_MAP()之间共 138 条MAP_OP映射靠宏展开成一个查表函数BEGIN_MAP(3, 13) MAP_OP(0, CACHE) MAP_OP(1, BEFORE_ASYNC_WITH) // ...共 138 条 MAP_OP(254, INSTRUMENTED_LINE_A) END_MAP()它把原始字节码编号翻译成 pycdc 统一的内部指令枚举版本识别逻辑见 bytecode_map.h。对比上一版3.12 的字典是 129 条3.13 净增了 9 条——全部是INSTRUMENTED_*系列INSTRUMENTED_RESUME_A到INSTRUMENTED_CALL_A等定义集中在第 123~131 行。这些是 CPython 3.13 用来做代码执行跟踪的插桩指令sys.monitoring一类工具产出的字节码就长这样。顺带一提3.13 还把FORMAT_VALUE_A拆成了FORMAT_SIMPLE和FORMAT_WITH_SPECf-string 还原逻辑也随之调整。从指令流到语法树bytecode.cpp 按字节码流逐条读指令查字典命中后分派给 bytecode_ops.inl 里对应的解析函数碰到函数定义就递归解析内嵌 code 对象。3.13 的CALL_A、CALL_KW_A、BUILD_CONST_KEY_MAP_A这类指令在这里被正确映射函数调用和字面量节点才能还原到位上面那 9 条仪器化指令也有专门处理保证跟踪过的字节码不会把控制流读错。把树翻译成源码解析产物是一棵抽象语法树节点类型定义在 ASTree.h覆盖模块、类、函数、表达式等结构。最后 pycdc.cpp 遍历这棵树按 Python 语法和缩进生成代码源码走 stdout、报错走 stderr所以重定向和 diff 都很顺手。拿它干活版本迁移、教学与安全审计迁移对比。同一份源码分别用 3.12 和 3.13 编译反编译后再对一眼字节码层面的行为差异一目了然./pycdc py312_file.pyc decompile_312.py ./pycdc py313_file.pyc decompile_313.py diff decompile_312.py decompile_313.py解释器教学。bytes/python_3_13.cpp 本身就是一本 CPython 3.13 指令集手册拿一段小代码编译成.pyc用pycdas逐条对照指令编号比死记硬背手册快得多。安全审计。面对最新编译的可疑.pyc用 pycdc 还原成源码再审查逻辑3.13 的仪器化指令也被识别意味着调试跟踪产出的字节码照样读得懂。后续 pycdc 会继续跟进 Python 3.14 预览版字节码、打磨 3.13 仪器化指令的还原细节并优化类型标注恢复。想给工具加新版本支持的话套路已经定型在bytes/目录按既有模式补一份映射文件再注册一条DECLARE_PYTHON声明即可。【免费下载链接】pycdcC python bytecode disassembler and decompiler项目地址: https://gitcode.com/GitHub_Trending/py/pycdc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑