加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 服务器 > 安全 > 正文

看我怎样恢复被MaMoCrypt勒索软件加密的数据

发布时间:2021-06-12 06:27:42 所属栏目:安全 来源:互联网
导读:勒索软件行为 MaMoCrypt能够删除Windows卷影(ShadowVolume),并禁用防火墙以及UAC服务。这些功能在恶意软件领域中其实并不罕见,因此我们在此对其不做更深入的讨
副标题[/!--empirenews.page--]

MaMoCrypt能够删除Windows卷影(ShadowVolume),并禁用防火墙以及UAC服务。这些功能在恶意软件领域中其实并不罕见,因此我们在此对其不做更深入的讨论。

它使用了Delphi的随机生成器(基于线性同余生成器)以及基于时间的DWORD种子(使用QueryPerformanceCounter或GetTickCount),此时将会生成两个缓冲区,其中的数据会使用Base64进行编码,并添加MZRKEYPUBLIC / MZRKEYPRIVATE字符串。

根据上述的两个密钥以及一个掩码,该勒索软件将会针对每个文件生成两个加密密钥,随后将会使用它们来进行文件加密。它首先会使用AES 128 CBC来进行文件内容加密,然后再使用Twofish 128 NOFB来对其进行二次加密。AES加密过程中剩余的16%内容将使用AES 128 CFB进行加密,所有加密文件的后缀名都会添加一个“.MZ173801”。

加密完成之后,恶意软件会再次枚举所有加密目录,并分别存放勒索信息,而勒索信息中也会包含对应的那两个MZR密钥。

虽然MZR密钥在密钥生成或加密的过程中不会发生变化,但掩码会持续更新。它们的生成基于的是SHA1、SHA512和某些自定义算法的混合计算结果。每一个AES和Twofish密钥还会使用SHA512进行16次计算以及字节异或。

掩码和密钥生成

*(int*)mask_in = offset; 

 

 for (int i = 0; i < 0x800; ++i) { 

 

  

 

     SHA1(mask_in, 0x84, mask_out); 

 

     *(int*)mask_in = i + 1 + offset; 

 

     *(mask_in + 3 + (i & 0x7F) + 1) ^= mask_out[0]; 

 

     mask[i] = mask_out[1]; 

 

 } 

 

 offset += 0x800; 

 

 aes_key = generate_key(mask, mzrkey_private.c_str(), 0x800, mzrkey_private.size()); 

 

  

 

 for (int i = 0; i < 0x200; ++i) { 

 

  

 

 SHA1(mask_in, 0x84, mask_out); 

 

     *(int*)mask_in = i + 1 + offset; 

 

     *(mask_in + 3 + (i & 0x7F) + 1) ^= mask_out[0]; 

 

     mask[i] = mask_out[1]; 

 

 } 

 

 offset += 0x200; 

 

 twofish_key = generate_key(mask, mzrkey_public.c_str(), 0x200, mzrkey_public.size()); 

 

generate_key: 

 

 int mzrkey_size_bswap = _byteswap_ulong(mzrkey_len); 

 

 int mask_size_bswap = _byteswap_ulong(mask_len); 

 

 for (int i = 0; i < key_SIZE; ++i) { 

 

   ((int*)in)[0] = _byteswap_ulong(i); 

 

   for (int j = 0; j < i; ++j) 

 

      in[j + 4] = key[j]; 

 

   *((int*)(in + 4 + i)) = _byteswap_ulong(1); 

 

   *((int*)(in + 8 + i)) = mask_size_bswap; 

 

   memcpy(in + 3 * sizeof(int) + i, mask, mask_len); 

 

   memcpy(in + 3 * sizeof(int) + mask_len + i, &mzrkey_size_bswap, 4); 

 

   memcpy(in + 3 * sizeof(int) + mask_len + 4 + i, mzrkey, mzrkey_len); 

 

   SHA512(in, mask_len + mzrkey_len + 4 * sizeof(int) + i, out); 

 

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读