逆向工程:Python反编译工具的一点介绍(如何还原pyc文件)

举报
小哈里 发表于 2022/09/25 04:27:49 2022/09/25
【摘要】 文章目录 1、什么是pyc 文件?1.1 产生pyc文件1.2 pyc文件结构 2、将pyc反编译为py2.1 uncompyle(win / linux)2.2 pycdc(linux)...

1、什么是pyc 文件?

pyc是一种二进制文件,是由py文件经过编译后,生成的可执行的字节码文件
pyc文件是可以跨平台部署的,类似Java的.class文件。
在这里插入图片描述

1.1 产生pyc文件

两种编译生成pyc文件的方法:
1、编译时选用 -m py_compile

# python -m py_compile test0.py

a = int(input())
b = int(input())
c = int(input())
print(a+b)
for i in range(c):
    print(i)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、使用代码编译

import py_compile
py_compile.compile(r'test0.py') 

  
 
  • 1
  • 2

3、使用-O选项,将.pyc文件优化为.pyo文件(体积更小)

# python -O -m py_compile test0.py

  
 
  • 1

1.2 pyc文件结构

pyc 文件由三大部分组成

  • 最开始 4 个字节是一个 Maigc int, 标识此 pyc 的版本信息
  • 接下来四个字节还是个 int, 是 pyc 产生的时间
  • 序列化的 PyCodeObject

PyObject的序列化格式结构

  • 参考资料:https://kdr2.com/tech/python/pyc-format.html

2、将pyc反编译为py

2.1 uncompyle(win / linux)

uncompyle6 input.pyc > output.py
uncompyle6 test2.pyc > test2.py

下载:https://github.com/rocky/python-uncompyle6
安装:pip install uncompyle
报错:ValueError: check_hostname requires server_hostname
解决:需要断开代理服务器

在这里插入图片描述

2.2 pycdc(linux)

将 python 字节码转换为可读的 python 源代码, 包含了反汇编 (pycads) 和反编译 (pycdc) 两种工具

使用
./pycdc xxxx.pyc # 得到py代码
./pycdas xxxx.pyc # 得到字节码

下载:https://github.com/zrax/pycdc
安装:

sudo apt install git   #安装git
sudo apt install cmake #安装cmake
git clone https://github.com/zrax/pycdc.git #下载pycdc到桌面

cd pycdc #进入到pycdc的目录
cmake .
make #安装pycdc工具

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

3、将exe反编译为pyc

python pyinstxtractor.py xxx.exe

下载:https://github.com/extremecoders-re/pyinstxtractor
备注:
1.0会去掉头部的struct,2.0已经解决了这个bug
注意: 需要将解包出来的pyc头部加上33 0d 0d 0a 00 00 00 00 00 00 00 00 e3 00 00 00
才能反编译出py

在这里插入图片描述

文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/126929263

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。