长亭百川云 - 文章详情

【病毒分析】全网首发!以国内某安全厂商名字为后缀的勒索病毒分析

索勒安全团队

52

2024-07-25

1.背景

本文主要介绍为BeijngCrypt勒索病毒家族的最新变种,即.halo勒索病毒,该家族首次被发现时间为2020年。曾在2023全球勒索软件研究报告中,以8.39%的占比位列国内第五大活跃勒索病毒家族。从2020年发展至今,期间存在多次变种,这几年间一直保持着每年更新1-2次升级变种的频率

主要加密后缀有:.BeJing、.360、.halo、.file、.520、.genesis、.baxia

该家族最新病毒为.halo病毒,最早发现于2023年初,该病毒会利用远程桌面爆破、数据库端口攻击和垃圾邮件等多种方式进行传播,加密用户的文件并要求用户支付赎金才能进行文件解密。

2.恶意文件基础信息

2.1 加密器基本信息

文件名

admin.exe halo.exe

编译器

Microsoft Visual C/C++(19.16.27045)[C++]

大小

1592533(1.52 MiB)

操作系统

Windows(XP)

架构

I386

模式

32 位

类型

控制台

字节序

LE

MD5

cfb990436ef17c7c77cac89718bca578

SHA1

e7ea093d67c723777de3d63eb809c0521aaf7b78

SHA256

bf4d07ae980e8e3968611027779664476dab1f8104c0e4d6dfb527ec106fcc12

2.2 勒索信

!_INFO.txt

WARNING! YOUR FILES ARE ENCRYPTED!  
Don’t worry, your files are safe, provided that you are willing to pay the ransom.  
Any forced shutdown or attempts to restore your files with the thrid-party software will be damage your files permanently!  
Do not rename your files. It will damage it.  
  
The only way to decrypt your files safely is to buy the special decryption software from us.  
  
Before paying you can send us up to 2 files for free decryption as guarantee. No database files for test.  
Send pictures, text, doc files. (files no more than 1mb)  
  
You can contact us with the following email  
  
360recover@gmail.com  
360support@cock.li  
  
Send us this ID or this file in first email  
  
ID: H9hJdQb5bkkzBVpL/AaNrpoVqXL1OI9Kh5RltkY+gXI=:e6b48af9d931c77955c3487f494200daa76da4eea4845dc257c7711ea8f9004f

3.加密特征分析

3.1 威胁分析

病毒家族

Beijing 360(疑似国内)

首次出现时间/捕获分析时间

unknow

威胁类型

勒索软件,加密病毒

加密文件扩展名

.halo

勒索信文件名

!_INFO.txt

有无免费解密器?

联系邮箱

360recover@gmail.com 360support@cock.li

检测名称

Avast (Win32:Malware-gen), AhnLab-V3 (Trojan/Win.Generic.C5576951), ALYac (Gen:Variant.Tedy.512515), Avira (no cloud) (TR/Ransom.imrnt), BitDefenderTheta (Gen:NN.ZexaF.36802.yq0@aSdxC8m), CrowdStrike Falcon (Win/malicious_confidence_100% (W)),Cylance(Unsafe),DeepInstinct(MALICIOUS),Emsisoft(Gen:Variant.Tedy.512515 (B)),ESET-NOD32(A Variant Of MSIL/Filecoder.LU),GData(Gen:Variant.Tedy.512515) Ikarus (Trojan.MSIL.Crypt),K7GW(Trojan ( 0052f4e41 ))

感染症状

无法打开存储在计算机上的文件,以前功能的文件现在具有不同的扩展名(例如,solar.docx.halo)。桌面上会显示一条勒索要求消息。网络犯罪分子要求支付赎金(通常以比特币)来解锁您的文件。

感染方式

受感染的电子邮件附件(宏)、恶意广告、漏洞利用、恶意链接

受灾影响

所有文件都经过加密,如果不支付赎金就无法打开。其他密码窃取木马和恶意软件感染可以与勒索软件感染一起安装。

3.2 加密的测试文件

3.2.1 文件名

sierting.txt

3.2.2 具体内容

3.3 加密特征

3.3.1 加密文件名特征

加密文件名 = 原始文件名+加密后缀 ,例如:sierting.txt.halo

3.3.2 加密数据特征

文件原始大小+128Byte数据

3.3.3 加密算法

文件加密使用了AES-CFB加密算法,对于文件末尾的128字节是采用了RSA加密后的数据,具体RSA加密了什么可以看下面的分析。

AES密钥生成

KEY:

由以下内容:

1.刚才生成的随机数IV

2.写入到密钥文件中的128字节的随机数sha256(random_128_sha256)

3.带部分后缀的文件名(这里需要注意,假如你的文件名是1.txt.txt,它只能取到1.txt为文件名)

拼接成一段完整的数据以后,再进行sha256的计算,将得到的32位的sha256当作KEY。

IV:

由RPNG伪随机数生成器生成的16字节的随机数据,详情请查看逆向分析的文件加密部分。

RSA密钥生成

公钥:

使用了勒索病毒程序末尾自带的配置信息中的RSA公钥部分,进行BER解码后获得。

3.3.4 加密器释放文件

勒索信(!_INFO.txt)

文件内容

WARNING! YOUR FILES ARE ENCRYPTED!  
Don’t worry, your files are safe, provided that you are willing to pay the ransom.  
Any forced shutdown or attempts to restore your files with the thrid-party software will be damage your files permanently!  
Do not rename your files. It will damage it.  
  
The only way to decrypt your files safely is to buy the special decryption software from us.  
  
Before paying you can send us up to 2 files forfree decryption as guarantee. No database files for test.  
Send pictures, text, doc files. (files no more than 1mb)  
  
You can contact us with the following email  
  
360recover@gmail.com  
360support@cock.li  
  
Send us this ID orthis file in first email  
  
ID: H9hJdQb5bkkzBVpL/AaNrpoVqXL1OI9Kh5RltkY+gXI=:e6b48af9d931c77955c3487f494200daa76da4eea4845dc257c7711ea8f9004f

成分分析

其中ID部分的组成为:base64+KEY。

base64的部分为随机生成的128字节数据的sha256的值再进行了base64编码

Key则是勒索病毒程序末尾自带的配置信息,具体请查看逆向分析部分的读取自身所携带的配置信息内容。

key文件(e6b48af9d931c77955c3487f494200daa76da4eea4845dc257c7711ea8f9004f):

文件内容

5f8rSGaKGiUMHqRQv1Ws7tkAXjM3qfZoyY8ZBUIByuG7EvjSuQ2HeCz9Oi0epMP5waS0Q86jpDuMyo4G59uC5IUyQkl0jxPqpLfGom5EpDvId8bSmKZA5+2tWgFjx+1ZGQOQUy6yLuv7byYbEu2mZNbeBVdGLU5Jftnz+X1Pafc=

成分分析

以base64的形式保存了随机生成的128字节的数据,该随机数据用于AES加密时,用作KEY的生成。

lock隐藏文件(lock_XXX)

文件内容

5928 5f8rSGaKGiUMHqRQv1Ws7tkAXjM3qfZoyY8ZBUIByuG7EvjSuQ2HeCz9Oi0epMP5waS0Q86jpDuMyo4G59uC5IUyQkl0jxPqpLfGom5EpDvId8bSmKZA5+2tWgFjx+1ZGQOQUy6yLuv7byYbEu2mZNbeBVdGLU5Jftnz+X1Pafc=

成分分析

该内容由一段数字和base64数据组成。

数子部分是当前程序运行的PID

base64数据部分是随机生成的128字节的数据的base64,跟KEY文件内容一致。

3.4 注意事项

该勒索病毒不仅会加密当前系统中的文件,还会加密当前系统中映射的磁盘等。

4.逆向分析

4.1 加密器逆向分析

4.1.1 初始化PRNG随机数对象(TLS函数实现)

从程序的TLS函数中可以看到有三个TLS函数

分别为sub_151000、sub_151026和sub_151072三个函数,该TLS回调函数作用就是分别调用这三个函数。

sub_151000函数:

主要通过sub_1F66C0函数来实现了一个对于RandomPool的初始化,相当于AutoSeededRandomPool RNG这句代码;

其余的两个函数都是一样,主要用于后续的几种不同的随机,以防止内部状态一样。

4.1.2 恢复主要功能函数结构(main函数)

简介

该程序会将所有的功能函数,基本上都在一个类中实现,所以开始时会先获取一下虚表地址,之后再根据其虚表的地址加偏移的方式进行对应功能方法的调用,这时可以恢复一下该虚表的结构,重建一个结构体即可。

4.1.3 重建的部分结构

struct vtable_stuct  
{  
  vtable_func *sys_vtable;  
};  
struct vtable_func  
{  
int sub_E6F3FA;  
int get_sys_import_path;  
int get_csid_path;  
int get_root_path_list;  
int get_file_name;  
int get_key_file;  
int write_key_to_file;  
int GetCurrentProcessId;  
int check_exec_process;  
int set_lock_file_hide;  
int judge_file_is_exists;  
int change_file_permissions_777;  
int change_permissions_only_read;  
int write_register_table;  
int clear_register;  
int del_self;  
int hide_cmd_windows;  
int sub_E70188;  
};

4.1.4 隐藏CMD窗口

执行流程

1.从Main函数中可以看到,首先开始的便是调用虚表地址,来获取主体函数列表,之后选择调用其hide_cmd_windows函数,实现对自身CMD窗口的隐藏。

2.进入到hide_cmd_windows函数可以看到,该函数主要是通过调用GetConsoleWindow()函数来获取当前窗口的句柄,之后调用ShowWindow函数来实现对当前窗口的隐藏。

4.1.5 读取自身所携带的配置信息

简介

该函数会读取处于文件末尾的一段配置文件的内容,其中包含了Key和各种加密所需内容等。

配置结构图

执行流程

1.在执行完隐藏窗口后,该程序会执行初始化配置信息,主要通过sub_AAD468函数实现。

2.进入到sub_AAD468函数可以看到,该函数会先读取距离文件末尾0x48大小的数据

3.对Key+RSA公钥数据的大小+勒索信和黑名单等数据的大小这部分的数据进行Sha256

4.与文件末尾的那部分数据进行校验,如果一样就进行下面的

5.将RSA公钥部分0xA0大小的数据进行拷贝到结构中

6.将Key拷贝到结构中

7.将勒索信和黑名单等数据拷贝到结构中

8.清空保存以上内的内存,并且关闭文件流

4.1.6 检查是否多开

执行流程

1. 该函数会先通过调用主功能函数中的get_file_name函数来获取自身路径,外加文件名称等。

2.之后会交由主功能函数中的find_process_exec函数来进行遍历当前系统所运行的进程中的可执行文件是否为自身。

3.最后若是在进程中查到了存在自身的可执行文件,即将V14和V30两个变量的值设置为1,若是没有则为0。

4.1.7 恢复protobuf对象

因为后续会涉及到protobuf数据的解析,所以这里为了后续便于逆向,要先使用工具来对protubuf对象的恢复。

恢复后的对象有:

bin_hdr_enc.proto

syntax = "proto2";  
  
package proto;  
  
import"bin_hdr_common.proto";  
  
message FileMatchOpts {  
    optional string regex = 1;  
    optional uint32 max_size_kb = 2;  
}  
  
message TraverseConfig {  
    repeated string blacklist_dirs_regs = 1;  
    repeated string priority_dirs = 3;  
    repeated string blacklist_files = 4;  
    repeated string important_files_regs = 5;  
    repeated string blacklist_procs_regs = 6;  
    repeated FileMatchOpts blacklist_files_opts = 7;  
  
    reserved 2;  
}  
  
message EncoderConfig {  
    optional CommonConfig common = 1;  
    optional TraverseConfig traverse = 2;  
    optional string readme_template = 3;  
    optional uint32 max_parts_cnt = 4;  
    optional string lock_fname = 5;  
}

bin_hdr_common.proto

syntax = "proto2";  
  
package proto;  
  
message CommonConfig {  
    required string extension = 1;  
    required string readme_fname = 2;  
    required uint32 min_enc_size_kb = 3;  
    required uint32 max_enc_size_kb = 4;  
    required uint32 important_percent = 5;  
    required fixed32 key_parts = 6;  
    optional bool force_single = 100 [default = true];  
    optional bool dry_run = 101 [default = true];  
    optional bool autorun_only = 102 [default = false];  
}

4.1.8 手动恢复protobuf数据流

protubuf流:

0A270A0468616C6F120A215F494E464F2E7478741801208010282C350E000000A00600A80600B0060012F8110A1C2E2A55736572735C5C2E2A5C5C4D6963726F736F66742048656C70240A172E2A55736572735C5C2E2A5C5C4D6963726F736F6674240A1B2E2A55736572735C5C2E2A5C5C5061636B616765204361636865240A0B2E2A5C5C416E794465736B0A102E2A5C5C436F6D6D6F6E2046696C65730A1D2E2A5C5C456D626564646564204C6F636B646F776E204D616E616765720A152E2A5C5C496E7465726E6574204578706C6F7265720A0B2E2A5C5C4D534275696C640A112E2A5C5C4D6963726F736F66742E4E45540A082E2A5C5C4F7261790A182E2A5C5C5265666572656E636520417373656D626C6965730A112E2A5C5C53796E6F6C6F677944726976650A142E2A5C5C57696E646F777320446566656E6465720A2F2E2A5C5C57696E646F777320446566656E64657220416476616E636564205468726561742050726F74656374696F6E0A132E2A5C5C57696E646F7773204A6F75726E616C0A102E2A5C5C57696E646F7773204D61696C0A182E2A5C5C57696E646F7773204D6564696120506C617965720A1F2E2A5C5C57696E646F7773204D756C74696D6564696120506C6174666F726D0A0E2E2A5C5C57696E646F7773204E540A182E2A5C5C57696E646F77732050686F746F205669657765720A1C2E2A5C5C57696E646F777320506F727461626C6520446576696365730A142E2A5C5C57696E646F77732053656375726974790A132E2A5C5C57696E646F777320536964656261720A152E2A5C5C57696E646F7773506F7765725368656C6C0A0F433A5C5C50726F6772616D446174610A0B433A5C5C57696E646F77732A065C2E346464242A065C2E34646C242A085C2E6163636462242A085C2E6163636463242A085C2E6163636465242A085C2E6163636472242A085C2E6163636474242A085C2E6163636674242A065C2E616462242A065C2E616465242A065C2E616466242A065C2E616470242A065C2E616C66242A065C2E61726D242A065C2E61727A242A065C2E61736B242A065C2E62616B242A075C2E62736F6E242A065C2E627472242A065C2E636174242A065C2E636462242A065C2E636B70242A065C2E636D61242A065C2E636E66242A065C2E637064242A0A5C2E63727970743132242A095C2E637279707438242A095C2E637279707439242A095C2E646163706163242A065C2E646164242A0D5C2E64616469616772616D73242A0B5C2E6461736368656D61242A055C2E6462242A095C2E64622D73686D242A095C2E64622D77616C242A065C2E646233242A065C2E646263242A065C2E646266242A065C2E646273242A065C2E646274242A065C2E646276242A065C2E646278242A065C2E646362242A065C2E646374242A065C2E646378242A065C2E64646C242A075C2E646C6973242A065C2E646C6C242A065C2E646D70242A065C2E647031242A065C2E647179242A065C2E64736B242A065C2E64736E242A075C2E64747378242A065C2E64786C242A065C2E65636F242A065C2E656378242A065C2E656462242A075C2E6570696D242A065C2E666364242A065C2E666462242A065C2E666963242A065C2E666D35242A065C2E666D70242A085C2E666D703132242A085C2E666D70736C242A065C2E666F6C242A065C2E667033242A065C2E667034242A065C2E667035242A065C2E667037242A065C2E667074242A065C2E66726D242A065C2E676462242A075C2E67726462242A065C2E677769242A065C2E686462242A065C2E686973242A055C2E6962242A065C2E696263242A065C2E696264242A065C2E69627A242A065C2E696462242A065C2E696878242A065C2E69736D242A075C2E69746462242A065C2E697477242A065C2E6A6574242A075C2E6A736F6E242A065C2E6A7478242A065C2E6B6462242A075C2E6B657869242A085C2E6B65786963242A085C2E6B65786973242A065C2E6C6466242A065C2E6C6763242A065C2E6C7778242A065C2E6D6166242A065C2E6D6171242A065C2E6D6172242A0A5C2E6D61727368616C242A065C2E6D6173242A065C2E6D6176242A065C2E6D626B242A065C2E6D6462242A065C2E6D6466242A065C2E6D7064242A065C2E6D7267242A065C2E6D7564242A065C2E6D7762242A065C2E6D7964242A065C2E6D7969242A085C2E6D7973716C242A065C2E6E6466242A065C2E6E6E74242A095C2E6E726D6C6962242A065C2E6E7332242A065C2E6E7333242A065C2E6E7334242A065C2E6E7366242A055C2E6E76242A065C2E6E7632242A075C2E6E776462242A065C2E6E7966242A065C2E6F6462242A065C2E6F7074242A065C2E6F7179242A065C2E6F7261242A065C2E6F7278242A065C2E6F7763242A065C2E703936242A065C2E703937242A065C2E70616E242A065C2E706462242A065C2E70646D242A065C2E70686C242A065C2E706E7A242A0A5C2E71627175657279242A065C2E717279242A065C2E717664242A065C2E726266242A075C2E72637464242A065C2E726F64242A075C2E726F6478242A065C2E727064242A065C2E727364242A065C2E72756C242A065C2E73616C242A0B5C2E7361733762646174242A065C2E736266242A065C2E736378242A065C2E736462242A065C2E736463242A065C2E736466242A065C2E736973242A065C2E736C64242A065C2E736D64242A065C2E737071242A065C2E73716C242A095C2E73716C697465242A0A5C2E73716C69746533242A0B5C2E73716C6974656462242A065C2E737172242A065C2E737973242A055C2E7465242A0A5C2E74656163686572242A065C2E746D64242A065C2E747073242A065C2E747263242A065C2E74726D242A065C2E756462242A065C2E75646C242A065C2E757372242A065C2E763132242A065C2E766973242A065C2E767064242A065C2E767676242A065C2E776462242A075C2E776D6462242A065C2E77726B242A065C2E786462242A065C2E786C64242A085C2E786D6C6666242A075E5B5E2E5D2B243207737663686F7374320F5E6578706C6F7265725C2E657865243A110A0D4E54555345525C2E4441542E2A10003A0C0A065C2E646C6C2410D086033A0C0A065C2E7379732410D086033A0D0A075E5B5E2E5D2B2410A08D063A0B0A07626F6F746D677210003A0F0A0B706167652E2A5C2E73797310003A0F0A0B737761702E2A5C2E73797310001AB6055741524E494E472120594F55522046494C45532041524520454E43525950544544210A446F6EE280997420776F7272792C20796F75722066696C65732061726520736166652C2070726F7669646564207468617420796F75206172652077696C6C696E6720746F20706179207468652072616E736F6D2E0A416E7920666F726365642073687574646F776E206F7220617474656D70747320746F20726573746F726520796F75722066696C65732077697468207468652074687269642D706172747920736F6674776172652077696C6C2062652064616D61676520796F75722066696C6573207065726D616E656E746C79210A446F206E6F742072656E616D6520796F75722066696C65732E2049742077696C6C2064616D6167652069742E0A0A546865206F6E6C792077617920746F206465637279707420796F75722066696C657320736166656C7920697320746F2062757920746865207370656369616C2064656372797074696F6E20736F6674776172652066726F6D2075732E0A0A4265666F726520706179696E6720796F752063616E2073656E6420757320757020746F20322066696C657320666F7220667265652064656372797074696F6E2061732067756172616E7465652E204E6F2064617461626173652066696C657320666F7220746573742E0A53656E642070696374757265732C20746578742C20646F632066696C65732E202866696C6573206E6F206D6F7265207468616E20316D62290A0A596F752063616E20636F6E7461637420757320776974682074686520666F6C6C6F77696E6720656D61696C0A0A3336307265636F76657240676D61696C2E636F6D0A333630737570706F727440636F636B2E6C690A0A53656E642075732074686973204944206F7220746869732066696C6520696E20666972737420656D61696C0A0A49443A207B7B327D7D3A7B7B317D7D0A20142A0C5F5F6C6F636B5F5858585F5F

使用工具对其进行解析后可以得到内容:

程序内部整体是采用了一个Encodeconfig对象为主体,里面包含了其他几个对象作为其成员,接着就可以根据恢复的数据手动恢复一下对应的对象主体结构:

message EncoderConfig {  
    optional CommonConfig common = [  
        message CommonConfig {  
                    required string extension = "halo";  
                    required string readme_fname =  "!_INFO.txt";  
                    required uint32 min_enc_size_kb = 1;  
                    required uint32 max_enc_size_kb = 2048;  
                    required uint32 important_percent = 44;  
                    required fixed32 key_parts = ;  
                    optional bool force_single = 0 [default = true];  
                    optional bool dry_run = 0 [default = true];  
                    optional bool autorun_only = 0 [default = false];  
        }  
];  
    optional TraverseConfig traverse = [  
        message TraverseConfig {  
                    repeated string blacklist_dirs_regs = ['.*Users\\.*\\Microsoft Help$', '.*Users\\.*\\Microsoft$', '.*Users\\.*\\Package Cache$', '.*\\AnyDesk', '.*\\Common Files', '.*\\Embedded Lockdown Manager', '.*\\Internet Explorer', '.*\\MSBuild', '.*\\Microsoft.NET', '.*\\Oray', '.*\\Reference Assemblies', '.*\\SynologyDrive', '.*\\Windows Defender', '.*\\Windows Defender Advanced Threat Protection', '.*\\Windows Journal', '.*\\Windows Mail', '.*\\Windows Media Player', '.*\\Windows Multimedia Platform', '.*\\Windows NT', '.*\\Windows Photo Viewer', '.*\\Windows Portable Devices', '.*\\Windows Security', '.*\\Windows Sidebar', '.*\\WindowsPowerShell', 'C:\\ProgramData', 'C:\\Windows'];  
                    repeated string priority_dirs = 3;  
                    repeated string blacklist_files = 4;  
                    repeated string important_files_regs = ['\\.4dd$', '\\.4dl$', '\\.accdb$', '\\.accdc$', '\\.accde$', '\\.accdr$', '\\.accdt$', '\\.accft$', '\\.adb$', '\\.ade$', '\\.adf$', '\\.adp$', '\\.alf$', '\\.arm$', '\\.arz$', '\\.ask$', '\\.bak$', '\\.bson$', '\\.btr$', '\\.cat$', '\\.cdb$', '\\.ckp$', '\\.cma$', '\\.cnf$', '\\.cpd$', '\\.crypt12$', '\\.crypt8$', '\\.crypt9$', '\\.dacpac$', '\\.dad$', '\\.dadiagrams$', '\\.daschema$', '\\.db$', '\\.db-shm$', '\\.db-wal$', '\\.db3$', '\\.dbc$', '\\.dbf$', '\\.dbs$', '\\.dbt$', '\\.dbv$', '\\.dbx$', '\\.dcb$', '\\.dct$', '\\.dcx$', '\\.ddl$', '\\.dlis$', '\\.dll$', '\\.dmp$', '\\.dp1$', '\\.dqy$', '\\.dsk$', '\\.dsn$', '\\.dtsx$', '\\.dxl$', '\\.eco$', '\\.ecx$', '\\.edb$', '\\.epim$', '\\.fcd$', '\\.fdb$', '\\.fic$', '\\.fm5$', '\\.fmp$', '\\.fmp12$', '\\.fmpsl$', '\\.fol$', '\\.fp3$', '\\.fp4$', '\\.fp5$', '\\.fp7$', '\\.fpt$', '\\.frm$', '\\.gdb$', '\\.grdb$', '\\.gwi$', '\\.hdb$', '\\.his$', '\\.ib$', '\\.ibc$', '\\.ibd$', '\\.ibz$', '\\.idb$', '\\.ihx$', '\\.ism$', '\\.itdb$', '\\.itw$', '\\.jet$', '\\.json$', '\\.jtx$', '\\.kdb$', '\\.kexi$', '\\.kexic$', '\\.kexis$', '\\.ldf$', '\\.lgc$', '\\.lwx$', '\\.maf$', '\\.maq$', '\\.mar$', '\\.marshal$', '\\.mas$', '\\.mav$', '\\.mbk$', '\\.mdb$', '\\.mdf$', '\\.mpd$', '\\.mrg$', '\\.mud$', '\\.mwb$', '\\.myd$', '\\.myi$', '\\.mysql$', '\\.ndf$', '\\.nnt$', '\\.nrmlib$', '\\.ns2$', '\\.ns3$', '\\.ns4$', '\\.nsf$', '\\.nv$', '\\.nv2$', '\\.nwdb$', '\\.nyf$', '\\.odb$', '\\.opt$', '\\.oqy$', '\\.ora$', '\\.orx$', '\\.owc$', '\\.p96$', '\\.p97$', '\\.pan$', '\\.pdb$', '\\.pdm$', '\\.phl$', '\\.pnz$', '\\.qbquery$', '\\.qry$', '\\.qvd$', '\\.rbf$', '\\.rctd$', '\\.rod$', '\\.rodx$', '\\.rpd$', '\\.rsd$', '\\.rul$', '\\.sal$', '\\.sas7bdat$', '\\.sbf$', '\\.scx$', '\\.sdb$', '\\.sdc$', '\\.sdf$', '\\.sis$', '\\.sld$', '\\.smd$', '\\.spq$', '\\.sql$', '\\.sqlite$', '\\.sqlite3$', '\\.sqlitedb$', '\\.sqr$', '\\.sys$', '\\.te$', '\\.teacher$', '\\.tmd$', '\\.tps$', '\\.trc$', '\\.trm$', '\\.udb$', '\\.udl$', '\\.usr$', '\\.v12$', '\\.vis$', '\\.vpd$', '\\.vvv$', '\\.wdb$', '\\.wmdb$', '\\.wrk$', '\\.xdb$', '\\.xld$', '\\.xmlff$', '^[^.]+$'];  
                    repeated string blacklist_procs_regs = ["svchost","^explorer\.exe$"];  
                    repeated FileMatchOpts blacklist_files_opts = [  
                        message FileMatchOpts {  
                                    optional string regex = "NTUSER\.DAT.*";  
                                    optional uint32 max_size_kb = 0;  
                        },  
                        message FileMatchOpts {  
                                    optional string regex = "\.dll$";  
                                    optional uint32 max_size_kb = 50000;  
                        },  
                        message FileMatchOpts {  
                                    optional string regex = "\.sys$";  
                                    optional uint32 max_size_kb = 50000;  
                        },  
                        message FileMatchOpts {  
                                    optional string regex = "^[^.]+$";  
                                    optional uint32 max_size_kb = 100000;  
                        },  
                        message FileMatchOpts {  
                                    optional string regex = "bootmgr";  
                                    optional uint32 max_size_kb = 0;  
                        },  
                        message FileMatchOpts {  
                                    optional string regex = "page.*\.sys";  
                                    optional uint32 max_size_kb = 0;  
                        },  
                        message FileMatchOpts {  
                                    optional string regex = "swap.*\.sys";  
                                    optional uint32 max_size_kb = 0;  
                        }  
        ];  
                    reserved 2;  
        }  
];  
    optional string readme_template = "WARNING! YOUR FILES ARE ENCRYPTED! Don’t worry, your files are safe, provided that you are willing to pay the ransom. Any forced shutdown or attempts to restore your files with the thrid-party software will be damage your files permanently! Do not rename your files. It will damage it. The only way to decrypt your files safely is to buy the special decryption software from us. Before paying you can send us up to 2 files for free decryption as guarantee. No database files for test. Send pictures, text, doc files. (files no more than 1mb) You can contact us with the following email 360recover@gmail.com 360support@cock.li Send us this ID or this file in first email ID: {{2}}:{{1}}  
";  
    optional uint32 max_parts_cnt = 20;  
    optional string lock_fname = "__lock_XXX__";  
}

由该对象中的内容可以大致了解到,所有的路径和后缀的匹配全都是采用了正则的方式。

黑名单目录

'.*Users\\.*\\Microsoft Help$', '.*Users\\.*\\Microsoft$', '.*Users\\.*\\Package Cache$', '.*\\AnyDesk', '.*\\Common Files', '.*\\Embedded Lockdown Manager', '.*\\Internet Explorer', '.*\\MSBuild', '.*\\Microsoft.NET', '.*\\Oray', '.*\\Reference Assemblies', '.*\\SynologyDrive', '.*\\Windows Defender', '.*\\Windows Defender Advanced Threat Protection', '.*\\Windows Journal', '.*\\Windows Mail', '.*\\Windows Media Player', '.*\\Windows Multimedia Platform', '.*\\Windows NT', '.*\\Windows Photo Viewer', '.*\\Windows Portable Devices', '.*\\Windows Security', '.*\\Windows Sidebar', '.*\\WindowsPowerShell', 'C:\\ProgramData', 'C:\\Windows'

重要的加密文件后缀

'\\.4dd$', '\\.4dl$', '\\.accdb$', '\\.accdc$', '\\.accde$', '\\.accdr$', '\\.accdt$', '\\.accft$', '\\.adb$', '\\.ade$', '\\.adf$', '\\.adp$', '\\.alf$', '\\.arm$', '\\.arz$', '\\.ask$', '\\.bak$', '\\.bson$', '\\.btr$', '\\.cat$', '\\.cdb$', '\\.ckp$', '\\.cma$', '\\.cnf$', '\\.cpd$', '\\.crypt12$', '\\.crypt8$', '\\.crypt9$', '\\.dacpac$', '\\.dad$', '\\.dadiagrams$', '\\.daschema$', '\\.db$', '\\.db-shm$', '\\.db-wal$', '\\.db3$', '\\.dbc$', '\\.dbf$', '\\.dbs$', '\\.dbt$', '\\.dbv$', '\\.dbx$', '\\.dcb$', '\\.dct$', '\\.dcx$', '\\.ddl$', '\\.dlis$', '\\.dll$', '\\.dmp$', '\\.dp1$', '\\.dqy$', '\\.dsk$', '\\.dsn$', '\\.dtsx$', '\\.dxl$', '\\.eco$', '\\.ecx$', '\\.edb$', '\\.epim$', '\\.fcd$', '\\.fdb$', '\\.fic$', '\\.fm5$', '\\.fmp$', '\\.fmp12$', '\\.fmpsl$', '\\.fol$', '\\.fp3$', '\\.fp4$', '\\.fp5$', '\\.fp7$', '\\.fpt$', '\\.frm$', '\\.gdb$', '\\.grdb$', '\\.gwi$', '\\.hdb$', '\\.his$', '\\.ib$', '\\.ibc$', '\\.ibd$', '\\.ibz$', '\\.idb$', '\\.ihx$', '\\.ism$', '\\.itdb$', '\\.itw$', '\\.jet$', '\\.json$', '\\.jtx$', '\\.kdb$', '\\.kexi$', '\\.kexic$', '\\.kexis$', '\\.ldf$', '\\.lgc$', '\\.lwx$', '\\.maf$', '\\.maq$', '\\.mar$', '\\.marshal$', '\\.mas$', '\\.mav$', '\\.mbk$', '\\.mdb$', '\\.mdf$', '\\.mpd$', '\\.mrg$', '\\.mud$', '\\.mwb$', '\\.myd$', '\\.myi$', '\\.mysql$', '\\.ndf$', '\\.nnt$', '\\.nrmlib$', '\\.ns2$', '\\.ns3$', '\\.ns4$', '\\.nsf$', '\\.nv$', '\\.nv2$', '\\.nwdb$', '\\.nyf$', '\\.odb$', '\\.opt$', '\\.oqy$', '\\.ora$', '\\.orx$', '\\.owc$', '\\.p96$', '\\.p97$', '\\.pan$', '\\.pdb$', '\\.pdm$', '\\.phl$', '\\.pnz$', '\\.qbquery$', '\\.qry$', '\\.qvd$', '\\.rbf$', '\\.rctd$', '\\.rod$', '\\.rodx$', '\\.rpd$', '\\.rsd$', '\\.rul$', '\\.sal$', '\\.sas7bdat$', '\\.sbf$', '\\.scx$', '\\.sdb$', '\\.sdc$', '\\.sdf$', '\\.sis$', '\\.sld$', '\\.smd$', '\\.spq$', '\\.sql$', '\\.sqlite$', '\\.sqlite3$', '\\.sqlitedb$', '\\.sqr$', '\\.sys$', '\\.te$', '\\.teacher$', '\\.tmd$', '\\.tps$', '\\.trc$', '\\.trm$', '\\.udb$', '\\.udl$', '\\.usr$', '\\.v12$', '\\.vis$', '\\.vpd$', '\\.vvv$', '\\.wdb$', '\\.wmdb$', '\\.wrk$', '\\.xdb$', '\\.xld$', '\\.xmlff$', '^[^.]+$'

勒索信模板

WARNING! YOUR FILES ARE ENCRYPTED! Don’t worry, your files are safe, provided that you are willing to pay the ransom. Any forced shutdown or attempts to restore your files with the thrid-party software will be damage your files permanently! Do not rename your files. It will damage it. The only way to decrypt your files safely is to buy the special decryption software from us. Before paying you can send us up to 2 files for free decryption as guarantee. No database files for test. Send pictures, text, doc files. (files no more than 1mb) You can contact us with the following email 360recover@gmail.com 360support@cock.li Send us this ID or this file in first email ID: {{2}}:{{1}}

加密KEY的文件名

__lock_XXX__

勒索信文件名

!_INFO.txt

加密后缀

halo

4.1.9 解析Protubuf数据

执行流程

1.这里会先将config_head_a0的数据拷贝一下

2.调用config_init来对勒索信和黑名单那部分的数据进行解析

3.将读取到的0xBED大小的勒索信和黑名单的数据当作protubuf数据解析到protobuf的几个对象中

4. 之后就是将0xBED大小的勒索信和黑名单等数据解析成protobuf对象,供后面的其他功能使用。

4.1.10 获得注册表的键名

执行流程

1.该函数会先读取程序末尾的key,之后又调用了主要功能类中get_file_name来获取当前程序的路径

2.将上述两端数据拼接到一起

3.计算一下两端数据中的sha256

这里可以写个脚本来对其内容进行验证一下:

发现跟结果一样

4.1.11 写入开机启动项

简介

该函数主要由主体函数的**sub_E70BE5函数(write_register_table函数)**实现,此功能会向\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
和\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
注册表中写入键为52245305000b880c91a0d6bf2b982de81be79a57a2c3bb290602b2819f794e37
值为"XXXX/halo.exe b30b4aba8cb7ba54b4f96f5b186828590ed1087fb3dbf5518239e4e325968d82"

执行流程

1.在执行写入注册表之前会先获取key

2.之后调用write_registr_table函数来实现对开机自启注册表的启动。

3.写入完毕后,将调用unknown_libname_10函数对sha256、key和文件路径进行内存的释放等操作,并且返回。

write_registr_table函数

1.获取了刚才计算的key+文件路径的sha256

2.获取key

3.获取文件路径

4.先将key+文件路径的sha256作为KEY,路径和KEY作为值,如:

{"52245305000b880c91a0d6bf2b982de81be79a57a2c3bb290602b2819f794e37":"XXXX/halo.exe b30b4aba8cb7ba54b4f96f5b186828590ed1087fb3dbf5518239e4e325968d82"}

写入到开启启动项\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run


监控

监控上可以看到写入的路径和内容与我们分析的一致

可看到写入的路径和内容与我们分析的一致

注册表内:

同理还会往\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
写入同样的内容。

4.1.12 写入加密密钥文件

简介

该sub_D52540函数功能是主要在系统C:/ProgarmData
下写入密钥文件,密钥文件名称为b30b4aba8cb7ba54b4f96f5b186828590ed1087fb3dbf5518239e4e325968d82
,密钥内容为128字节的随机数的Base64.

执行流程

1.在写完注册表后,将进入写入勒索信和加密等环节

2.先获取了文件末尾的key,之后调用了sub_D52540函数来实现对密钥文件的后续操作。

sub_D52540函数

该函数主要实现了密钥文件路径的获取、随机数的生成和对随机数进行base64编码,之后调用主体函数的write_key_to_file函数将base64编码以后的随机数据写入到密钥文件所在路径中。

write_key_to_file函数

该函数主要实现了对密钥文件路径的获取、密钥文件的创建和密钥编码内容的写入

其中密钥路径的获取主要是采用了SHGetFolderPathW函数来实现的,其中CSIDL为35即代表了C://ProgarmData
这个路径。

通过procmon的结构可以看到成功写入到了该路径中

procmon结果

4.1.13 获取系统中的路径

简介

该函数主要实现了对两个数据结构的初始化和一个链表结构的初始化,其中两个图,一个是存储了所需配置信息的图,另外一个是存储了当前系统物理存储根路径的图,而一个链表则是存储了需要加密的所遍历的路径等。

执行流程

1.在完成了密钥文件的写入后,将对路径的数据结构进行了一些勒索信的文件名和加密密钥的文件名等数据的插入

该程序中的路径和其他的一些所需数据采用了图的数据结构,如该内存布局所示:

图结点的内存结构

其中前三个地址指向三个结点,分别为off_1467538、off_1467080和off_1467538,而在其三个节点往下4个字节的位置即为存储的路径和所需数据,根据其关系可以绘制如下如:

其中每个节点往下的16字节位置存储的都是路径或者其他数据等,这时插入了"lock"文件名,整体的结构变成了:

这时候最好是根据其所使用的数据结构来进行恢复,并且编写一下对应的遍历脚本,才有助于我们后续的逆向。

2.在完成了所有的配置数据的初始化后,可以看到图中所保存的数据有4个

图的内存结构

这里可以写个脚本遍历一下即可看到所有的内容了

3.在完成了对应的配置的图的初始化后,将对其加密所需的路径都添加到一个双向链表中,这里的话也放一下该链表的结构

list:

struct find_path_list{  
    int *head_ptr;  
    int node_count;  
};

这里可以看到头指针和里面的存储的数量,之后就是恢复一下对应的节点结构:

list_node:

struct list_node  
{  
  int *next;  
  int *back;  
  int *data;  
};

图的内存结构

在获取系统中比较重要的路径是通过主体类中的get_sys_import_path函数实现的,跟写加密密钥的那部分的内容获取关键路径的所用函数一样,都是使用了SHGetFolderPathW函数来实现的。

get_sys_import_path函数

4.获取系统中的物理驱动器中的路径是通过sub_AB0045函数实现的,其中find_root_path函数会将当前系统中的物理驱动器中的路径加入到数据结构中,用于后续的遍历等。

5.之后就该进入到下一个流程中了

STD::MAP结构恢复

上述已经通过硬逆看出来了,该数据结构是使用了图来对其路径内容进行了保存,所以这里的话就恢复一下对应的结构,具体怎么恢复的这里就不再说了,有需要的可以下去自己看一下红黑树对应的内容即可。

std::map:

struct std::map  
{  
  std::node *node;  
  int count;  
};

std::node:

struct std::node  
{  
int *parent;  
int *left;  
int *right;  
char color;  
char is_null;  
char offset[2];  
int *data;  
};

之后呢再看对应的遍历函数就比较清晰了,比如在插入函数时,里面红黑树的实现树的遍历等:

4.1.14 初始化RSA加密公钥

简介

该函数会解析程序末尾自带的0xA0长度的数据,将其当作Ber编码的方式解析成公钥,以用作后续的RSA加密使用。

执行流程

1.首先在初始化完毕所需数据结构后,在进入到主流程函数sub_E7974A函数后,第一步就是初始化RSA公钥

2.并且在进入到sub_E7A03F函数后,只能看到一个sub_E89085函数,其中实现了对RSA的解析和勒索信部分ID的计算。

3.进入sub_E89085函数后,将看到会存在两个比较重要的功能函数,一个是sub_E89C30函数,用于RSA的解析和初始化,另外一个就是获取一会儿写入勒索信时,所修要的部分ID的内容。

4.sub_C19C30函数主要实现了RSA公钥的创建与解析,其中RSA公钥的创建完毕后将得到如下内容结构,其中n的位置和e的位置都已标出,大家可以根据STL的String类型差不多模仿的建立一个结构体,以方便后续的逆向。

RSA公钥内存结构:

之后就是进行BERdecode的解析,实现函数是sub_CBB010函数,之后将解析完得到的RSA公钥的n和e给到刚才创建好的Public_Key上。

BER编码:

30819D300D06092A864886F70D010101050003818B0030818702818100B51B363D5379596F23A0B7CD45A37FF64CA0281FA540FD1C60A32585A37772295F297D0931AF4BFE35D3CC16B3D02AFF5468F09571484EA47DEA9E16B90C81FCD3ADB61CC41AE734E094B02EB15AEACF2A0F1D5BA672E237AD808ED323C8A022FD30740024FBD316CEFDF263293A60B5E718346E9663AC6498320418081C52F1020111

Ber编码内容与sub_C19C30函数

5.因为整体的执行是调用了Crypto++库中的RSA函数执行的,具体实现都是库函数内的实现,所以这里就不再细致的去分析容器内的实现了,直接就说执行后的结果吧。

执行完毕后就可以得到解析后的RSA公钥了,其中N和E都能看到具体的内容:

RSA公钥内容

N:
b51b363d5379596f23a0b7cd45a37ff64ca0281fa540fd1c60a32585a37772295f297d0931af4bfe35d3cc16b3d02aff5468f09571484ea47dea9e16b90c81fcd3adb61cc41ae734e094b02eb15aeacf2a0f1d5ba672e237ad808ed323c8a022fd30740024fbd316cefdf263293a60b5e718346e9663ac6498320418081c52f1

E:
17

4.1.15 在桌面写入勒索信

简介

该函数会实现在系统桌面路径下写入勒索信

执行流程

1.在上述执行完毕对RSA公钥的解析后,继续说一下上面没有说的勒索信ID的生成部分

2.在进入到get_ID函数后能够看到是一个Sha256的计算

其中计算的内容即是上面写入加密密钥文件所生成的128字节大小的随机数。

最后即可的到计算出来的sha256:0C897AE780AA16748C8E4F4BC9B9652BA6394493889B9018E3DE350FE62FA176

3.得到了勒索信ID的前半部分后将进行勒索信的替换工作了,主要实现函数是sub_E82CBD函数

4.进入到sub_E82CBD函数函数内部可以看到具体的替换过程,其中将上面得到的sha256编码成base64的形式替换勒索信模板的{{1}}的位置,将程序末尾自带的key替换到勒索信模板的{{2}}的位置即可完成。

5.最后就可以得到完整的勒索信的内容

6.最后将该内容,结合上面初始化过后的config_map里面保存着的勒索信的标题,将其写入到系统的桌面中。

4.1.16 目录遍历

简介

该函数主要实现了对前面存储路径的数据结构中的路径的过滤与启动多线程来实现对文件的加密与勒索信和KEY文件的释放。

执行流程

1.在执行完毕上面的创建完勒索信以后,将进入sub_C1604D函数执行一系列的获取路径,结合protobuf对象中的过滤内容来进行过滤等操作。

2.多线程的实现

每个线程遍历一个路径:

3.具体多线程的所触发的核心内容在sub_C5198C函数中能看到,该函数主要实现了对以上目录的遍历,外加__LOCK__文件和勒索信文件的写入,首先便是先向该遍历目录下写入勒索信!info.txt和___LOCK__文件,具体实现请看下面的写入!_INFO.txt勒索信和写入密钥文件__LOCK__。

4.之后遍历几个传入目录下的子目录,如果遍历到的是目录,那么就继续递归,并且向内写入勒索信和写__lock__文件。

如果是文件则会先判断是否是config_map中所存储的文件,如:!_INFO.txt
LOCK
、b30b4aba8cb7ba54b4f96f5b186828590ed1087fb3dbf5518239e4e325968d82
和当前可执行文件(halo.txt)
,如果不在其中的文件,则可以进入对文件内容进行加密的sub_A9BB67函数。

4.1.17 在遍历目录中写入勒索信

执行流程

1.继续上面的文件加密前半部的内容进行详细描述,首先对于写入勒索和写入__LOCK__文件都是由sub_A9DBC6函数实现

2.进入到sub_A9DBC6函数中,可以看到即将进入写入勒索和LOCK的主要实现函数

3.进入到主要实现函数中可以看到首先实现的就是写入LOCK文件,其次才是写入勒索信文件,这里就不再说勒索信的内容是如何生成的了,想了解的可以去看在桌面写入勒索信功能点的介绍部分吧。

4.1.18 在遍历目录中写入LOCK隐藏文件

执行流程

1.还是接着勒索信的写入部分继续说,可以看到写入LOCK函数是通过sub_AA327E函数实现的

2.进入到sub_AA327E函数可以看到,首先会先获取一下写入的Lock文件的路径,之后就是创建然后写入内容,写入的内容由当前运行的PID+random_128_bytes被base64编码后的值组成。

可以看到成功在当前遍历的目录下写入该文件

3.之后就会调用主要功能函数中的set_lock_file_hide函数来实现对lock文件设置成隐藏文件。

4.1.19 文件内容加密

流程图

执行流程

1.首先文件加密前的准备工作,主要是由sub_A9BB67函数实现的。

2.进入到sub_A9BB67函数中可以看到,该函数首先对文件的后缀进行了判断,判断是否是加密后缀,即防止二次加密的情况发生。

3.之后该函数调用了主体函数中的judge_file_is_exists函数来判断加密文件是否存在,又调用了主体函数的change_file_permissions函数给该文件一个可读可写可执行的777权限,最后对将文件的名称修改为了加密文件的名称。

4.做完以上的准备工作后,就要进入对文件的内容进行加密了,加密前的准备工作主要在sub_AAAEC7函数中可以看到。

5.进入到sub_AAAEC7函数中可以看到,该函数主要实现了加密密钥的生成与加密对象的初始化、文件内容加密、对Key进行加密和加密KEY后的数据的写入等操作,其中对文件进行加密的函数为sub_AB358F函数。

IV是由随机数对象生成的16字节的随机数,由sub_610E10函数实现

KEY的组成是由以下内容拼接起来的数据进行sha256以后的内容,具体由sub_58E655函数实现:

1.刚才生成的随机数IV

2.写入到密钥文件中的128字节的随机数sha256(random_128_sha256)

3.带部分后缀的文件名(这里需要注意,假如你的文件名是1.txt.txt,它只能取到1.txt为文件名)

最后将以上三部分的数据的sha256当作KEY进行加密使用

6.进入到sub_AB358F函数可以看到获取文件的大小,并且进行判断,之后会根据文件的大小是否小于0x200000字节,来选择是全加密,还是分段加密。

7.这部分可以参考该流程图:

若是大于0x200000字节则会分两部分进行加密,先会加密开头和结尾的数据,而开头数据加密的大小到底是多少,则是由随机数的值来决定的。

根据这个随机数来计算可以得到一个head_block_size,计算方法

head_block_size = (0x200000/随机数)*[(1-随机数)&0xffffffff]+0x200000&0xffffffff

之后除了头部以外的则都是采用了block_size,计算方法:block_size = 0x200000/随机数+0x200000&0xffffffff(这里的0xffffffff实际上在程序中是没有的,因为如果用别的语言复现的时候会出现溢出,所以最好这里就上了这个值进行约束一下)

这种大文件的分段加密的结构是:开头加密数据+明文数据+加密数据+明文数据+末尾加密数据

8.在对一个文件的头部数据和尾部数据加密完毕后,将要执行对于中间部分即剩余大小的数据进行加密,首先获取了一下剩余中间部分的字节大小,又计算了一下循环次数(循环次数=随机数-2),最后计算了一下不进行加密的数据块大小,计算方式:不加密数据大小=(剩余大小-循环次数*block_size)/循环次数。

9.得到了循环次数和不加密的数据大小后,就是开始对剩余大小的内容开始循环加密了

10.加密采用的AES具体实现是sub_750840函数,可以比较清晰的看到数据对齐与加密等操作。

11.最后在文件内容加密完成后,将会在末尾将得到的数据(\x01+\x00+IV+KEY+random_128_sha256+随机字节)一共84字节的信息进行RSA加密,所用的加密公钥上面也介绍过了,最后会得到一个128字节的密文,将其写入到文件的末尾,最后将文件的属性改成只读,就完成了整套的文件的加密操作。

12.最后文件加密完毕,将会调用主体函数change_permissions_only_read函数,实现对文件的权限修改为可读可执行。

4.1.20 删除写入的自启动注册表

执行流程

1.在执行完毕加密流程后,将执行主功能函数中的clear_register函数,来实现对写入自启动的注册表的删除

2.其实现主要是依赖于sub_6D106A函数实现,跟写入开机自启动时所使用的差不多。

4.1.21 删除自身

执行流程

1.在执行完删除注册表后,将执行删除自身的功能,主要调用的也是主功能函数中的del_self函数来实现的。

2.进入该函数的内部实现,可以看到主要是调用CMD进行命令执行,实现了删除自身,执行命令是:

cmd.exe /C ping 1.1.1.1 -n 10 -w 3000 > Nul & Del /f /q "filename"

5.病毒分析总结

该勒索病毒首先通过分析TLS回调函数,实现了程序的随机数生成和池初始化机制。接下来,通过手工重建了程序的虚表结构,从而解析了主要功能函数,这些函数包括文件操作和注册表操作等一系列主要函数,恢复结构之后病毒先读取了自身配置文件,获取了后面功能所需的信息,紧跟着实现了隐藏CMD窗口,避免被用户发现,具体是通过调用GetConsoleWindow和ShowWindow函数来实现的,完成了窗口隐藏后,程序会将自身配置写入到开启启动项的注册表中,在当前桌面和系统比较重要的系统路径中写入勒索信与密钥文件,接着就是完成最重要的目录遍历加密,遍历的同时写入LOCK隐藏文件和勒索信文件,文件加密运用了AES-CFB算法,加密完成后将KEY等信息运用RSA加密算法将其写入到文件末尾,最后对文件的权限设置成了只读,完成了以上所有的功能后,该病毒会执行删除自身,并且将写入到开启启动项中的注册表内容清楚,其中一个重要部分是恢复protobuf对象及其数据流,提供了protobuf对象的定义及恢复方法,这对于理解程序的数据传输和处理机制至关重要。

6.安全建议

6.1 风险消减措施

**资产梳理排查目标:**根据实际情况,对内外网资产进行分时期排查

**服务方式:**调研访谈、现场勘查、工具扫描

**服务关键内容:**流量威胁监测系统排查、互联网暴露面扫描服务、技术加固服务、集权系统排查

6.2 安全设备调优

目标

通过对安全现状的梳理和分析,识别安全策略上的不足,结合目标防御、权限最小化、缩小攻击面等一系列参考原则,对设备的相关配置策略进行改进调优,一方面,减低无效或低效规则的出现频次;另一方面,对缺失或遗漏的规则进行补充,实现将安全设备防护能力最优化。

主要目标设备

网络安全防护设备、系统防护软件、日志审计与分析设备、安全监测与入侵识别设备。

6.3 全员安全意识增强调优

目标:

通过网络安全意识宣贯、培训提升全方位安全能力

形式:

培训及宣贯


线下培训课表

若无法组织线下的集体培训,考虑两种方式:

1.提供相关的安全意识培训材料,由上而下分发学习

2.组织相关人员线上开会学习。线上培训模式。


线上学习平台

7.团队介绍

solar团队数年深耕勒索解密与数据恢复领域,在勒索解密和数据恢复领域建立了良好的声誉,以高效、安全、可靠的解决方案赢得了客户的信任。无论是个人用户还是大型企业,都能提供量身定制的服务,确保每一个被勒索软件侵害的数据都能够恢复到最佳状态,同时在解密数据恢复后,提供全面的后门排查及安全加固服务,杜绝二次感染的风险。同时,solar团队坚持自主研发及创新,在攻防演练平台、网络安全竞赛平台、网络安全学习平台方面加大研发投入,目前已获得十几项专利及知识产权。团队也先后通过了ISO9001质量管理体系、ISO14000环境管理体系、ISO45001职业安全健康管理体系 、ITSS(信息技术服务运行维护标准四级)以及国家信息安全漏洞库(CNNVD)技术支撑单位等认证,已构建了网络安全行业合格的资质体系。

More

8.数据恢复服务流程

多年的数据恢复处理经验,在不断对客户服务优化的过程中搭建了"免费售前+安心保障+专业恢复+安全防御"一体化的专业服务流程。

① 免费咨询/数据诊断分析

       专业的售前技术顾问服务,免费在线咨询,可第一时间获取数据中毒后的正确处理措施,防范勒索病毒在内网进一步扩散或二次执行,避免错误操作导致数据无法恢复。

       售前技术顾问沟通了解客户的机器中毒相关信息,结合团队数据恢复案例库的相同案例进行分析评估,初步诊断分析中毒数据的加密/损坏情况。

② 评估报价/数据恢复方案

       您获取售前顾问的初步诊断评估信息后,若同意进行进一步深入的数据恢复诊断,我们将立即安排专业病毒分析工程师及数据恢复工程师进行病毒逆向分析及数据恢复检测分析。

       专业数据恢复工程师根据数据检测分析结果,定制数据恢复方案(恢复价格/恢复率/恢复工期),并为您解答数据恢复方案的相关疑问。

③ 确认下单/签订合同

       您清楚了解数据恢复方案后,您可自主选择以下下单方式:

双方签署对公合同:根据中毒数据分析情况,量身定制输出数据恢复合同,合同内明确客户的数据恢复内容、数据恢复率、恢复工期及双方权责条款,双方合同签订,正式进入数据恢复专业施工阶段,数据恢复后进行验证确认,数据验证无误,交易完成。

④ 开始数据恢复专业施工

      安排专业数据恢复工程师团队全程服务,告知客户数据恢复过程注意事项及相关方案措施,并可根据客户需求及数据情况,可选择上门恢复/远程恢复。

      数据恢复过程中,团队随时向您报告数据恢复每一个节点工作进展(数据扫描 → 数据检测 → 数据确认 → 恢复工具定制 → 执行数据恢复 → 数据完整性确认)。

⑤ 数据验收/安全防御方案

      完成数据恢复后,我司将安排数据分析工程师进行二次检查确认数据恢复完整性,充分保障客户的数据恢复权益,二次检测确认后,通知客户进行数据验证。

      客户对数据进行数据验证完成后,我司将指导后续相关注意事项及安全防范措施,并可提供专业的企业安全防范建设方案及安全顾问服务,抵御勒索病毒再次入侵。

点击关注下方名片****进入公众号 了解更多

更多资讯 扫码加入群组交流

喜欢此内容的人还喜欢

【紧急警示】Locked勒索病毒利用最新PHP远程代码执行漏洞大规模批量勒索!文末附详细加固方案

索勒安全团队

【病毒分析】Steloj勒索病毒分析

索勒安全团队

【教程分享】勒索病毒来袭!教你如何做好数据防护

索勒安全团队

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2