关于pyinstaller与Xbash系列分析(续)

前言:
?《Xbash部分样本分析》一篇博客之后,研究了一下关于pyc字节码格式与pyinstaller。虽然相关资料比较少,但是不影响去学习,不得不说pyinstaller是Xbash系列跨平台危害罪魁祸首,因为PyInstaller支持Linux、Windows、Apple macOS平台可执行文件转化。意味着病毒可以在多平台上兼容运行,python去开发维护病毒难度较小,周期短对于分析人员来说也是有好处,比如把可执行文件提取成python源码。

pyinstaller pyc 挖矿病毒
环境搭建及使用 pyc格式解析(部分) Python恶意代码分析

?
一、Pyinstaller:
?介绍一下pyinstaller,如前言所说pyinstaller将会读取您编写得python脚本,它会自行分析,当然是根据导出得与执行所需要得模块与库。收集这些文件包括活动得解释器,把他们放在一个文件夹中。

?This section covers the basic ideas of PyInstaller. These ideas apply to all platforms. Options and special cases are covered below, under Using PyInstaller.
?PyInstaller reads a Python script written by you. It analyzes your code to discover every other module and library your script needs in order to execute. Then it collects copies of all those files – including the active Python interpreter! – and puts them with your script in a single folder, or optionally in a single executable file.

?上述参考源于pyinstaller手册:https://pyinstaller.readthedocs.io/en/stable/index.html
也就是说当使用pyinstaller得时候,会自动检索我们代码中所需要得库与模块与解释器,将他们打包到一起,根据不同得参数生成可执行得文件。当然我们并不是研究如何实现转换成pe格式与elf格式得,因为这需要很漫长得过程。
?但是我们需要了解,pyinstaller打包到一个文件夹后,如何执行得?首先pyinstaller会加载myscript.exe,这是核心文件,然后会引导加载程序得活动平台二进制可执行程序。会引导加载程序,加载python环境,方便python解释器在myscript中导入模块和库。
?启动时候会在操作系统对应得文件夹创建一个临时得文件夹名称_MEIxxxxxx, 引导加载程序与临时文件夹的上下文中的单文件夹包完全相同。当捆绑代码终止时,引导加载程序将删除临时文件夹,详细得参考请看官方文档。

?
需要了解一些关于pyinstaller得参数,如下所示:

????????????????????图片一:pyinstaller参数

    1、-F, --onefile         创建一个文件捆绑的可执行文件
    2、 -w, --windowed, --noconsole       pe格式窗口程序GUI
    3、 -c, --console, --nowindowed         pe格式控制台程序
    4、-a, --ascii不包含unicode支持
    5、-D, --onedir 创建包含可执行文件的单文件夹包

?
如和安装pyinstaller呢?很简单,命令如下所示:

系统Centos
如果你没有安装pip,参考如下:
    1、安装epel扩展:yum -y install epel-release
    2、安装pip:yum -y install python-pip
安装pyinstaller:
    pip install pyinstaller
Windows下参考也一样

?
如何使用pyinstaller?分为以下几大步,如下所示:
?1、首先你需要编写一个py文件,当然你可以分成多个文件进行代码得编写,除了特殊模块需要告诉pyinstaller位置之外,其余会自定帮你分析模块与库,这里用测试代码如下:

????????????????????图片二:python测试代码
2、使用pyinstaller命令进行打包,如下所示:

????????????????????图片三:pyinstaller打包
3、查看生成得数据,如下所示:


????????????????????图片四:dist/xxx
?生成的elf程序运行正常,而且pyinstaller维护了如上图所示得PYZ格式的数据文件,附加到了可执行文件的末尾,然后最前面是PYZ开头的格式。
?官方提供了对应的脚本来提取pyc,名字叫archive_viewer.py代码下载:https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py

4、从上述网站中把代码粘贴下来,touch一个文件,+x权限后,复制即可使用,如下所示:

????????????????????图片五:archive_viewer.py
5、我们发现下面有很多数据,我们需要关注的s标志段中name是我们本身文件名:

????????????????????图片六:S段标志数据
6、archive_viewer.py都有什参数呢?很简单分析一下源码,如下所示:

????????????????????图片七:命令分析
我们需要用到X的命令去提取pyc,上图中为标记的命令U是go Up one level的含义。
7、开始提取pyc,如下所示:

????????????????????图片八:提取命令
8、这时候我们来看一看提取的pyc,widnows下用010就可以了,linux下用xxd可以观察,如下所示:

????????????????????图片九:提取pyc数据观察
?9、pyc提取的到底对不对呢?怎样来确认?这时候我们需要利用python中的py_compile模块,这个模块中方法compile可以将py生成pyc,这样我们对比观察,如下所示:

????????????????????图片十:py_compile

代码:
            import py_compile
            py_compile.compile(r‘路径‘)
注意:
            有时候会生成一个__pycompile__文件夹,里面会是pyc,有时候会在输入的路径下生成pyc,小心覆盖elf中提取的pyc。

10、我们看一下python原生态编译生成的字节码pyc如下:

????????????????????图片十一:compile编译pyc
?图片九与图片十一做比对,你一定会开头少了8个字节的数据,注意当前编译环境使用的python2.7.5,缺少了8个字节的数据,python3前面的字节编码字节也是不同的。
?所以在当前环境下测试观察,那么使用pyinstaller中archive_viewer.py抽取的pyc比正常编译的字节码缺少了8个字节的数据,缺少的是什么?下面我们来看一看pyc格式解析。

?
二、pyc格式解析:

????????????????????图片十二:部分pyc格式数据分析
?当然pyc的格式不值上述那么多,因为详细的去看每一个数据段,不是一篇文章或者短时间内能够学习研究明白,那么我们来看一些重要的数据。

?1、MAGIC,魔术头,注意版本区分不同所以魔术头的数值不同,比如python2一般是03f30d0a,python3.6一般是33790d0a,占用4个字节,前两个字节是版本,后两个字节是0d0a两个标志位.
?所以根据当前环境来判定魔术头的格式(pyinstaller在打包的时候,应该会抽取魔术头来作为版本的判定方式,所以会缺少字节)。

?2、紧跟着Magic的是MTIME,是时间也占四个字节。
?3、TYPE_CODE, 表示了一个PyCodeObject对象,占用了一个字节大小,这个标志位是c,其实就是Pyton中编译过程生成code对象PyCodeObject。将PyCodeObject写入二进制文件,即.pyc。
?4、我们发现图片中co_code的数值,其实就是PyCodeObject结构体中的各个域,每一个属性占用一个long字节。
?5、下面三个属性Type_string与size values数值,是对应着PyCodeObject的co_code。
?6、Type_List,占用一个字节,是类型链表。
?7、co_consts size 表示元素个数,占用四个字节。
?8、Type_INT与co_consts[0]是一个×××。
?还有很多的属性,详细的数据还可以参考:https://www.2cto.com/kf/201504/395067.html

?通过上面的描述,对pyc的数据格式有一个基础的认识,简单的知道了那些字节的含义与基础的作用。
?这样我们就可以很轻易的知道在pyinstaller打包的时候,解压Pyc缺失了8个字节,分别是Magic与MTIME两个字段属性,MTIME字段我们可以填充为0(无关紧要)。我们尝试将确实的数据添加到c也就是PyCodeObject对象之前补齐8个字节的数据,如下所示:


????????????????????图片十三:补齐数据
?注意:是在PyCodeObject对象之前补齐数据,而不是在原来的数据上修改!否则转换py的时候会报错的。
?补齐数据之后我们需要做的是用工具去反编译成py文件,wdinows下推荐一款为EasyPythonDecompiler.exe的软件,而linux下更是数不胜数,那么这里使用linux下名为uncompyle2, decompyle2很多都可以。下面演示就使用EasyPythonDecompiler.exe来转换py,如下所示:

????????????????????图片十四:Decompile Success
?转换完成之后将会生成mypy.pyc_dis文件,如果pyc的格式不对就会失败,生成mypy.pyc_dis.failure,这时候我们拉入到IDE看一看python源码是否与图二中源码相同,如下所示:

????????????????????图片十五:匹配成功
?上述一已经能成功的将pyinstaller打包elf格式的文件成功的转换成py,有何用呢?还记着Xbash系列病毒其中便有pyinstaller打包的病毒,如下所示:

????????????????????图片十六:提取恶意代码

三、Python恶意代码分析:
?弱用户与密码字典:

????????????????????图片十七:弱用户与弱密码
?公网请求及初始化扫IP及描端口:

????????????????????图片十八:请求及端口初始化
?初始化恶意线程环境及启动线程:


????????????????????图片十九:创建启动线程
?线程回调分析:

????????????????????图片二十:线程回调分析
?WEB扫描及数据库扫描:

????????????????????图片二十一:pass_crack

????????????????????图片二十二:check_pass

????????????????????图片二十三:check_pass

????????????????????图片二十四:mysql



????????????????????图片二十五:mysql删库勒索


????????????????????图片二十六:postgresql删库勒索



????????????????????图片二十七:mongodb删库勒索

????????????????????图片二十八:redis删库勒索

????????????????????图片二十九:hadoop Yarn Rm执行命令

????????????????????图片三十:MQ利用执行put
⑥内网扫描:

????????????????????图片三十一:内网扫描

????????????????????图片三十二:内网扫描
?**通过上述恶意代码的分析,最可恶的是没有任何备份的情况下删库,且欺骗0.02BTC,即使给对方支付了费用,抱歉你的数据库仍无法恢复,对方会利用你的心性索要更多的BTC。
?服务器中大量的弱账户与弱密码,给病毒带来了福利。扫描web、内网创建线程,一经发现字典匹配成功,那么会对数据库进行毁灭的操作。如何防范?如果你数据库账户名,密码规范化管理(复杂程度及长度),即使*了系统,也不能胡作非为,那么XbashY样本分析告一段落。

原文地址:https://blog.51cto.com/13352079/2354165

时间: 2024-10-27 01:42:25

关于pyinstaller与Xbash系列分析(续)的相关文章

tomcat系列分析之生命周期管理初始化动作

tomcat中有很多组件,要对这些组件进行生命周期的管理非常困难,tomcat中采用的是抽象出一个生命周期管理接口,然后所有的组件都实现该接口,当父组件启动时,同事负责将子组件启动起来,从而完成整tomcat的初始.启动.结束等动作. 来看下tomcat启动的过程,首先构造Bootstrap类,调用其中的init方法,完成类加载器的初始化,方便后面加载类使用,然后调用其中的load方法,实际上tomcat真正的启动动作是由Catalina类完成的.而这其中在BootStrap中调用Catalin

Exchange Server 2010续定证书系列3-将续定后证书导入服务器

1.右键待完成搁置请求的证书,选择"完成搁置请求",如下图所示: 2.在下图所示页面中,单击"浏览"按钮,选择本次新申请的请书,单击"完成"按钮: 3.在下图所示页面中,可看到已经续订完成: 4.续订后可看到,证书使用期已经更改,如下图所示: 5.检查可发现之前证书中用到的多主机头证书中涉及的域名都正常出现,如下图所示: 至此,新续定好的Exchange证书就已经导入完成了,在下篇文章中我们主要介绍如为续定的证书分配服务.

Exchange Server 2010续定证书系列4-为续定后证书分配服务

1.右键选择"新续定的证书",选择"将服务分配给证书",如下图所示: 2.在下图所示页面中,单击"下一步"按钮: 3.勾选下图所示各项,单击"下一步"按钮: 4.在下图所示页面中,单击"分配"按钮: 5.在下图所示页面中,单击"完成"按钮: 至此,我们就完成了将续定后的证书导入服务器的操作,下节内容中,我们将为大家介绍如何将续定后的证书分别导入其它Exchange 服务器.

Exchange Server 2010续定证书系列5-将续定后证书导入其它服务器

1.在下图所示页面中,右键"新续订的证书",选择"导出Exchange证书": 2.在下图所示,选择证书文件导出位置及密码,单击"导出"按钮: 3.在下图所示页面中,单击"完成"按钮 4.右键单击"另一台客户端访问服务器",选择"导入Exchange证书"项: 5.在"导入Exchange证书"页面中,选择之前导出的.pfx证书文件,输入之前导出时设置的密码,单击&q

android内存泄漏系列- 分析hprof文件

转载请注明出处 http://www.cnblogs.com/weiwangnuanyang/p/5703702.html ,谢谢. 如果只是想确定一下某一个场景是否有内存泄漏,AndroidStadio的控制台就有一个好工具,反复操作观察曲线是否上扬,如果曲线上扬则说明内存泄漏 但是,上面的工具不够强大,不能看出内存中驻留的具体的类和类的引用关系. 下面就来重点介绍一下,解决android内存泄漏必备利器-Memory Analysis; 具体安装方式请移步度娘. 我们这里重点介绍如何利用Me

GreenPlum简单性能测试与分析--续

版权声明:本文由黄辉原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/259 来源:腾云阁 https://www.qcloud.com/community 之前对GreenPlum与Mysql进行了TPC-H类的对比测试,发现同等资源配比条件下,GreenPlum的性能远好于Mysql,有部分原因是得益于GreenPlum本身采用了更高效的算法,比如说做多表join时,采用的是hash join方式.如果采用同样高效的算

Android深度系列—分析Android-Universal-Image-Loader的缓存处理机制

讲到缓存,平时流水线上的码农一定觉得这是一个高大上的东西.看过网上各种讲缓存原理的文章,总感觉那些文章讲的就是玩具,能用吗?这次我将带你一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓存处理机制.看了UIL中的缓存实现,才发现其实这个东西不难,没有太多的进程调度,没有各种内存读取控制机制.没有各种异常处理.反正UIL中不单代码写的简单,连处理都简单.但是这个类库这么好用,又有这么多人用,那么非常有必要看看他是怎么实现的.先了解UIL中缓存流程的原理图. 原理示意图 主体有三个,分别是UI,缓

android黑科技系列——分析某直播App的协议加密原理以及调用加密方法进行协议参数构造

一.前言 随着直播技术火爆之后,各家都出了直播app,早期直播app的各种请求协议的参数信息都没有做任何加密措施,但是慢慢的有人开始利用这个后门开始弄刷粉关注工具,可以让一个新生的小花旦分分钟变成网红.所以介于这个问题,直播App开始对网络请求参数做了加密措施.所以就是本文分析的重点.逆向领域不仅只有脱壳操作,一些加密解密操作也是很有研究的目的. 二.抓包查看加密协议 本文就看一款直播app的协议加密原理,以及如何获取加密之后的信息,我们如何通过探针技术,去调用他的加密函数功能.首先这里找突破点

rest_init函数分析(续)

copy from:https://yq.aliyun.com/articles/559628 本文主要阐述,内核态,怎么样启动到用户态的; 代码在start_kernel函数运行的最后到了rest_init()函数中 1:rest_init()函数分析 (1)rest_init中调用kernel_thread函数启动了2个内核线程,分别是:kernel_init和kthreadd (2)调用schedule函数开启了内核的调度系统,从此linux系统开始转起来了. (3)rest_init最终