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 | import py_compile |
或
1 | python3 -m py_compile test.py |
将目录下所有py文件转换成pyc文件
1 | import compileall |
或
1 | python3 -m compileall C:\Users\abc\Desktop\release_project |
参考链接
pyc—>py
使用在线网站
使用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) 的错误。
参考链接
py—>exe
使用pyinstaller
安装库
1 | pip install pyinstaller |
举例
1 | from say_hello import * |
生成单个的可执行文件
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 参数后程序无法运行
参考链接
Python PyInstaller安装和使用教程(详解版)
exe—>pyc—>py
使用pyinstxtractor
下载并使用pyinstxtractor解包
使用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编码,可以再使用相应工具转换。