前言
之前发的EDU查询辅助工具,只用Pyinstaller打包了exe,有MAC的小伙伴想要运行,但是我觉得屎山代码没必要开源,在某一天我将项目源码永久删除,恢复之后乱码,所以没办法满足小伙伴的需求。后面想着找个机会能不能反编译一下,反正代码超简单。
项目介绍
项目地址
https://github.com/langsasec/edusrc
这是之前闲的没事用Flask开发的一个超轻量的网站,主要方便用于EDU_SRC查询具体学校和信息搜集用,最开始是包含Sqlite数据库文件的,后来觉得就两张表,索性把数据查出来放到Python列表里更方便。最后只有一个后端文件main.py和静态资源。
准备工作
所用软件
环境:Python3
- edusrc.exe(已用Pyinstaller打包好Flask的exe)
- X-ways(16进制编辑器即可,我用的X-ways,windows用WinHex,Mac用010 editor)
- reverse_pyexe(pyinstaller打包的exe逆向还原项目)
- Pyc反编译工具(在线或uncompyle6等其他方法)
edusrc.exe→main.pyc
执行命令
将需要反编译的exe
和pyinstxtractor.py
放到同一个目录下直接运行
1 | python pyinstxtractor.py edusrc.exe |
生成edusrc.exe_extracted文件夹
包含的静态资源已经反编译出来
十六进制构造main.pyc
原理
pyinstaller
在打包的时候,会将pyc文件的前8
个字节清除,所以后期需要自己添加上去,前四个字节为python
编译的版本,后四个字节为时间戳。(四个字节的magic number
、四个字节的timestamp
)
所以在这里可以通过struct
文件来获取其中的信息。
找到如下两个文件:main和struct
用16进制编辑器打开这两个文件,并新建一个main.pyc,共同打开,我这里用X-ways代替。
main.pyc=struct第一行+main
struct
main
main.pyc
main.pyc→main.py
方法一:uncompyle6
工具推荐——又有三个Burp插件
1 | pip3 install uncompyle6 |
我本地是Python3.10,所以不支持,如果要用这个尽量用Python3.8
方法二:在线pyc反编译
地址:https://tool.lu/pyc
成功拿到main.py源码
一些问题
直接反编译出来的代码可能会和最开始自己写的有一部分出入。
部分代码因为逻辑问题可能出现Bug,经过我的调试已解决。
例如:
Flask中的app路由装饰器代码被修改使得程序无法运行。
Flask中的渲染模块
render_template
的参数格式也被修改反编译后需要做少量的调试才能正常运行,代码量巨大时估计会很头疼。
Reference
https://github.com/MrWQ/reverse_pyinstaller