【病毒分析】全网首发!以国内某安全厂商名字为后缀的勒索病毒分析
1.背景本文重要介绍为BeijngCrypt勒索病毒家族的最新变种,即.halo勒索病毒,该家族首次被发现时间为2020年。曾在2023全球勒索软件研究报告中,以8.39%的占比位列国内第五大活泼勒索病毒家族。从2020年发展至今,期间存在多次变种,这几年间一直保持着每年更新1-2次升级变种的频率
重要加密后缀有:.BeJing、.360、.halo、.file、.520、.genesis、.baxia
https://img-blog.csdnimg.cn/img_convert/9870c4a0ebbd4aa0abfe064f6ede3b81.png
该家族最新病毒为.halo病毒,最早发现于2023年初,该病毒会利用长途桌面爆破、数据库端口攻击和垃圾邮件等多种方式进行流传,加密用户的文件并要求用户支付赎金才气进行文件解密。
https://img-blog.csdnimg.cn/img_convert/19e36a748c645050c6cb4c6e7e11a07a.png
2.恶意文件根本信息
2.1 加密器基本信息
文件名admin.exe halo.exe编译器Microsoft Visual C/C++(19.16.27045)巨细1592533(1.52 MiB)操作体系Windows(XP)架构I386模式32 位范例控制台字节序LEMD5cfb990436ef17c7c77cac89718bca578SHA1e7ea093d67c723777de3d63eb809c0521aaf7b78SHA256bf4d07ae980e8e3968611027779664476dab1f8104c0e4d6dfb527ec106fcc12 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 具体内容
https://img-blog.csdnimg.cn/img_convert/b97b852c29008cf82077d5262121fa19.png
https://img-blog.csdnimg.cn/img_convert/1a3db16f8429b0e33d1bb9ec7f53fce2.png
3.3 加密特性
3.3.1 加密文件名特性
加密文件名 = 原始文件名+加密后缀 ,例如:sierting.txt.halo
3.3.2 加密数据特性
文件原始巨细+128Byte数据
https://img-blog.csdnimg.cn/img_convert/d9f804b120214ca961cb64aea94461c3.png
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函数
https://img-blog.csdnimg.cn/img_convert/4394f0f8085744dc17abe2eb411173b5.png
分别为sub_151000、sub_151026和sub_151072三个函数,该TLS回调函数作用就是分别调用这三个函数。
https://img-blog.csdnimg.cn/img_convert/cd9f06c37cf3ef85f5f935744f62145a.png
sub_151000函数:
重要通过sub_1F66C0函数来实现了一个对于RandomPool的初始化,相当于AutoSeededRandomPool RNG这句代码;
https://img-blog.csdnimg.cn/img_convert/b03c4d9877bd6a5cea573b91273c5038.png
别的的两个函数都是一样,重要用于后续的几种差别的随机,以防止内部状态一样。
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;
}; https://img-blog.csdnimg.cn/img_convert/ab418ec90893b64c1df27ceaf67aa7a9.png
4.1.4 隐藏CMD窗口
执行流程
1.从Main函数中可以看到,首先开始的便是调用虚表地址,来获取主体函数列表,之后选择调用其hide_cmd_windows函数,实现对自身CMD窗口的隐藏。
https://img-blog.csdnimg.cn/img_convert/a977602f83c95bd9ce5837c6e8af1c99.png
2.进入到hide_cmd_windows函数可以看到,该函数重要是通过调用GetConsoleWindow()函数来获取当前窗口的句柄,之后调用ShowWindow函数来实现对当前窗口的隐藏。
https://img-blog.csdnimg.cn/img_convert/3182bbc13d80cf3d57ddb1d8e868acf8.png
4.1.5 读取自身所携带的配置信息
简介
该函数会读取处于文件末尾的一段配置文件的内容,其中包含了Key和各种加密所需内容等。
配置结构图
https://img-blog.csdnimg.cn/img_convert/d5a75b8013283cf37cf817bdfb32aad8.png
执行流程
1.在执行完隐藏窗口后,该程序会执行初始化配置信息,重要通过sub_AAD468函数实现。
https://img-blog.csdnimg.cn/img_convert/e09d3c8c7efeca46355adb5b9f824ff3.png
2.进入到sub_AAD468函数可以看到,该函数会先读取间隔文件末尾0x48巨细的数据
https://img-blog.csdnimg.cn/img_convert/7be5675839a58b0c6b7728215ffbdb16.png
3.对Key+RSA公钥数据的巨细+勒索信和黑名单等数据的巨细这部分的数据进行Sha256
https://img-blog.csdnimg.cn/img_convert/fe46e5926873c40e0940fa6f06abbf9d.png
4.与文件末尾的那部分数据进行校验,如果一样就进行下面的
https://img-blog.csdnimg.cn/img_convert/10a6b3a5f2ef2ea8acbc1169f2eea615.png
5.将RSA公钥部分0xA0巨细的数据进行拷贝到结构中
6.将Key拷贝到结构中
7.将勒索信和黑名单等数据拷贝到结构中
https://img-blog.csdnimg.cn/img_convert/3e80a5edb66e84339cd229a8b5c4179b.png
8.清空保存以上内的内存,并且关闭文件流
https://img-blog.csdnimg.cn/img_convert/fe02642e20f2cd8083514b99026685e7.png
4.1.6 查抄是否多开
执行流程
1. 该函数会先通过调用主功能函数中的get_file_name函数来获取自身路径,外加文件名称等。
https://img-blog.csdnimg.cn/img_convert/b6b5fa257df51a3b140ee32e95ab9d44.png
2.之后会交由主功能函数中的find_process_exec函数来进行遍历当前体系所运行的历程中的可执行文件是否为自身。
https://img-blog.csdnimg.cn/img_convert/3930b2dd18638f7eb658df5c245ccf74.png
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 ;
optional bool dry_run = 101 ;
optional bool autorun_only = 102 ;
} 4.1.8 手动恢复protobuf数据流
protubuf流:
0A270A0468616C6F120A215F494E464F2E7478741801208010282C350E000000A00600A80600B0060012F8110A1C2E2A55736572735C5C2E2A5C5C4D6963726F736F66742048656C70240A172E2A55736572735C5C2E2A5C5C4D6963726F736F6674240A1B2E2A55736572735C5C2E2A5C5C5061636B616765204361636865240A0B2E2A5C5C416E794465736B0A102E2A5C5C436F6D6D6F6E2046696C65730A1D2E2A5C5C456D626564646564204C6F636B646F776E204D616E616765720A152E2A5C5C496E7465726E6574204578706C6F7265720A0B2E2A5C5C4D534275696C640A112E2A5C5C4D6963726F736F66742E4E45540A082E2A5C5C4F7261790A182E2A5C5C5265666572656E636520417373656D626C6965730A112E2A5C5C53796E6F6C6F677944726976650A142E2A5C5C57696E646F777320446566656E6465720A2F2E2A5C5C57696E646F777320446566656E64657220416476616E636564205468726561742050726F74656374696F6E0A132E2A5C5C57696E646F7773204A6F75726E616C0A102E2A5C5C57696E646F7773204D61696C0A182E2A5C5C57696E646F7773204D6564696120506C617965720A1F2E2A5C5C57696E646F7773204D756C74696D6564696120506C6174666F726D0A0E2E2A5C5C57696E646F7773204E540A182E2A5C5C57696E646F77732050686F746F205669657765720A1C2E2A5C5C57696E646F777320506F727461626C6520446576696365730A142E2A5C5C57696E646F77732053656375726974790A132E2A5C5C57696E646F777320536964656261720A152E2A5C5C57696E646F7773506F7765725368656C6C0A0F433A5C5C50726F6772616D446174610A0B433A5C5C57696E646F77732A065C2E346464242A065C2E34646C242A085C2E6163636462242A085C2E6163636463242A085C2E6163636465242A085C2E6163636472242A085C2E6163636474242A085C2E6163636674242A065C2E616462242A065C2E616465242A065C2E616466242A065C2E616470242A065C2E616C66242A065C2E61726D242A065C2E61727A242A065C2E61736B242A065C2E62616B242A075C2E62736F6E242A065C2E627472242A065C2E636174242A065C2E636462242A065C2E636B70242A065C2E636D61242A065C2E636E66242A065C2E637064242A0A5C2E63727970743132242A095C2E637279707438242A095C2E637279707439242A095C2E646163706163242A065C2E646164242A0D5C2E64616469616772616D73242A0B5C2E6461736368656D61242A055C2E6462242A095C2E64622D73686D242A095C2E64622D77616C242A065C2E646233242A065C2E646263242A065C2E646266242A065C2E646273242A065C2E646274242A065C2E646276242A065C2E646278242A065C2E646362242A065C2E646374242A065C2E646378242A065C2E64646C242A075C2E646C6973242A065C2E646C6C242A065C2E646D70242A065C2E647031242A065C2E647179242A065C2E64736B242A065C2E64736E242A075C2E64747378242A065C2E64786C242A065C2E65636F242A065C2E656378242A065C2E656462242A075C2E6570696D242A065C2E666364242A065C2E666462242A065C2E666963242A065C2E666D35242A065C2E666D70242A085C2E666D703132242A085C2E666D70736C242A065C2E666F6C242A065C2E667033242A065C2E667034242A065C2E667035242A065C2E667037242A065C2E667074242A065C2E66726D242A065C2E676462242A075C2E67726462242A065C2E677769242A065C2E686462242A065C2E686973242A055C2E6962242A065C2E696263242A065C2E696264242A065C2E69627A242A065C2E696462242A065C2E696878242A065C2E69736D242A075C2E69746462242A065C2E697477242A065C2E6A6574242A075C2E6A736F6E242A065C2E6A7478242A065C2E6B6462242A075C2E6B657869242A085C2E6B65786963242A085C2E6B65786973242A065C2E6C6466242A065C2E6C6763242A065C2E6C7778242A065C2E6D6166242A065C2E6D6171242A065C2E6D6172242A0A5C2E6D61727368616C242A065C2E6D6173242A065C2E6D6176242A065C2E6D626B242A065C2E6D6462242A065C2E6D6466242A065C2E6D7064242A065C2E6D7267242A065C2E6D7564242A065C2E6D7762242A065C2E6D7964242A065C2E6D7969242A085C2E6D7973716C242A065C2E6E6466242A065C2E6E6E74242A095C2E6E726D6C6962242A065C2E6E7332242A065C2E6E7333242A065C2E6E7334242A065C2E6E7366242A055C2E6E76242A065C2E6E7632242A075C2E6E776462242A065C2E6E7966242A065C2E6F6462242A065C2E6F7074242A065C2E6F7179242A065C2E6F7261242A065C2E6F7278242A065C2E6F7763242A065C2E703936242A065C2E703937242A065C2E70616E242A065C2E706462242A065C2E70646D242A065C2E70686C242A065C2E706E7A242A0A5C2E71627175657279242A065C2E717279242A065C2E717664242A065C2E726266242A075C2E72637464242A065C2E726F64242A075C2E726F6478242A065C2E727064242A065C2E727364242A065C2E72756C242A065C2E73616C242A0B5C2E7361733762646174242A065C2E736266242A065C2E736378242A065C2E736462242A065C2E736463242A065C2E736466242A065C2E736973242A065C2E736C64242A065C2E736D64242A065C2E737071242A065C2E73716C242A095C2E73716C697465242A0A5C2E73716C69746533242A0B5C2E73716C6974656462242A065C2E737172242A065C2E737973242A055C2E7465242A0A5C2E74656163686572242A065C2E746D64242A065C2E747073242A065C2E747263242A065C2E74726D242A065C2E756462242A065C2E75646C242A065C2E757372242A065C2E763132242A065C2E766973242A065C2E767064242A065C2E767676242A065C2E776462242A075C2E776D6462242A065C2E77726B242A065C2E786462242A065C2E786C64242A085C2E786D6C6666242A075E5B5E2E5D2B243207737663686F7374320F5E6578706C6F7265725C2E657865243A110A0D4E54555345525C2E4441542E2A10003A0C0A065C2E646C6C2410D086033A0C0A065C2E7379732410D086033A0D0A075E5B5E2E5D2B2410A08D063A0B0A07626F6F746D677210003A0F0A0B706167652E2A5C2E73797310003A0F0A0B737761702E2A5C2E73797310001AB6055741524E494E472120594F55522046494C45532041524520454E43525950544544210A446F6EE280997420776F7272792C20796F75722066696C65732061726520736166652C2070726F7669646564207468617420796F75206172652077696C6C696E6720746F20706179207468652072616E736F6D2E0A416E7920666F726365642073687574646F776E206F7220617474656D70747320746F20726573746F726520796F75722066696C65732077697468207468652074687269642D706172747920736F6674776172652077696C6C2062652064616D61676520796F75722066696C6573207065726D616E656E746C79210A446F206E6F742072656E616D6520796F75722066696C65732E2049742077696C6C2064616D6167652069742E0A0A546865206F6E6C792077617920746F206465637279707420796F75722066696C657320736166656C7920697320746F2062757920746865207370656369616C2064656372797074696F6E20736F6674776172652066726F6D2075732E0A0A4265666F726520706179696E6720796F752063616E2073656E6420757320757020746F20322066696C657320666F7220667265652064656372797074696F6E2061732067756172616E7465652E204E6F2064617461626173652066696C657320666F7220746573742E0A53656E642070696374757265732C20746578742C20646F632066696C65732E202866696C6573206E6F206D6F7265207468616E20316D62290A0A596F752063616E20636F6E7461637420757320776974682074686520666F6C6C6F77696E6720656D61696C0A0A3336307265636F76657240676D61696C2E636F6D0A333630737570706F727440636F636B2E6C690A0A53656E642075732074686973204944206F7220746869732066696C6520696E20666972737420656D61696C0A0A49443A207B7B327D7D3A7B7B317D7D0A20142A0C5F5F6C6F636B5F5858585F5F 利用工具对其进行解析后可以得到内容:
https://img-blog.csdnimg.cn/img_convert/dbb4440093f5bfc41c86eb1f87c009f7.png
程序内部整体是采用了一个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 ;
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__";
} 由该对象中的内容可以大致了解到,全部的路径和后缀的匹配全都是采用了正则的方式。
黑名单目录
'.*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来对勒索信和黑名单那部分的数据进行解析
https://img-blog.csdnimg.cn/img_convert/93798803203f8fc8a21978d8874cc731.png
3.将读取到的0xBED巨细的勒索信和黑名单的数据当作protubuf数据解析到protobuf的几个对象中
https://img-blog.csdnimg.cn/img_convert/fd89d4df5bcd9eb5ccec54384872a9e6.png
4. 之后就是将0xBED巨细的勒索信和黑名单等数据解析成protobuf对象,供背面的其他功能利用。
4.1.10 获得注册表的键名
执行流程
1.该函数会先读取程序末尾的key,之后又调用了重要功能类中get_file_name来获取当前程序的路径
2.将上述两端数据拼接到一起
3.盘算一下两端数据中的sha256
https://img-blog.csdnimg.cn/img_convert/22ee88106c8fb14460e25c7f8e25f7ae.png
这里可以写个脚本来对其内容进行验证一下:
https://img-blog.csdnimg.cn/img_convert/8786051432e09254b2658ac6bd70741f.png
发现跟效果一样
https://img-blog.csdnimg.cn/img_convert/b570c06ddc0a78c6c995805f476c412e.png
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
https://img-blog.csdnimg.cn/img_convert/0646c5e117edff4ef6143e1ed142fa9d.png
2.之后调用write_registr_table函数来实现对开机自启注册表的启动。
https://img-blog.csdnimg.cn/img_convert/4bbed5f6c700288ac6faa731ef69e58f.png
3.写入完毕后,将调用unknown_libname_10函数对sha256、key和文件路径进行内存的释放等操作,并且返回。
https://img-blog.csdnimg.cn/img_convert/d7a2eb4da0aca0518ef904e7cff7fbcd.png
write_registr_table函数
1.获取了刚才盘算的key+文件路径的sha256
2.获取key
3.获取文件路径
https://img-blog.csdnimg.cn/img_convert/76e5ae383209b61d7c180e7f3198a8cd.png
4.先将key+文件路径的sha256作为KEY,路径和KEY作为值,如:
{"52245305000b880c91a0d6bf2b982de81be79a57a2c3bb290602b2819f794e37":"XXXX/halo.exe b30b4aba8cb7ba54b4f96f5b186828590ed1087fb3dbf5518239e4e325968d82"} 写入到开启启动项\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中
https://img-blog.csdnimg.cn/img_convert/8a1d5187c883a4e595295728e5400fbb.png
监控
监控上可以看到写入的路径和内容与我们分析的一致
可看到写入的路径和内容与我们分析的一致
https://img-blog.csdnimg.cn/img_convert/ad236b3d4253dbd93fb02a3c9f717da1.png
注册表内:
https://img-blog.csdnimg.cn/img_convert/92636390045a1f93373429e53b907aec.png
同理还会往\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run写入同样的内容。
4.1.12 写入加密密钥文件
简介
该sub_D52540函数功能是重要在体系C:/ProgarmData下写入密钥文件,密钥文件名称为b30b4aba8cb7ba54b4f96f5b186828590ed1087fb3dbf5518239e4e325968d82,密钥内容为128字节的随机数的Base64.
https://img-blog.csdnimg.cn/img_convert/12fae3b8dfb2fd741df16aa8c0c4fa5a.png
执行流程
1.在写完注册表后,将进入写入勒索信和加密等环节
https://img-blog.csdnimg.cn/img_convert/1785025c8ff7f02871485efba01a70f1.png
2.先获取了文件末尾的key,之后调用了sub_D52540函数来实现对密钥文件的后续操作。
sub_D52540函数
该函数重要实现了密钥文件路径的获取、随机数的天生和对随机数进行base64编码,之后调用主体函数的write_key_to_file函数将base64编码以后的随机数据写入到密钥文件所在路径中。
https://img-blog.csdnimg.cn/img_convert/871d49c7d617bde3d84a03af4058be1e.png
write_key_to_file函数
该函数重要实现了对密钥文件路径的获取、密钥文件的创建和密钥编码内容的写入
https://img-blog.csdnimg.cn/img_convert/f79ab23fb861775683208728588691ac.png
其中密钥路径的获取重要是采用了SHGetFolderPathW函数来实现的,其中CSIDL为35即代表了C://ProgarmData这个路径。
https://img-blog.csdnimg.cn/img_convert/ab85f28e7f583a683551da385f8b9fde.png
通过procmon的结构可以看到成功写入到了该路径中
https://img-blog.csdnimg.cn/img_convert/45b386fcb82119cbd2e82c4602f2630d.png
procmon效果
4.1.13 获取体系中的路径
简介
该函数重要实现了对两个数据结构的初始化和一个链表结构的初始化,其中两个图,一个是存储了所需配置信息的图,别的一个是存储了当前体系物理存储根路径的图,而一个链表则是存储了需要加密的所遍历的路径等。
执行流程
1.在完成了密钥文件的写入后,将对路径的数据结构进行了一些勒索信的文件名和加密密钥的文件名等数据的插入
https://img-blog.csdnimg.cn/img_convert/7e10c73d8927e6fda2844ee92fde4112.png
该程序中的路径和其他的一些所需数据采用了图的数据结构,如该内存结构所示:
https://img-blog.csdnimg.cn/img_convert/b366b39c76b7d6648e2338323c063c3e.png
图结点的内存结构
其中前三个地址指向三个结点,分别为off_1467538、off_1467080和off_1467538,而在其三个节点往下4个字节的位置即为存储的路径和所需数据,根据其关系可以绘制如下如:
https://img-blog.csdnimg.cn/img_convert/3943a38ae8124ad22a0cce8f5e559132.png
其中每个节点往下的16字节位置存储的都是路径大概其他数据等,这时插入了"lock"文件名,整体的结构变成了:
https://img-blog.csdnimg.cn/img_convert/f7409e074c62a6f9ae05e4a24851e930.png
这时候最好是根据其所利用的数据结构来进行恢复,并且编写一下对应的遍历脚本,才有助于我们后续的逆向。
2.在完成了全部的配置数据的初始化后,可以看到图中所保存的数据有4个
https://img-blog.csdnimg.cn/img_convert/c2272efc50378693830777ee885ace57.png
图的内存结构
这里可以写个脚本遍历一下即可看到全部的内容了
https://img-blog.csdnimg.cn/img_convert/d2735b1ece6d4c3c8dba9c7aebd99670.png
3.在完成了对应的配置的图的初始化后,将对其加密所需的路径都添加到一个双向链表中,这里的话也放一下该链表的结构
list:
struct find_path_list{
int *head_ptr;
int node_count;
}; https://img-blog.csdnimg.cn/img_convert/8d906d3ef6556baccc270c6c2e7c6c6e.png
这里可以看到头指针和里面的存储的数目,之后就是恢复一下对应的节点结构:
list_node:
struct list_node
{
int *next;
int *back;
int *data;
}; https://img-blog.csdnimg.cn/img_convert/6aa7727bc10498749a9e4ec46ef0266f.png
图的内存结构
https://img-blog.csdnimg.cn/img_convert/0c962df3b66ca16218a856314be39273.png
在获取体系中比较重要的路径是通过主体类中的get_sys_import_path函数实现的,跟写加密密钥的那部分的内容获取关键路径的所用函数一样,都是利用了SHGetFolderPathW函数来实现的。
https://img-blog.csdnimg.cn/img_convert/f5e69ba00bcd0fd69fe46beed8f0d057.png
get_sys_import_path函数
4.获取体系中的物理驱动器中的路径是通过sub_AB0045函数实现的,其中find_root_path函数会将当前体系中的物理驱动器中的路径到场到数据结构中,用于后续的遍历等。
https://img-blog.csdnimg.cn/img_convert/b8123020a31b64b18e84e8ed84865e0e.png
https://img-blog.csdnimg.cn/img_convert/fb8e87250c76f9b8680361f308022c93.png
5.之后就该进入到下一个流程中了
https://img-blog.csdnimg.cn/img_convert/baaa25700e049fb8da8cde701b149279.png
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;
int *data;
}; 之后呢再看对应的遍历函数就比较清晰了,好比在插入函数时,里面红黑树的实现树的遍历等:
https://img-blog.csdnimg.cn/img_convert/416d923481fac31eeb300beb2d5d2f3c.png
4.1.14 初始化RSA加密公钥
简介
该函数会解析程序末尾自带的0xA0长度的数据,将其当作Ber编码的方式解析成公钥,以用作后续的RSA加密利用。
执行流程
1.首先在初始化完毕所需数据结构后,在进入到主流程函数sub_E7974A函数后,第一步就是初始化RSA公钥
https://img-blog.csdnimg.cn/img_convert/d9787f98b07e24533368e25dcef2bf04.png
2.并且在进入到sub_E7A03F函数后,只能看到一个sub_E89085函数,其中实现了对RSA的解析和勒索信部分ID的盘算。
https://img-blog.csdnimg.cn/img_convert/da02a5b9452434da08e431f79f31f5ba.png
3.进入sub_E89085函数后,将看到会存在两个比较重要的功能函数,一个是sub_E89C30函数,用于RSA的解析和初始化,别的一个就是获取一会儿写入勒索信时,所修要的部分ID的内容。
https://img-blog.csdnimg.cn/img_convert/65247a30e7e4c199629530a7918d9563.png
4.sub_C19C30函数重要实现了RSA公钥的创建与解析,其中RSA公钥的创建完毕后将得到如下内容结构,其中n的位置和e的位置都已标出,各人可以根据STL的String范例差不多模仿的建立一个结构体,以方便后续的逆向。
RSA公钥内存结构:
https://img-blog.csdnimg.cn/img_convert/848928d39dd63a047827e3a24712cf51.png
https://img-blog.csdnimg.cn/img_convert/4461027c6c91680749d5b2348986369a.png
之后就是进行BERdecode的解析,实现函数是sub_CBB010函数,之后将解析完得到的RSA公钥的n和e给到刚才创建好的Public_Key上。
BER编码:
30819D300D06092A864886F70D010101050003818B0030818702818100B51B363D5379596F23A0B7CD45A37FF64CA0281FA540FD1C60A32585A37772295F297D0931AF4BFE35D3CC16B3D02AFF5468F09571484EA47DEA9E16B90C81FCD3ADB61CC41AE734E094B02EB15AEACF2A0F1D5BA672E237AD808ED323C8A022FD30740024FBD316CEFDF263293A60B5E718346E9663AC6498320418081C52F1020111 https://img-blog.csdnimg.cn/img_convert/6d26c6925fefd41eba2300ef3126f76d.png
Ber编码内容与sub_C19C30函数
5.因为整体的执行是调用了Crypto++库中的RSA函数执行的,具体实现都是库函数内的实现,所以这里就不再细致的去分析容器内的实现了,直接就说执行后的效果吧。
执行完毕后就可以得到解析后的RSA公钥了,其中N和E都能看到具体的内容:
https://img-blog.csdnimg.cn/img_convert/d7d1a885f8d6d72b1b2c3af9adcc0905.png
RSA公钥内容
N:
b51b363d5379596f23a0b7cd45a37ff64ca0281fa540fd1c60a32585a37772295f297d0931af4bfe35d3cc16b3d02aff5468f09571484ea47dea9e16b90c81fcd3adb61cc41ae734e094b02eb15aeacf2a0f1d5ba672e237ad808ed323c8a022fd30740024fbd316cefdf263293a60b5e718346e9663ac6498320418081c52f1 https://img-blog.csdnimg.cn/img_convert/1a017b713bf589483d5c9e45926150c6.png
E:
17 https://img-blog.csdnimg.cn/img_convert/4118be4baf8aa0fbd92559a42e6e6cbc.png
4.1.15 在桌面写入勒索信
简介
该函数会实现在体系桌面路径下写入勒索信
执行流程
1.在上述执行完毕对RSA公钥的解析后,继续说一下上面没有说的勒索信ID的天生部分
https://img-blog.csdnimg.cn/img_convert/65247a30e7e4c199629530a7918d9563.png
2.在进入到get_ID函数后能够看到是一个Sha256的盘算
https://img-blog.csdnimg.cn/img_convert/69467f0c73cff929475a352520c87502.png
其中盘算的内容即是上面写入加密密钥文件所天生的128字节巨细的随机数。
https://img-blog.csdnimg.cn/img_convert/0608a09ae71bbaabd9793c2cb64f1b6e.png
最后即可的到盘算出来的sha256:0C897AE780AA16748C8E4F4BC9B9652BA6394493889B9018E3DE350FE62FA176
3.得到了勒索信ID的前半部分后将进行勒索信的更换工作了,重要实现函数是sub_E82CBD函数
https://img-blog.csdnimg.cn/img_convert/20e1e349390790c603f98248f6e28fb4.png
4.进入到sub_E82CBD函数函数内部可以看到具体的更换过程,其中将上面得到的sha256编码成base64的形式更换勒索信模板的{{1}}的位置,将程序末尾自带的key更换到勒索信模板的{{2}}的位置即可完成。
https://img-blog.csdnimg.cn/img_convert/c5b2361e289e1b15e9aae9a1120c4c4f.png
5.最后就可以得到完备的勒索信的内容
https://img-blog.csdnimg.cn/img_convert/61c000769fc52de383fd2bc89636526e.png
6.最后将该内容,联合上面初始化事后的config_map里面保存着的勒索信的标题,将其写入到体系的桌面中。
https://img-blog.csdnimg.cn/img_convert/92c567d70418c6d88465b54ed46f88c7.png
4.1.16 目录遍历
简介
该函数重要实现了对前面存储路径的数据结构中的路径的过滤与启动多线程来实现对文件的加密与勒索信和KEY文件的释放。
执行流程
1.在执行完毕上面的创建完勒索信以后,将进入sub_C1604D函数执行一系列的获取路径,联合protobuf对象中的过滤内容来进行过滤等操作。
https://img-blog.csdnimg.cn/img_convert/83ded29fd0d1267ea6d6a907720f94b7.png
2.多线程的实现
https://img-blog.csdnimg.cn/img_convert/7974058d7e8b54b9e31a53506418261d.png
每个线程遍历一个路径:
https://img-blog.csdnimg.cn/img_convert/1700e13489f63bee34a646605b94212f.png
3.具体多线程的所触发的核心内容在sub_C5198C函数中能看到,该函数重要实现了对以上目录的遍历,外加__LOCK__文件和勒索信文件的写入,首先便是先向该遍历目录下写入勒索信!info.txt和___LOCK__文件,具体实现请看下面的写入!_INFO.txt勒索信和写入密钥文件__LOCK__。
https://img-blog.csdnimg.cn/img_convert/b22ea76831e779d8ad83c2ce199c23ca.png
4.之后遍历几个传入目录下的子目录,如果遍历到的是目录,那么就继续递归,并且向内写入勒索信和写__lock__文件。
如果是文件则会先判定是否是config_map中所存储的文件,如:!_INFO.txt、__LOCK__、b30b4aba8cb7ba54b4f96f5b186828590ed1087fb3dbf5518239e4e325968d82和当前可执行文件(halo.txt),如果不在其中的文件,则可以进入对文件内容进行加密的sub_A9BB67函数。
https://img-blog.csdnimg.cn/img_convert/31274ac145050a993b9c9b452f5d4ece.png
4.1.17 在遍历目录中写入勒索信
执行流程
1.继续上面的文件加密前半部的内容进行详细形貌,首先对于写入勒索和写入__LOCK__文件都是由sub_A9DBC6函数实现
https://img-blog.csdnimg.cn/img_convert/e4b34532ef085bb2f0401ca6ca71d9da.png
2.进入到sub_A9DBC6函数中,可以看到即将进入写入勒索和LOCK的重要实现函数
https://img-blog.csdnimg.cn/img_convert/2a3616bd28e66cb80476a77e884843f0.png
3.进入到重要实现函数中可以看到首先实现的就是写入LOCK文件,其次才是写入勒索信文件,这里就不再说勒索信的内容是如何天生的了,想了解的可以去看在桌面写入勒索信功能点的介绍部分吧。
https://img-blog.csdnimg.cn/img_convert/368f22e0f2958829e89b8f4b6dd363bd.png
4.1.18 在遍历目录中写入LOCK隐藏文件
执行流程
1.还是接着勒索信的写入部分继续说,可以看到写入LOCK函数是通过sub_AA327E函数实现的
https://img-blog.csdnimg.cn/img_convert/368f22e0f2958829e89b8f4b6dd363bd.png
2.进入到sub_AA327E函数可以看到,首先会先获取一下写入的Lock文件的路径,之后就是创建然后写入内容,写入的内容由当前运行的PID+random_128_bytes被base64编码后的值组成。
https://img-blog.csdnimg.cn/img_convert/5268eed41831d83419930c9b9b8d89ad.png
可以看到成功在当前遍历的目录下写入该文件
https://img-blog.csdnimg.cn/img_convert/b2eaf2920f5f5f2cd0c9b3008ce65b76.png
3.之后就会调用重要功能函数中的set_lock_file_hide函数来实现对lock文件设置成隐藏文件。
https://img-blog.csdnimg.cn/img_convert/1ee148ee43846b6f479328b616f7bc3b.png
https://img-blog.csdnimg.cn/img_convert/4360165c5c2f20f28fd76d16cd8fc441.png
4.1.19 文件内容加密
流程图
https://img-blog.csdnimg.cn/img_convert/c104f52db3f1462f77bd4620f97e915c.png
执行流程
1.首先文件加密前的预备工作,重要是由sub_A9BB67函数实现的。
https://img-blog.csdnimg.cn/img_convert/d858c87a984d5d4881fac3fb8d67b099.png
2.进入到sub_A9BB67函数中可以看到,该函数首先对文件的后缀进行了判定,判定是否是加密后缀,即防止二次加密的情况发生。
https://img-blog.csdnimg.cn/img_convert/588c7106e52f0d158b8caefb70425ca2.png
3.之后该函数调用了主体函数中的judge_file_is_exists函数来判定加密文件是否存在,又调用了主体函数的change_file_permissions函数给该文件一个可读可写可执行的777权限,最后对将文件的名称修改为了加密文件的名称。
https://img-blog.csdnimg.cn/img_convert/ff980ad86be21fe0a8a9f76349ac2620.png
4.做完以上的预备工作后,就要进入对文件的内容进行加密了,加密前的预备工作重要在sub_AAAEC7函数中可以看到。
https://img-blog.csdnimg.cn/img_convert/d4681dbb0ac513f7b4ea1ed06713247f.png
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进行加密利用
https://img-blog.csdnimg.cn/img_convert/52c7f5f4b5fd1dbaa505923da329be69.png
6.进入到sub_AB358F函数可以看到获取文件的巨细,并且进行判定,之后会根据文件的巨细是否小于0x200000字节,来选择是全加密,还是分段加密。
https://img-blog.csdnimg.cn/img_convert/b9ff80e77d4e098aed0cff7d2b7d79ac.png
7.这部分可以参考该流程图:
https://img-blog.csdnimg.cn/img_convert/41fed0a85999c0193aa55d8450a4fc3e.png
若是大于0x200000字节则会分两部分进行加密,先会加密开头和结尾的数据,而开头数据加密的巨细到底是多少,则是由随机数的值来决定的。
根据这个随机数来盘算可以得到一个head_block_size,盘算方法
head_block_size = (0x200000/随机数)*[(1-随机数)&0xffffffff]+0x200000&0xffffffff 之后除了头部以外的则都是采用了block_size,盘算方法:block_size = 0x200000/随机数+0x200000&0xffffffff(这里的0xffffffff实际上在程序中是没有的,因为如果用别的语言复现的时候会出现溢出,所以最好这里就上了这个值进行束缚一下)
https://img-blog.csdnimg.cn/img_convert/0bbfe70e22c6a3a878b213a5bdddb7d6.png
这种大文件的分段加密的结构是:开头加密数据+明文数据+加密数据+明文数据+末尾加密数据
https://img-blog.csdnimg.cn/img_convert/48175ed0ddc6e6a0a0434623236b9cce.png
8.在对一个文件的头部数据和尾部数据加密完毕后,将要执行对于中间部分即剩余巨细的数据进行加密,首先获取了一下剩余中间部分的字节巨细,又盘算了一下循环次数(循环次数=随机数-2),最后盘算了一下不进行加密的数据块巨细,盘算方式:不加密数据巨细=(剩余巨细-循环次数*block_size)/循环次数。
https://img-blog.csdnimg.cn/img_convert/d1ac2a61c278afc5578eb7ec0c1c2b4e.png
9.得到了循环次数和不加密的数据巨细后,就是开始对剩余巨细的内容开始循环加密了
https://img-blog.csdnimg.cn/img_convert/aa1df4064fe7ad35c6bc5990eff09399.png
10.加密采用的AES具体实现是sub_750840函数,可以比较清晰的看到数据对齐与加密等操作。
https://img-blog.csdnimg.cn/img_convert/c52c157fc5e602bfc894e24dfa6d636a.png
11.最后在文件内容加密完成后,将会在末尾将得到的数据(\x01+\x00+IV+KEY+random_128_sha256+随机字节)一共84字节的信息进行RSA加密,所用的加密公钥上面也介绍过了,最后会得到一个128字节的密文,将其写入到文件的末尾,最后将文件的属性改成只读,就完成了整套的文件的加密操作。
https://img-blog.csdnimg.cn/img_convert/c3cecf229f0967d3bf9765764d0083d1.png
12.最后文件加密完毕,将会调用主体函数change_permissions_only_read函数,实现对文件的权限修改为可读可执行。
https://img-blog.csdnimg.cn/img_convert/79b8a6695a0d2c26ec8dae4c1dfea089.png
4.1.20 删除写入的自启动注册表
执行流程
1.在执行完毕加密流程后,将执行主功能函数中的clear_register函数,来实现对写入自启动的注册表的删除
https://img-blog.csdnimg.cn/img_convert/8994e39e0f997a2d8e86a82cc5b1c309.png
2.其实现重要是依赖于sub_6D106A函数实现,跟写入开机自启动时所利用的差不多。
https://img-blog.csdnimg.cn/img_convert/ae365ed1773712c7578fdfd8934de10e.png
4.1.21 删除自身
执行流程
1.在执行完删除注册表后,将执行删除自身的功能,重要调用的也是主功能函数中的del_self函数来实现的。
https://img-blog.csdnimg.cn/img_convert/e66d091755bb94891d40aeeebf1b7be5.png
2.进入该函数的内部实现,可以看到重要是调用CMD进行命令执行,实现了删除自身,执行命令是:
cmd.exe /C ping 1.1.1.1 -n 10 -w 3000 > Nul & Del /f /q "filename" https://img-blog.csdnimg.cn/img_convert/efa5b98219f03070d548814b39f968b1.png
5.病毒分析总结
该勒索病毒首先通过分析TLS回调函数,实现了程序的随机数天生和池初始化机制。接下来,通过手工重修了程序的虚表结构,从而解析了重要功能函数,这些函数包括文件操作和注册表操作等一系列重要函数,恢复结构之后病毒先读取了自身配置文件,获取了背面功能所需的信息,紧跟着实现了隐藏CMD窗口,制止被用户发现,具体是通过调用GetConsoleWindow和ShowWindow函数来实现的,完成了窗口隐藏后,程序会将自身配置写入到开启启动项的注册表中,在当前桌面和体系比较重要的体系路径中写入勒索信与密钥文件,接着就是完成最重要的目录遍历加密,遍历的同时写入LOCK隐藏文件和勒索信文件,文件加密运用了AES-CFB算法,加密完成后将KEY等信息运用RSA加密算法将其写入到文件末尾,最后对文件的权限设置成了只读,完成了以上全部的功能后,该病毒会执行删除自身,并且将写入到开启启动项中的注册表内容清晰,其中一个重要部分是恢复protobuf对象及其数据流,提供了protobuf对象的定义及恢复方法,这对于理解程序的数据传输和处理机制至关重要。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]