专栏名称: 吾爱破解论坛
吾爱破解论坛致力于软件安全与病毒分析的前沿,丰富的技术版块交相辉映,由无数热衷于软件加密解密及反病毒爱好者共同维护,留给世界一抹值得百年回眸的惊艳,沉淀百年来计算机应用之精华与优雅,任岁月流转,低调而奢华的技术交流与探索却
目录
相关文章推荐
学习强国  ·  月球上能上网吗?能种菜吗?最新回应! ·  4 天前  
学习强国  ·  月球上能上网吗?能种菜吗?最新回应! ·  4 天前  
看雪学苑  ·  GEEKCON特别挑战公开招募|黑客真能远程 ... ·  6 天前  
计算机与网络安全  ·  公众号首篇文章内【黄金宣传位】诚招合作! ·  6 天前  
个人信息与数据保护实务评论  ·  律师观察|北京自贸区数据出境负面清单出台:要 ... ·  6 天前  
个人信息与数据保护实务评论  ·  律师观察|北京自贸区数据出境负面清单出台:要 ... ·  6 天前  
51好读  ›  专栏  ›  吾爱破解论坛

【PC样本分析】python可执行程序分析

吾爱破解论坛  · 公众号  · 互联网安全  · 2016-12-29 13:03

正文

1. 概述

第一次分析这种python exe程序,最开始还比较懵逼,直接对exe就开始下手了,发现它竟然会去释放并运行python dll,一直没想明白,结果浪费了不少时间,最后终于找到了正确的分析思路,所以,觉得挺有意思的,就分享给大家看看。

样本很大,有3.16MB,一般的exe程序不会这么大,所以用了压缩壳UPX。


1.1. 基本信息

文件名称:LogonUI.exe

文件大小:3314728 字节(3.16MB)

MD5                :A25EC7749B2DE12C2A86167AFA88A4DD

SHA1        :BB71254FBD41855E8E70F05231CE77FEE6F00388

CRC32        :1D62CAB1

壳信息        :UPX


1.2. 文件说明

LogonUI.exe.bak:样本源文件

LogonUI.exe.bak_upx -d:脱壳后文件

Vbni7:反编译后文件

code.txt:Vbni7解码后文件

code.py.bak:code.txt源码修改后文件

decompiled.py.bak:网上下载的参考文件


1.3. 相关文档

【原创】用 Python 反编译 Python 软件

http://bbs.pediy.com/showthread.php?t=111428

從PYTHON INSTALLER打包程式拖出PYTHON程式碼

http://adr.xxxxx.im/?p=467

反编译py2exe程序

http://www.qiaoyue.net/blog/2016/05/%E5%8F%8D%E7%BC%96%E8%AF%91py2exe%E7%A8%8B%E5%BA%8F.html


2.LogonUI.exe分析

2.1 脱壳

使用PEID查壳,发现样本是UPX压缩壳,壳信息如下:

“UPX -> www.upx.sourceforge.net [Overlay] *”

必须使用“upx -d”命令脱壳才行,手工脱壳不行(样本是用pyinstaller打包的程序,手工脱壳的程序无法反编译)


2.2. 将exe反编译成py文件

使用PyInstxtractor.py反编译出py文件,具体操作如下:


查看反编译目录,文件“Vbni7”即为python脚本文件;


2.3. 解码python脚本

打开python脚本,发现大量的乱码,最开始还以为解码出错了,然后还又找了其他的方式去解码,直到后面发现文件中有一个exec()函数,才确定原来解码正确的。

最后整理文档时,才发现网上这篇從PYTHON INSTALLER打包程式拖出PYTHON程式碼(“http://adr.xxxxx.im/?p=467”)。。。。

文件内容如下:


将exec()函数修改为print()函数,把代码保存为文件;


查看code.txt代码,又发现所有的变量名和类名都使用唯一字符串处理过,猜测这应该是木马作者使用的代码混淆;

分析人员可以将代码替换为原来的代码,例如:将字符串“pSsWAYdKJqgPHbRoVCwjkvMcmtuxInGEhaFfLBXUOrNlTyQzDe”全部替换为“base64.b64encode”,也可以写一个自动化脚本去替换,不过应该比较麻烦。。。。


在分析过程中,发现了几个特殊字符串,通过google,在github上找到了类似代码“https://github.com/pan-unit42/iocs/blob/master/seaduke/decompiled.py”

可将github上代码下载查看,按照github上代码进行代码修改,但具体分析不能使用github上分析,因为不确定两个样本是否完全一样,一般都是不一样的。。。。。。


2.4. python反编译说明

在分析过程中,由于自己也对相关的python exe程序进行了相应的测试,故在这里和大家一起分享一下;

将python程序打包为exe,可以使用pyinstaller和py2exe;


2.4.1. pyinstaller打包程序

本篇报告中分析的样本就是一个pyinstaller打包程序,将样本脱壳后,使用IDA查看字符串,可以查看到大量的关于python的字符串:

针对pyinstaller打包程序,可以使用“pyinstxtractor.py”脚本工具反编译,查考從PYTHON INSTALLER打包程式拖出PYTHON程式碼(“http://adr.xxxxx.im/?p=467”)


2.4.2. py2exe打包程序

使用py2exe打包的程序,脱壳后使用IDA查看字符串可直接看到字符串“PY2EXE_VERBOSE”:

针对py2exe打包程序可以使用unpy2exe和uncompyle2两个脚本工具进行反编译,查考反编译py2exe程序(“http://www.qiaoyue.net/blog/2016/05/%E5%8F%8D%E7%BC%96%E8%AF%91py2exe%E7%A8%8B%E5%BA%8F.html”)


3. code.txt分析
3.1. 源码修改

由于代码中存在大量的唯一字符串,因此我在分析过程中参照decompiled.py对其进行了相应的代码修改,使代码方便查看调试;

由于通过print()函数打印出来的代码格式很紧凑,也不方便查看调试,因此,我又用pycharm编辑器对代码格式进行了调整;

pycharm:Ctrl + Alt + L代码格式化

代码相对比较好阅读查看了,将代码保存为“code.py.bak”。


后续分析我也是使用pycharm编辑器进行代码调试,调试前需要安装相应的包,分析者可自行下载安装;


4. code.py.bak
4.1. 配置信息

样本将解码相应的配置信息,将配置信息保存在bot_settings中;

相关代码截图如下:


解码代码如下:(配置信息与decompiled.py一样,很可能两个样本是一样的,但为了以防万一,我还是没有使用decompiled.py进行分析

{

'first_run_delay': 0,

'keys': {

'aes': 'KIjbzZ/ZxdE5KD2XosXqIbEdrCxy3mqDSSLWJ7BFk3o=',

'aes_iv': 'cleUKIi+mAVSKL27O4J/UQ=='

},

'autoload_settings': {

'exe_name': 'LogonUI.exe',

'app_name': 'LogonUI.exe',

'delete_after': False

},

'host_scripts': ['http://monitor.syn.cn/rss.php'],

'referer': 'https://www.facebook.com/',

'user_agent': 'SiteBar/3.3.8 (Bookmark Server; http://sitebar.org/)',

'key_id': 'P4BNZR0',

'enable_autoload': False

}


4.2. 程序初始化

在进入”__main__”函数前,样本将创建BotKlass实例对象,并调用BotKlass构造函数;

相关代码截图如下:

在构造函数中:

  • 初始化self.__settings信息,根据bot_settings[‘key_id’]生成配置文件名“tmpp4bnzr0”;查找配置文件“C:\Users\admin\AppData\Local\tmpp4bnzr0”是否存在;如果不存在,表明这是样本第一次运行,样本将直接获取4.1节中的配置信息;如果存在,则直接读取配置文件,并解密得到上一次运行的配置信息;

  • 得到配置信息后,样本将把配置信息加密保存于“C:\Users\admin\AppData\Local\tmpp4bnzr0”文件中;

  • 样本还将获取当前目录路径

  • 样本将生成随机密钥,保存于self.__broker_key中,用于确定是哪一个客户端;


4.3. 主函数

在主函数中,样本将判断当前系统是“windows”还是“Linux”系统,并执行相应的代码;


4.4. 获取任务

在main函数中,样本调用networkHandleKlass.get_tasks()函数获取控制端分发的任务信息:


调用self.__send_request(id=botKlass.bot_id)函数,并传递当前客户端的bot_id;


在__send_request函数中,样本将bot_id加密为COOKIE进行请求;


如果样本请求数据成功,样本将调用decode_data函数对请求数据进行解密,并根据解密数据进行相应的远程命令;


4.5. 远程命令

样本根据解密数据进行相应的远程命令,由于都是python源码,阅读起来也应该比较简单,就不详细讲解功能了,把功能列举如下:

  • cd命令:更改工作目录

  • pwd命令:显示当前工作目录

  • cdt命令:改变工作目录到TEMP目录

  • :autoload:在指定的位置安装样本

  • :migrate:迁移进程文件

  • :clone_time:修改文件属性时间

  • :download:下载文件

  • :execw:执行命令

  • :get:上传文件(加密)

  • :upload_to:上传文件(不加密)

  • :b64encode:加密文件内容并返回

  • :eval:执行代码

  • :set_update_interval:设置请求时间间隔

  • :self_exit:停止运行样本

  • :seppuku:卸载安装样本


样本下载见论坛原帖


--官方论坛

www.52pojie.cn

--推荐给朋友

公众微信号:吾爱破解论坛

或搜微信号:pojie_52