鱼C论坛

 找回密码
 立即注册
查看: 5089|回复: 7

[已解决]pyinstaller中pyc反汇编成py问题

[复制链接]
发表于 2019-2-21 19:52:28 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 理想小青年 于 2019-2-22 08:07 编辑

如题,研究了一下确实没有好的思路(以前没接触过这一块),所以发帖找各路大神来解决一下
故事如下:
一、pyinstaller打包,如下所示:
1550748115(1).jpg
python以及pyinstaller环境,与打包一个简单的py文件使用的命令,只用了-F参数,py中只有一句print('1')

二、打包后dist下面的文件正常执行,如下所示:
1550748160(1).jpg

三、archive_viewer.py下载链接:https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py,使用archive_viewer.py解析pyc(解析打包后的dist下面的可执行文件)‘
1550748235(1).jpg
输入命令,字节码保存到文件且退出(退出时异常,应该无关紧要....)

四、拉入010中查看字节码,字节码前4个字节是magic header,紧跟着四个字节是时间戳,pyinstaller在打包时候前四个字节被替换了
1550748423(1).jpg
1550749369(1).jpg
第一个字节被替换成了63?不知道是不是pyinstaller打包时候特定的风格?还是流程不对?

五、替换Magic Header头中的前四个字节,python2.7与3.7magic不同,所以这边替换成源码python编译的版本,如下所示:
1550748765.jpg

六、好像已经可以了,下面pyc转py的工具来尝试一下,如下所示:
1550748765(1).jpg
1550749781(1).jpg
全部失败,可能还是整个流程不太明白,也不知道哪一个环节出错,关于打包,没有用 pyinstaller -w -c等参数,不是pe格式,而是elf的可执行格式的。

好人平安!!
最佳答案
2019-2-21 19:52:29
搞定了
^_^

2.png

main.pyc是用pyi-archive_viewer从elf文件中提取出来的
main.cpython-32.pyc是用pyinstaller生成的

用pyi-archive_viewer从elf文件中提取出来的main.pyc在文件开始的位置少了12个字节,3个dword
第1个dword是MAGIC_NUMBER
第2个dword可能是 mtime
第3个dword可能是 source_size
注意,第2个和第3个是“可能是”,这个之后再说

3.png

MAGIC_NUMBER由一个版本数字和 0x0d 0x0a构成
第2个和第3个可以填0

版本号我就选python 3.6最新的 python 3.6rc1,也就是 3379
3379是0x0d33
MAGIC_NUMBER就是 33 0d 0d 0a
4.png

可能是不同的版本导致的,windows和linux就不一样
1.png

windows需要在文件开始位置添加16个字节
linux需要添加12个字节
MAGIC_NUMBER必须填存在的版本,高版本不行就试低版本,我在linux中用3379
  1. Python 3.6rc1 3379 (more thorough __class__ validation #23722)
复制代码


具体以可以看一看你系统中的_bootstrap_external.py文件
linux 路径:
  1. /usr/lib/python3.6/importlib/_bootstrap_external.py
复制代码

最佳答案

查看完整内容

搞定了 ^_^ main.pyc是用pyi-archive_viewer从elf文件中提取出来的 main.cpython-32.pyc是用pyinstaller生成的 用pyi-archive_viewer从elf文件中提取出来的main.pyc在文件开始的位置少了12个字节,3个dword 第1个dword是MAGIC_NUMBER 第2个dword可能是 mtime 第3个dword可能是 source_size 注意,第2个和第3个是“可能是”,这个之后再说 MAGIC_NUMBER由一个版本数字和 0x0d 0x0a构成 第2个和第3个可以填0 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-21 19:52:29 | 显示全部楼层    本楼为最佳答案   
搞定了
^_^

2.png

main.pyc是用pyi-archive_viewer从elf文件中提取出来的
main.cpython-32.pyc是用pyinstaller生成的

用pyi-archive_viewer从elf文件中提取出来的main.pyc在文件开始的位置少了12个字节,3个dword
第1个dword是MAGIC_NUMBER
第2个dword可能是 mtime
第3个dword可能是 source_size
注意,第2个和第3个是“可能是”,这个之后再说

3.png

MAGIC_NUMBER由一个版本数字和 0x0d 0x0a构成
第2个和第3个可以填0

版本号我就选python 3.6最新的 python 3.6rc1,也就是 3379
3379是0x0d33
MAGIC_NUMBER就是 33 0d 0d 0a
4.png

可能是不同的版本导致的,windows和linux就不一样
1.png

windows需要在文件开始位置添加16个字节
linux需要添加12个字节
MAGIC_NUMBER必须填存在的版本,高版本不行就试低版本,我在linux中用3379
  1. Python 3.6rc1 3379 (more thorough __class__ validation #23722)
复制代码


具体以可以看一看你系统中的_bootstrap_external.py文件
linux 路径:
  1. /usr/lib/python3.6/importlib/_bootstrap_external.py
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-22 08:00:40 | 显示全部楼层
本帖最后由 理想小青年 于 2019-2-22 08:08 编辑

@人造人 大哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-22 12:19:10 | 显示全部楼层
也就是说
把.py格式的文本文件打包成elf格式的可执行文件?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-22 13:53:26 | 显示全部楼层
人造人 发表于 2019-2-22 12:19
也就是说
把.py格式的文本文件打包成elf格式的可执行文件?


对的 pyinstaller -F xx.py 打包成了elf格式的可执行文件
现在我还原一个被pyinstall打包的elf格式的文件,提取了pyc,但是反编译不成了py
不知道那一步出错了  我也去官网翻译英文看了参考..... 还是没成功
https://pyinstaller.readthedocs.io/en/stable/operating-mode.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-22 17:55:30 | 显示全部楼层
理想小青年 发表于 2019-2-22 13:53
对的 pyinstaller -F xx.py 打包成了elf格式的可执行文件
现在我还原一个被pyinstall打包的elf格式的 ...

你是如何从elf文件中提取pyc的?
我找不到"elf到pyc的这一部分"

我只找到了pyc到py的,而且也测试成功了
现在就剩下elf到pyc了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-22 18:44:18 | 显示全部楼层
本帖最后由 理想小青年 于 2019-2-22 18:46 编辑
人造人 发表于 2019-2-22 17:55
你是如何从elf文件中提取pyc的?
我找不到"elf到pyc的这一部分"


第三步的内容:
如果用pyinstaller打包的程序, 可以通过官方提供的archive_viewer.py脚本分解pyc
命令是:python archive_viewer.py  xx(pyinstaller打包后的elf  ./dist/xx elf文件)

第三步中链接就是archive_viewer.py 脚本下载处
然后输入命令,找到s段,最下方输入命令: x 提示段名称(s段提示的名称)  会提示是否保存  输入文件名就可以了如xx.pyc (与第三步的图一致)
分解出pyc还原py不对 可是感觉没错 关键没做过可移植的python项目...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-23 08:53:21 | 显示全部楼层
本帖最后由 理想小青年 于 2019-2-23 10:32 编辑


哈哈,还是我研究的不到位 ,竟然不知道缺少字节 ,我一直在原字节中替换的,所以一直少了Magic Number 与 后面的标志,优秀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 00:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表