如何反编译Python写的exe到py
参考链接:
https://blog.csdn.net/qq_44198436/article/details/97314626?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://www.cnblogs.com/pcat/p/8990482.html
https://www.cnblogs.com/pcat/p/11625300.html
准备工作:
1. 下载pyinstxtractor.py(百度上搜):https://github.com/extremecoders-re/pyinstxtractor
2. 安装uncompyle6: pip install uncompyle6
3. 下载16进制编辑器:https://www.jb51.net/softs/557257.html#downintro2
为了验证效果,接下来从创建py开始一步步看结果。
第一步:自己写一个py打包成exe -- target_exe.py(简单的两数相加)
#!/usr/bin/env python # _*_ coding: UTF-8 _*_ """================================================= @Project -> File : Python-20210127 -> target_exe.py.py @IDE : PyCharm @Author : Aimee @Date : 2021/2/23 8:57 @Desc : =================================================""" import sys def main(): print("target_exe started") # main()函数开始了 argc = len(sys.argv) if argc == 3: a = int(sys.argv[1]) b = int(sys.argv[2]) result = a + b # 两数相加 print("a + b =", result) if a < 0 or a > 100: # 对a的作用域进行判断 print("a is not in [0, 100]") if a > 0 and b > 0: print("a and b >0") if __name__ == '__main__': main()
target_exe.py->target_exe.exe
pyinstaller -F target_exe.py
将target_exe.py重命名为target_exe_origin.py
第二步:解压exe
将pyinstxtractor.py放在与exe同级目录下,运行
python pyinstxtractor.py target_exe.exe
会在当前目录生成一个target_exe.exe_extracted文件夹,里面会有一些没有后缀的文件名,target_exe就是我们需要进行反编译的文件。在正向编译过程中,生成的pyc会把python版本信息和时间戳去掉,但是反编译的时候我们需要将其补齐。
注意到在target_exe.exe_extracted还存在一个没有后缀名的文件struct,用16进制编辑器打开struct和target_exe文件。
两个文件都有E3,可以看到struct在E3的前面还有一段,应该就是Python版本和时间戳了,将前面一段复制到target_exe中,直接在16进制编辑器里面复制就好了。
保存,然后重命名target_exe为target_exe.pyc。
第三步:反编译pyc文件,得到target_exe.py
uncompyle6 -o target_exe.py target_exe.pyc
得到target_exe.py,那么现在将得到的target_exe.py和原本写的target_exe_origin.py进行对比,看看结果
可以发现,注释没有了,双引号变单引号,if-and变成两个if,功能没啥变化。
OK,反编译就讲到这里。