反编译python打包的exe文件
目录
1.前言
2.使用环境
3.还原过程
4.号外
5.exe文件和所用到的反编译工具
6.参考
7.去签名(补漏)
前言
拿到了利用驱动人生进行传播的病毒样本,发现是python打包成的exe文件,经过点波折才搞定。
使用环境
Python 3.6.1(网上说python2.7也可)
还原过程
首先用IDA进行分析,发现PyInstaller等关键信息,可以确认是利用PyInstaller打包的python文件,所以我们要想办法把python文件dump出来

根据网上资料资料,我们可以使用pyinstxtractor.py进行反编译,下载回来操作了一波,很开心的发现解不了。。。

听说去掉签名信息后再使用pyinstxtractor.py可以解开,然后尝试了一下又不行。。。(这里的图没保存)
最后千辛万苦终于找到工具来提取python文件。我们看到前面利用pyinstxtractor.py反编译的错误里有个提示“not a pyinstaller archive”,而用来提取的py脚本叫archive_viewer.py(使用archive_viewer.py要安装PyInstaller,通过pip install pyinstaller即可安装)。

通过上面那张图可以看到除了一些库文件外,就可以看到“ii”这个文件,我们可以使用archive_viewer.py把它提取出来。这里输入命令“x ii”,然后再输入文件名“ii.pyc”。这里要清楚,即使提取出文件,也首先是pyc格式的文件
#这里是archive_viewer.py可以使用的命令,这里我们用“X”提取文件
U: go Up one level
O <name>: open embedded archive name
X <name>: extract name
Q: quit

由于用PyInstaller打包后,pyc文件的前8个字节会被抹掉,所以最后要自己添加回去。前四个字节为python编译的版本,后四个字节为时间戳。想要获得编译版本可以查看打包文件里struct的信息,我这里还是提取出struct这个文件

用编辑工具查看struct文件的前8个字节,把它复制并添加到pyc文件中就可以了



最后可以搜索pyc在线反编译或者使用工具“Easy Python Decompiler v1.3.2”对pyc文件进行反编译

这里反编译后文件后缀是dis,直接用notepad++打开即可看到源代码(代码里还有base64没弄,这里不是重点就不多说了)

号外
这里看了一下别人的文章,pyc的格式简略为,时间戳哪里填零也可以反编译出来
最开始4个字节是一个Maigc int, 标识此pyc的版本信息, 不同的版本的 Magic 都在 Python/import.c 内定义
接下来四个字节还是个int,是pyc产生的时间(TIMESTAMP, 1970.01.01到产生pyc时候的秒数)
接下来是个序列化了的 PyCodeObject(此结构在 Include/code.h 内定义),序列化方法在 Python/marshal.c 内定义
关于为什么这个exe用pyinstxtractor.py解不开,看到了别人用来对抗反编译的方法,原来被骚到了。。。。。。这里的内容可以看的下面参考“PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译”

exe文件和所用到的反编译工具
反编译工具是在下面参考文章python程序反编译里给的,这里十分感谢和说明一下
反编译工具:https://pan.baidu.com/s/1IjavH7F0l-jDCcnYIIEWtA
exe文件:
链接:https://pan.baidu.com/s/1brGnrfPFU-0sKUw2qMxG9w
提取码:ftht
参考
python程序反编译:https://blog.csdn.net/x947955250/article/details/82777640
反编译 pyinstaller 产生的可执行文件:http://howiedlut.top/pyinstaller-reverse-engineer/
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译:http://www.lizenghai.com/archives/898.html
pyc文件格式分析:https://kdr2.com/tech/python/pyc-format.html
去签名(补漏)
昨天写的时候还不知道是自己操作不行,原来去签名这个方法是可以的(这里感谢同事的帮助)。之前去签名一直用stud_PE这个工具直接把签名抹掉,后来发现这个操作是不对的。首先看一下PyInstaller中的代码,PyInstaller首先会通过读取程序最后的数据进行识别,如果是符合格式的才会进行解析

用数据编辑软件打开文件,然后搜索关键标志“MEI”,一般在最下面才会找到这个字符,这里我们还要根据是否匹配MAGIC整个结构才可以确定

最后就删除格式之外的数据就可以,这里如何判断格式是pyinstaller2.0(24字节)还是pyinstaller2.1(88字节)?其实我不是很清楚。。。不过我这里主要是24个字节后还没有到python27.dll哪里,所以就用88个字节的。这里有个粗暴的方法就是两种方式都用一下,看那个可以正确反编译出来

用pyinstaller反编译成功后就可以在目录下找到解压出来的文件夹,打开就会发现关键文件“ii”。这里也需要和之前一样修复头部数据,方法和上面一样。

反编译python打包的exe文件的更多相关文章
- 反编译pyinstaller打包的exe安装包
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译 在这里分享一些技巧和经验给大家.辛苦撰文分享,转载或引用请保留本文作者信息及文章链接. 作者的环境: win ...
- Pyinstaller(python打包为exe文件)
需求分析: python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件,降低脚本对环境的依赖性,同时运行更加迅速. 当然打包的脚本似乎不是在所有的win平台下都能使用, ...
- Pyinstaller (python打包为exe文件)
需求分析: python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件,降低脚本对环境的依赖性,同时运行更加迅速. 当然打包的脚本似乎不是在所有的win平台下都能使用,wi ...
- 如何反编译Python写的exe到py
参考链接: https://blog.csdn.net/qq_44198436/article/details/97314626?depth_1-utm_source=distribute.pc_re ...
- 使用pyinstaller将Python打包为exe文件
当我们完成一个Python项目或一个程序时,希望将Python的py文件打包成在Windows系统下直接可以运行的exe程序,那么pyInstaller就是一个很好的选择.pyInstaller可以将 ...
- 将python打包为.exe文件
第一步:在https://pypi.python.org/pypi/PyInstaller/2.1 下载pyinstaller. 第二步:解压缩,在该目录下命令行中执行python setup.py ...
- Python打包成exe文件很难?一分钟即可学会,并添加图标!
环境1.python 3.72.pyinstaller下载方式:2.1 python安装(略)2.2 安装pyinstaller打开DOS窗口输入以下命令:pip install pyinstalle ...
- python打包生成exe文件
今天任务让做一个可以在Win上直接执行的脚本,百度了下原来可以生产.exe文件.神奇了 安装 pyInstaller pip install pyInstaller 进入要打包文件的目录 执行 py ...
- python打包成为exe文件
pyinstaller 库的使用 PyInstaller是一个十分有用的第三方库,它能够在Windows.Linux.Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包,Py ...
随机推荐
- 干掉windows无脑设定:“始终使用选择的程序打开这种文件”、“使用Web服务查找正确的程序”
先看几张图体会一下: 实在很佩服自己就那样默默忍受了很多很多年.其实这些东西在网上小小的一搜,5分钟就能搞定. 然而我们大家都在想,现在没时间,我还要做xxxx事呢,反正多点两下鼠标而已. 是啊,点两 ...
- Win 10 系统下研华采集卡Advantech Navi SDK虚拟demo设备安装方法
研华的DAQNavi是其采集卡设备的.net编程SDK,安装了其通讯工具Navigator后,可以添加虚拟采集卡 demo device. 在Win10上,执行添加操作时,可能会出现添加失败,这是由于 ...
- 【easy】Number of Segments in a String 字符串中的分段数量
以空格为分隔符,判断一个string可以被分成几部分. 注意几种情况:(1)全都是空格 (2)空字符串(3)结尾有空格 思路: 只要统计出单词的数量即可.那么我们的做法是遍历字符串,遇到空格直接跳过, ...
- [Linux]fcntl函数文件锁概述
概述 fcntl函数文件锁有几个比较容易忽视的地方: 1.文件锁是真的进程之间而言的,调用进程绝对不会被自己创建的锁锁住,因为F_SETLK和F_SETLKW命令总是替换调用进程现有的锁(若已存在), ...
- Zygote及System进程启动
1. init 根据init.rc 运行 app_process, 并携带‘--zygote' 和 ’--startSystemServer' 参数. 2. AndroidRuntime.cpp: ...
- 二丶Django~1
一 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于 ...
- js逗号表达式
在js中的某些场景,","是一种运算符号,只不过他的优先级要低于普通的原酸符,在变量声明或者return中,经常看到逗号表达式. 声明变量: var a=1,b=2,c=3; co ...
- https请求之绕过证书安全校验相关配置
需在weblogic服务器上配置内存溢出的地方加入一行配置: -DUseSunHttpHandler=true 注:空格隔开 然后调用工具类:https://www.cnblogs.com/ ...
- element-ui对话框组件Dialog在回调事件opened获取组件滚动条scrollTop的问题
今天使用element中的Dialog组件时发现一个问题:当Dialog内容过多时会出现滚动条,而当你滚动到一定位置后关闭Dialog,然后再次打开时滚动条仍然保持在上一次关闭前的位置而没有回到顶部. ...
- struts2第一章-基本用法
一.struts简介 1.回顾 MVC M-model模型层 V-view 视图层 前端界面 C-controller 控制层 struts2: Apache提供的开源的控制层框架,相当于servl ...