首页
社区
课程
招聘
[原创]【病毒分析】独家揭秘LIVE勒索病毒家族之2.0(全版本可解密)
发表于: 2024-6-13 14:15 7888

[原创]【病毒分析】独家揭秘LIVE勒索病毒家族之2.0(全版本可解密)

2024-6-13 14:15
7888

公司从客户现场提取出来了该勒索样本,通过分析发现该样本存在LIVE家族的特征,但与LIVE1.0的加密特征略有不同,故称为LIVE2.0版本。该文我们会对LIVE2.0加密流程进行分析,并在接下来的文章发布LIVE2.0勒索病毒的解密器。

LIVE2.0勒索病毒是LIVE家族的第二代恶意软件,该恶意软件会加密受害者的文件,并且将受害者的ID、文件名称和文件名称的长度写入到加密文件的末尾,最后会将文件名重命名成带.LIVE的文件 ,尤其是针对较重要的文本类文件会采用全部数据加密的方式。此外,它还会提供给受害者一封“FILE RECOVERY_ID_+受害者ID.txt”的勒索信。

加密前:

加密后:

与LIVE1.0版本不同的地方是密钥的长度从16byte变到了8byte,勒索壁纸换成了png格式的新图片。

其中原始文件名长度和progarm_id都是以小端序的方式存储的。

加密文件名特征:随机数+.LIVE

加密文件目录样式:

勒索信+加密文件

解密后:

  初步来看加密器并未使用保护措施,并且没有移除符号表,入口点为main。

首先因虑到LIVE1.0版本和LIVE2.0版本有过多相似的地方,所以2.0的伪C代码就不再重复加注释了,注释可以参考上篇LIVE1.0版本内容。

从Main函数中可以知道主要逻辑在progarm_main函数中,跟LIVE1.0版本一致。

首先程序会获取程序运行中的命令行,并且根据其参数内容进行其他功能的使用。

具体实现在函数program_print_help函数中有所说明,如:指定加密的目录、删除系统还原点、停止服务等,使用方法是--参数 true/false,跟LIVE1.0版本一致。

Progarm_main函数逻辑分析,最开始仅仅只检测cmd命令行的第一个参数是不是--self,如果是需要将第二个参数即程序本身路径作为cmdline的第一个参数,以防止后续读取自身文件时,使用第一个参数不是文件本身路径而是--self参数,导致后续读取密钥与程序配置内容失败。

接下来进行了读取系统时间,以用作后续的日期判断,来对程序状态进行设置。

再往下是初始化,初始化主要分为两部分,密钥初始化和程序初始化。这里再次提一下文件的结构组成:

其中初始化和LIVE1.0版本一样,都是两个初始化由encryption_Initialize函数和program_Initialize函数来实现。

密钥初始化核心为两部分,一个是从程序文件本身读取KEY,另外是从将硬编码的IV赋值。

读取KEY

原理和LIVE1.0版本一样,先从末尾读取4字节长度,再用fseek来不断的移动文件指针到key处。

赋值IV

整体的密钥初始化结束。

其功能是读取勒索信前面部分程序配置信息,并且将其转换为key:value的形式,以便于后续功能的使用。

读取配置项

原理和LIVE1.0版本一样,先读取末尾的勒索信长度,再依次移动文件指针到配置信息的开头

转化为key:value的形式

文件内配置信息

整体的程序初始化结束。

接下来是一个死循环,主要针对于文件本身的第一个参数以后的其他参数进行遍历,并且判断其功能是否开启等操作,具体功能介绍在program_print_help函数有介绍,如果参数未在其中,会触发program_print_help函数。

参数遍历完毕后,就是针对于时间的比较,从文件配置信息中可以得到一个最大与最小的日期信息,是个时间戳,转换一下可以得到其具体时间。

逻辑实现

原理与LIVE1.0版本一样,都是根据Unix时间戳的形式来进行的判断,作用就是来判断软件是否在2023-01-01 08:00:00 ~ 2024-02-15 08:00:00 之间,不在则不能够运行。

接下来会从配置文件中读取勒索信的文件名称,并且从文件名中以‘_’字符进行分割包含的ID,给到progarms_id变量以便后续的使用,最后获取更换壁纸功能的状态,如果是true的话就会进入到progarm_ChangeWallpaper函数进行勒索壁纸的更换。

配置中的变量内容

获取progarm_id

读取壁纸更换功能状态,并且判断是否更换壁纸

读取勒索壁纸文件名称,并且进行壁纸更换的操作。

先移动FILE指针到程序文件中的勒索壁纸的开头,读入到临时变量中,跟LIVE1.0版本相比,除了图片的类型和内容长度发生了变化,其余的实现逻辑一样。

获取程序文件的目录,进行勒索壁纸的保存。

写入一个更换壁纸的Powershell脚本wallpaper.ps1,并且使用system函数执行,完成更换壁纸的操作。

更换壁纸powershell脚本wallpaper.ps1内容:

获取勒索信的内容分析,将勒索信内容赋值到了NoteBytes变量中,以便后续的使用。

对IncludeExtensions配置项的状态进行获取,来判断是否启动包含扩展的功能,这里配置中IncludeExtensions是False,所以他将获取NoneSet的配置项内容,即不加密的文件后缀。

IncludeExtensions配置项的状态也决定了程序使用那个加密函数,这里加密函数有两个一个是___lambda4__program_encrypt,另外一个是___lambda5__program_encrypt,根据IncludeExtensions配置项的内容为false的缘故,所以progarm_encrypt将使用这个加密___lambda5__program_encrypt作为其执行函数。

程序为了保证写入勒索信和对文件进行加密顺利,将利用system函数来执行相应的cmd命令对系统进行恢复选项的禁用并且对操作系统的引导状态策略设置为忽略所有故障。

之后就是对程序指定的服务和进程的停止操作.

对进程

原理和LIVE1.0版本一样,先是判断其功能的开关状态,再进行执行

对服务

原理和LIVE1.0版本一样,先是判断其功能的开关状态,再进行执行

在对指定的服务和进程进行关闭后,将开始最为关键的对文件操作的流程了。

首先是比较明显的目录下进行勒索信的写入.

因为DropNoteInSpecificDirectories配置项内容为true的缘故,所以勒索信会在DirectoriesToDropNoteIn配置项内容下的两个目录中写入名为NoteFilename配置项内容的勒索信文件。

勒索信写入完毕后,将开始对磁盘文件的遍历与加密。

到了这部分原本的1.0在接下来的代磁盘遍历前,将进行多线程的操作,以此种方式来加快加密的速度,但是因为LIVE1.0版本的BUG问题,所以会导致出现非预期的文件,这里就是与LIVE1.0版本最不一样的地方。

黑客发现bug后开始做修复,直接去掉了多线程的方式,采用单线程的方式进行磁盘的遍历与加密。

获取IncludeDirectories指定目录的功能开关状态,开始判断。

如果开则获取DirectorySet的目录并且向下遍历。

程序因为并未开启该功能,所以跳过,准备对所有磁盘进行遍历操作。

首先是对A-Z字符做了拷贝,以供后续作为磁盘的盘符。

对其进行遍历路径的拼接,不断的迭代,类似树的DFS,具体由progarm_Iterate函数实现。

其参数有四个,分别为:(文件路径,配置信息,勒索信内容,勒索信长度,多线程对象

因为LIVE2.0版本取消了多线程的操作,直接去掉了多线程对象的这个参数。

首先该函数会打开文件路径下的目录,并且获得该目录下的所有文件的同时进行路径拼接,对其路径所指文件或目录进行判断是文件还是目录。

打开目录


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (1)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
师傅是真的厉害学习到了 明天复现一下
2024-6-18 23:25
0
游客
登录 | 注册 方可回帖
返回
//