0%

从手欠删除源代码到反编译exe找回

前言

之前发的EDU查询辅助工具,只用Pyinstaller打包了exe,有MAC的小伙伴想要运行,但是我觉得屎山代码没必要开源,在某一天我将项目源码永久删除,恢复之后乱码,所以没办法满足小伙伴的需求。后面想着找个机会能不能反编译一下,反正代码超简单。

项目介绍

项目地址

https://github.com/langsasec/edusrc

image-20221117234238848

这是之前闲的没事用Flask开发的一个超轻量的网站,主要方便用于EDU_SRC查询具体学校和信息搜集用,最开始是包含Sqlite数据库文件的,后来觉得就两张表,索性把数据查出来放到Python列表里更方便。最后只有一个后端文件main.py和静态资源。

准备工作

所用软件

环境:Python3

  1. edusrc.exe(已用Pyinstaller打包好Flask的exe)
  2. X-ways(16进制编辑器即可,我用的X-ways,windows用WinHex,Mac用010 editor)
  3. reverse_pyexe(pyinstaller打包的exe逆向还原项目)
  4. Pyc反编译工具(在线或uncompyle6等其他方法)

edusrc.exe→main.pyc

执行命令

将需要反编译的exepyinstxtractor.py放到同一个目录下直接运行

image-20221117220830287

1
python pyinstxtractor.py edusrc.exe

image-20221117222110116

生成edusrc.exe_extracted文件夹

image-20221117221133702

包含的静态资源已经反编译出来

image-20221117221642035

十六进制构造main.pyc

原理

pyinstaller在打包的时候,会将pyc文件的前8个字节清除,所以后期需要自己添加上去,前四个字节为python编译的版本,后四个字节为时间戳。(四个字节的magic number、四个字节的timestamp
所以在这里可以通过struct文件来获取其中的信息。

找到如下两个文件:main和struct

image-20221117221811664

用16进制编辑器打开这两个文件,并新建一个main.pyc,共同打开,我这里用X-ways代替。

image-20221117223339450

main.pyc=struct第一行+main

struct

image-20221117223513401

main

image-20221117223602881

main.pyc

image-20221117223704367

main.pyc→main.py

方法一:uncompyle6

工具推荐——又有三个Burp插件

1
2
pip3 install uncompyle6
uncompyle6 main.pyc

我本地是Python3.10,所以不支持,如果要用这个尽量用Python3.8

image-20221117224147467

方法二:在线pyc反编译

地址:https://tool.lu/pyc

image-20221117224513652

成功拿到main.py源码

image-20221117224734204

一些问题

  1. 直接反编译出来的代码可能会和最开始自己写的有一部分出入。

  2. 部分代码因为逻辑问题可能出现Bug,经过我的调试已解决。

    例如:

    Flask中的app路由装饰器代码被修改使得程序无法运行。

    Flask中的渲染模块render_template的参数格式也被修改

  3. 反编译后需要做少量的调试才能正常运行,代码量巨大时估计会很头疼。

Reference

https://github.com/MrWQ/reverse_pyinstaller