Solarsec 发表于 2024-9-4 17:34

【病毒分析】以国内某安全厂商名字为后缀的BeijingCrypt勒索家族病毒分析

本帖最后由 Solarsec 于 2024-9-4 17:32 编辑

# **1.背景**

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



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



# 2.恶意文件基础信息

## 2.1 加密器基本信息

文件名: halo.exe

编译器: Microsoft Visual C/C++(19.16.27045)

大小: 1592533(1.52 MiB)

操作系统: Windows(XP)

架构: I386

模式: 32 位

类型: 控制台

字节序: LE

MD5: cfb990436ef17c7c77cac89718bca578

SHA1: e7ea093d67c723777de3d63eb809c0521aaf7b78

SHA256: bf4d07ae980e8e3968611027779664476dab1f8104c0e4d6dfb527ec106fcc12

## 2.2 勒索信

!_INFO.txt

```Plain
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
```

## 2.3 其他注意事项

# 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 加密的测试文件

### 文件名

sierting.txt

### 具体内容:





## 3.3 加密特征:

### 3.3.1 加密文件名特征:

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

### 3.3.2 加密数据特征:

文件原始大小+128Byte数据


## 3.4 加密算法:

文件加密使用了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.5 加密器释放文件

##### 勒索信(!_INFO.txt):

##### 文件内容:

```cpp
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
```

##### 成分分析:

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

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

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

#### key文件(e6b48af9d931c77955c3487f494200daa76da4eea4845dc257c7711ea8f9004f):

##### 文件内容:

```cpp
5f8rSGaKGiUMHqRQv1Ws7tkAXjM3qfZoyY8ZBUIByuG7EvjSuQ2HeCz9Oi0epMP5waS0Q86jpDuMyo4G59uC5IUyQkl0jxPqpLfGom5EpDvId8bSmKZA5+2tWgFjx+1ZGQOQUy6yLuv7byYbEu2mZNbeBVdGLU5Jftnz+X1Pafc=
```

##### 成分分析:

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

#### lock隐藏文件(__**lock_XXX__**):

##### 文件内容:

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

##### 成分分析:

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

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

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

# 4逆向分析

## 加密器逆向分析

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

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



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



sub_151000函数:

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



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

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

#### 简介:

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

### 重建的部分结构:

```cpp
struct vtable_stuct
{
vtable_func *sys_vtable;
};
struct vtable_func
{
int sub_E6F3FA;
int sub_E7038F;
int sub_E6FFDA;
int sub_E70045;
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;
};
```



### 隐藏CMD窗口:、

#### 执行流程:

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



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



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

#### 简介:

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

#### 配置结构图:



#### 执行流程:

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



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



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


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



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

6.将Key拷贝到结构中

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



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



### 检查是否多开:

#### 执行流程:

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



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



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

### 恢复protobuf对象:

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

恢复后的对象有:

#### bin_hdr_enc.proto:

```cpp
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:

```cpp
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 ;
    optional bool dry_run = 101 ;
    optional bool autorun_only = 102 ;
}
```

### 恢复protobuf数据流:

protubuf流:

```cpp
0A270A0468616C6F120A215F494E464F2E7478741801208010282C350E000000A00600A80600B0060012F8110A1C2E2A55736572735C5C2E2A5C5C4D6963726F736F66742048656C70240A172E2A55736572735C5C2E2A5C5C4D6963726F736F6674240A1B2E2A55736572735C5C2E2A5C5C5061636B616765204361636865240A0B2E2A5C5C416E794465736B0A102E2A5C5C436F6D6D6F6E2046696C65730A1D2E2A5C5C456D626564646564204C6F636B646F776E204D616E616765720A152E2A5C5C496E7465726E6574204578706C6F7265720A0B2E2A5C5C4D534275696C640A112E2A5C5C4D6963726F736F66742E4E45540A082E2A5C5C4F7261790A182E2A5C5C5265666572656E636520417373656D626C6965730A112E2A5C5C53796E6F6C6F677944726976650A142E2A5C5C57696E646F777320446566656E6465720A2F2E2A5C5C57696E646F777320446566656E64657220416476616E636564205468726561742050726F74656374696F6E0A132E2A5C5C57696E646F7773204A6F75726E616C0A102E2A5C5C57696E646F7773204D61696C0A182E2A5C5C57696E646F7773204D6564696120506C617965720A1F2E2A5C5C57696E646F7773204D756C74696D6564696120506C6174666F726D0A0E2E2A5C5C57696E646F7773204E540A182E2A5C5C57696E646F77732050686F746F205669657765720A1C2E2A5C5C57696E646F777320506F727461626C6520446576696365730A142E2A5C5C57696E646F77732053656375726974790A132E2A5C5C57696E646F777320536964656261720A152E2A5C5C57696E646F7773506F7765725368656C6C0A0F433A5C5C50726F6772616D446174610A0B433A5C5C57696E646F77732A065C2E346464242A065C2E34646C242A085C2E6163636462242A085C2E6163636463242A085C2E6163636465242A085C2E6163636472242A085C2E6163636474242A085C2E6163636674242A065C2E616462242A065C2E616465242A065C2E616466242A065C2E616470242A065C2E616C66242A065C2E61726D242A065C2E61727A242A065C2E61736B242A065C2E62616B242A075C2E62736F6E242A065C2E627472242A065C2E636174242A065C2E636462242A065C2E636B70242A065C2E636D61242A065C2E636E66242A065C2E637064242A0A5C2E63727970743132242A095C2E637279707438242A095C2E637279707439242A095C2E646163706163242A065C2E646164242A0D5C2E64616469616772616D73242A0B5C2E6461736368656D61242A055C2E6462242A095C2E64622D73686D242A095C2E64622D77616C242A065C2E646233242A065C2E646263242A065C2E646266242A065C2E646273242A065C2E646274242A065C2E646276242A065C2E646278242A065C2E646362242A065C2E646374242A065C2E646378242A065C2E64646C242A075C2E646C6973242A065C2E646C6C242A065C2E646D70242A065C2E647031242A065C2E647179242A065C2E64736B242A065C2E64736E242A075C2E64747378242A065C2E64786C242A065C2E65636F242A065C2E656378242A065C2E656462242A075C2E6570696D242A065C2E666364242A065C2E666462242A065C2E666963242A065C2E666D35242A065C2E666D70242A085C2E666D703132242A085C2E666D70736C242A065C2E666F6C242A065C2E667033242A065C2E667034242A065C2E667035242A065C2E667037242A065C2E667074242A065C2E66726D242A065C2E676462242A075C2E67726462242A065C2E677769242A065C2E686462242A065C2E686973242A055C2E6962242A065C2E696263242A065C2E696264242A065C2E69627A242A065C2E696462242A065C2E696878242A065C2E69736D242A075C2E69746462242A065C2E697477242A065C2E6A6574242A075C2E6A736F6E242A065C2E6A7478242A065C2E6B6462242A075C2E6B657869242A085C2E6B65786963242A085C2E6B65786973242A065C2E6C6466242A065C2E6C6763242A065C2E6C7778242A065C2E6D6166242A065C2E6D6171242A065C2E6D6172242A0A5C2E6D61727368616C242A065C2E6D6173242A065C2E6D6176242A065C2E6D626B242A065C2E6D6462242A065C2E6D6466242A065C2E6D7064242A065C2E6D7267242A065C2E6D7564242A065C2E6D7762242A065C2E6D7964242A065C2E6D7969242A085C2E6D7973716C242A065C2E6E6466242A065C2E6E6E74242A095C2E6E726D6C6962242A065C2E6E7332242A065C2E6E7333242A065C2E6E7334242A065C2E6E7366242A055C2E6E76242A065C2E6E7632242A075C2E6E776462242A065C2E6E7966242A065C2E6F6462242A065C2E6F7074242A065C2E6F7179242A065C2E6F7261242A065C2E6F7278242A065C2E6F7763242A065C2E703936242A065C2E703937242A065C2E70616E242A065C2E706462242A065C2E70646D242A065C2E70686C242A065C2E706E7A242A0A5C2E71627175657279242A065C2E717279242A065C2E717664242A065C2E726266242A075C2E72637464242A065C2E726F64242A075C2E726F6478242A065C2E727064242A065C2E727364242A065C2E72756C242A065C2E73616C242A0B5C2E7361733762646174242A065C2E736266242A065C2E736378242A065C2E736462242A065C2E736463242A065C2E736466242A065C2E736973242A065C2E736C64242A065C2E736D64242A065C2E737071242A065C2E73716C242A095C2E73716C697465242A0A5C2E73716C69746533242A0B5C2E73716C6974656462242A065C2E737172242A065C2E737973242A055C2E7465242A0A5C2E74656163686572242A065C2E746D64242A065C2E747073242A065C2E747263242A065C2E74726D242A065C2E756462242A065C2E75646C242A065C2E757372242A065C2E763132242A065C2E766973242A065C2E767064242A065C2E767676242A065C2E776462242A075C2E776D6462242A065C2E77726B242A065C2E786462242A065C2E786C64242A085C2E786D6C6666242A075E5B5E2E5D2B243207737663686F7374320F5E6578706C6F7265725C2E657865243A110A0D4E54555345525C2E4441542E2A10003A0C0A065C2E646C6C2410D086033A0C0A065C2E7379732410D086033A0D0A075E5B5E2E5D2B2410A08D063A0B0A07626F6F746D677210003A0F0A0B706167652E2A5C2E73797310003A0F0A0B737761702E2A5C2E73797310001AB6055741524E494E472120594F55522046494C45532041524520454E43525950544544210A446F6EE280997420776F7272792C20796F75722066696C65732061726520736166652C2070726F7669646564207468617420796F75206172652077696C6C696E6720746F20706179207468652072616E736F6D2E0A416E7920666F726365642073687574646F776E206F7220617474656D70747320746F20726573746F726520796F75722066696C65732077697468207468652074687269642D706172747920736F6674776172652077696C6C2062652064616D61676520796F75722066696C6573207065726D616E656E746C79210A446F206E6F742072656E616D6520796F75722066696C65732E2049742077696C6C2064616D6167652069742E0A0A546865206F6E6C792077617920746F206465637279707420796F75722066696C657320736166656C7920697320746F2062757920746865207370656369616C2064656372797074696F6E20736F6674776172652066726F6D2075732E0A0A4265666F726520706179696E6720796F752063616E2073656E6420757320757020746F20322066696C657320666F7220667265652064656372797074696F6E2061732067756172616E7465652E204E6F2064617461626173652066696C657320666F7220746573742E0A53656E642070696374757265732C20746578742C20646F632066696C65732E202866696C6573206E6F206D6F7265207468616E20316D62290A0A596F752063616E20636F6E7461637420757320776974682074686520666F6C6C6F77696E6720656D61696C0A0A3336307265636F76657240676D61696C2E636F6D0A333630737570706F727440636F636B2E6C690A0A53656E642075732074686973204944206F7220746869732066696C6520696E20666972737420656D61696C0A0A49443A207B7B327D7D3A7B7B317D7D0A20142A0C5F5F6C6F636B5F5858585F5F
```

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



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

```cpp
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 ;
                  optional bool dry_run = 0 ;
                  optional bool autorun_only = 0 ;
      }
];
    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__";
}
```

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

##### 黑名单目录:

```cpp
'.*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'
```

##### 重要的加密文件后缀:

```cpp
'\\.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$', '^[^.]+$'
```

##### 勒索信模板:

```cpp
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的文件名:

```cpp
__lock_XXX__
```

##### 勒索信文件名:

```cpp
!_INFO.txt
```

##### 加密后缀:

```cpp
halo
```

### 解析Protubuf数据

#### 执行流程:

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

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



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



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

### 获得注册表的键名

#### 执行流程:

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

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

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



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



发现跟结果一样



### 写入开机启动项:

#### 简介:

该函数主要由主体函数的**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作为值,如:

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

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



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



注册表内:



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

### 写入加密密钥文件

#### 简介:

该**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的结构可以看到成功写入到了该路径中



### 获取系统中的路径

#### 简介:

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

#### 执行流程:

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



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



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



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



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

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



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



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

list:

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



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

list_node:

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





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



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





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



#### STD::MAP结构恢复

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

std::map:

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

std::node:

```cpp
struct std::node
{
int *parent;
int *left;
int *right;
char color;
char is_null;
char offset;
int *data;
};
```

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



### 初始化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编码:

```Plain
30819D300D06092A864886F70D010101050003818B0030818702818100B51B363D5379596F23A0B7CD45A37FF64CA0281FA540FD1C60A32585A37772295F297D0931AF4BFE35D3CC16B3D02AFF5468F09571484EA47DEA9E16B90C81FCD3ADB61CC41AE734E094B02EB15AEACF2A0F1D5BA672E237AD808ED323C8A022FD30740024FBD316CEFDF263293A60B5E718346E9663AC6498320418081C52F1020111
```



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

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



#### RSA公钥内容:

##### N:

```Plain
b51b363d5379596f23a0b7cd45a37ff64ca0281fa540fd1c60a32585a37772295f297d0931af4bfe35d3cc16b3d02aff5468f09571484ea47dea9e16b90c81fcd3adb61cc41ae734e094b02eb15aeacf2a0f1d5ba672e237ad808ed323c8a022fd30740024fbd316cefdf263293a60b5e718346e9663ac6498320418081c52f1
```



##### E:

```Plain
17
```



### 在桌面写入勒索信

#### 简介:

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

#### 执行流程:

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里面保存着的勒索信的标题,将其写入到系统的桌面中。



### 目录遍历:

#### 简介:

该函数主要实现了对前面存储路径的数据结构中的路径的过滤与启动多线程来实现对文件的加密与勒索信和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**函数。



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

#### 执行流程:

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



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



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



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

#### 执行流程:

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



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



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



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




### 文件内容加密:

#### 流程图:



#### 执行流程:

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函数,实现对文件的权限修改为可读可执行。



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

#### 执行流程:

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



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



### 删除自身

#### 执行流程:

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



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

```Bash
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对象的定义及恢复方法,这对于理解程序的数据传输和处理机制至关重要。

天轩科技 发表于 2024-9-4 19:22

Solar 好强。每一篇贴内容都很有质量

Solarsec 发表于 2024-9-5 17:07

shaokui123 发表于 2024-9-5 15:52
大佬任一文庄甩出来也能吊打整条街,但是道高一尺魔高一丈,应该也有大佬暂时处理不了的坏家伙吧

有的……后面我们会发一篇之前处理的针对nas的勒索病毒,那个客户交了赎金,但是黑客给的工具也无法解密,这种属于勒索加密本身有bug的确实束手无策;以及有的用的rsa的加密,确实无法破解。 但是我们团队的优势除了逆向分析以为,更多的是全流程服务,从应急响应,到溯源分析,再到逆向破解,以及数据恢复,恢复之后的安全加固等等。

Foticing 发表于 2024-9-4 18:35

分析的很详细{:301_993:}

Solarsec 发表于 2024-9-4 19:32

天轩科技 发表于 2024-9-4 19:22
Solar 好强。每一篇贴内容都很有质量

hhh,感谢支持,这一篇应该是目前发布过的里面分析难度最高,耗时最久的一篇了。

天轩科技 发表于 2024-9-4 19:34

Solarsec 发表于 2024-9-4 19:32
hhh,感谢支持,这一篇应该是目前发布过的里面分析难度最高,耗时最久的一篇了。

这几天看到你发了几篇帖子。质量很高。

buwenbuwenxx 发表于 2024-9-4 19:39

感谢大佬分享这么全面的分析贴,点赞!

Solarsec 发表于 2024-9-4 19:43

天轩科技 发表于 2024-9-4 19:34
这几天看到你发了几篇帖子。质量很高。

感谢师傅鼓励,互相学习。

linuxdev 发表于 2024-9-4 20:09

上次也看见帖子了,确实分析的很详细。{:1_921:}

另外,不少病毒确实喜欢用杀毒软件名称命名,比如以前病毒也经常碰瓷360名字的。

amwquhwqas128 发表于 2024-9-4 22:38

分析详细且文章内容也写得容易令人明白

hymnmx 发表于 2024-9-4 22:57

感谢分享!感觉挺令人容易理解的
页: [1] 2 3 4
查看完整版本: 【病毒分析】以国内某安全厂商名字为后缀的BeijingCrypt勒索家族病毒分析