0%

python逆向入门

python逆向入门

施工中。。。

什么是pyc文件

pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的 python是无法执行的。

py—>pyc

将单个文件转化成pyc文件

1
2
3
import py_compile

py_compile.compile('test.py')

1
python3 -m py_compile test.py

将目录下所有py文件转换成pyc文件

1
2
3
import compileall

compileall.compile_dir(r'C:\Users\abc\Desktop\release_project')

1
python3 -m compileall C:\Users\abc\Desktop\release_project

参考链接

py文件转换成pyc文件

pyc—>py

使用在线网站

pyc在线反编译

使用uncompyle6

安装库

1
pip3 install uncompyle6

反编译命令

1
uncompyle6 xxx.pyc>xxx.py
1
uncompyle6 -o xxx.py xxx.pyc
注意

对于不是pyc后缀结尾的文件,使用uncompyle6反编译时会报出 must point to a Python source that can be compiled, or Python bytecode (.pyc, .pyo) 的错误。

参考链接

.pyc反编译为.py

py—>exe

使用pyinstaller

安装库

1
pip install pyinstaller

举例

1
2
3
4
5
6
7
8
from say_hello import *

def main():
print('程序开始执行')
print(say_hello('孙悟空'))
# 增加调用main()函数
if __name__ == '__main__':
main()

生成单个的可执行文件

1
pyinstaller -F app.py

执行上面命令,将看到详细的生成过程。当生成完成后,将会在此 app 目录下看到多了一个 dist 目录,并在该目录下看到有一个 app.exe 文件,这就是使用 PyInstaller 工具生成的 EXE 程序。

在命令行窗口中进入 dist 目录下,在该目录执行 app.exe ,由于该程序没有图形用户界面,因此如果读者试图通过双击来运行该程序,则只能看到程序窗口一闪就消失了,这样将无法看到该程序的输出结果。

生成一个目录(包含多个文件)作为可执行程序

1
pyinstaller -D app.py
-h,—help 查看该模块的帮助信息
-F,-onefile 产生单个的可执行文件
-D,—onedir 产生一个目录(包含多个文件)作为可执行程序
-a,—ascii 不包含 Unicode 字符集支持
-d,—debug 产生 debug 版本的可执行文件
-w,—windowed,—noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效)
-c,—nowindowed,—console 指定使用命令行窗口运行程序(仅对 Windows 有效)
-o DIR,—out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
-p DIR,—path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
-n NAME,—name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字
-k —key 加密打包,需要使用pycrypto库

备注

pycryprodome库与pyinstaller不兼容,解决方案参考以下文章。

[Python] Pyinstaller 使用 —key 参数后程序无法运行

pyinstaller —key加密打包问题

pycrypto打包错误

参考链接

Python PyInstaller安装和使用教程(详解版)

exe—>pyc—>py

使用pyinstxtractor

下载并使用pyinstxtractor解包

地址:extremecoders-re

使用git

1
git clone https://ghproxy.com/https://github.com/extremecoders-re/pyinstxtractor.git

命令行执行

1
python ./pyinstxtractor/pyinstxtractor.py ./task.exe

运行后生成xx.exe_extracted文件夹 ,里面有一堆dll ,pyd等文件,我们需要注意的是里面有一个xxx.exe.manifest文件,xxx可能与你的exe文件名不同,但这才是它的真实名字。然后找到一个叫xxx的没有后缀名的文件,它其实就是你之前打包的那个.py文件对应的pyc文件。

我们还注意到此目录下还有一个PYZ-00.pyz_extracted文件夹,里面都是引入的依赖库,当然,我们自己写的mylib.py也在其中,它也是我们反编译的对象。

反编译pyc

但直接将我们找到的pyc文件上传会发现无法反编译。原因是什么呢?我们用十六进制编辑器(大家网上搜就行,我这里用的是winhex,之前直接运行py文件生成的pyc文件比较。

发现唯一的差别就是少了第一行16个字节(叫做 magic number 表示python的版本和编译时间),那我们把它加上是不是就能正常解析了呢?确实是这样,但没有原始pyc文件怎么办?我们再到xx.exe_extracted文件夹里找一找。会发现有一个叫struct的文件,我们给他加上后缀.pyc反编译试试。成功了。

这就说明它的 magic number 是正确的,那我们只要把它的前16个字节复制过去不就行了?我们再来试试,成了!main.py中的内容被成功反编译出来了。

下面同理也能反编译出mylib.py等依赖库中的内容,不过值得注意的是,网上很多教程都没有提到依赖库的pyc文件缺少的字节数与主程序的不同!!!

反编译成功!不过中文字符被解析成了Unicode编码,可以再使用相应工具转换。

参考链接

谈谈 Pyinstaller 的编译和反编译,如何保护你的代码

-------------本文结束感谢您的阅读-------------