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

勒索软件行为

  • 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次计算以及字节异或。

掩码和密钥生成


  1. *(int*)mask_in = offset
  2.  
  3.  for (int i = 0; i < 0x800; ++i) { 
  4.  
  5.   
  6.  
  7.      SHA1(mask_in, 0x84, mask_out); 
  8.  
  9.      *(int*)mask_in = i + 1 + offset; 
  10.  
  11.      *(mask_in + 3 + (i & 0x7F) + 1) ^= mask_out[0]; 
  12.  
  13.      mask[i] = mask_out[1]; 
  14.  
  15.  } 
  16.  
  17.  offset += 0x800; 
  18.  
  19.  aes_key = generate_key(mask, mzrkey_private.c_str(), 0x800, mzrkey_private.size()); 
  20.  
  21.   
  22.  
  23.  for (int i = 0; i < 0x200; ++i) { 
  24.  
  25.   
  26.  
  27.  SHA1(mask_in, 0x84, mask_out); 
  28.  
  29.      *(int*)mask_in = i + 1 + offset; 
  30.  
  31.      *(mask_in + 3 + (i & 0x7F) + 1) ^= mask_out[0]; 
  32.  
  33.      mask[i] = mask_out[1]; 
  34.  
  35.  } 
  36.  
  37.  offset += 0x200; 
  38.  
  39.  twofish_key = generate_key(mask, mzrkey_public.c_str(), 0x200, mzrkey_public.size()); 
  40.  
  41. generate_key: 
  42.  
  43.  int mzrkey_size_bswap = _byteswap_ulong(mzrkey_len); 
  44.  
  45.  int mask_size_bswap = _byteswap_ulong(mask_len); 
  46.  
  47.  for (int i = 0; i < key_SIZE; ++i) { 
  48.  
  49.    ((int*)in)[0] = _byteswap_ulong(i); 
  50.  
  51.    for (int j = 0; j < i; ++j) 
  52.  
  53.       in[j + 4] = key[j]; 
  54.  
  55.    *((int*)(in + 4 + i)) = _byteswap_ulong(1); 
  56.  
  57.    *((int*)(in + 8 + i)) = mask_size_bswap; 
  58.  
  59.    memcpy(in + 3 * sizeof(int) + i, mask, mask_len); 
  60.  
  61.    memcpy(in + 3 * sizeof(int) + mask_len + i, &mzrkey_size_bswap, 4); 
  62.  
  63.    memcpy(in + 3 * sizeof(int) + mask_len + 4 + i, mzrkey, mzrkey_len); 
  64.  
  65.    SHA512(in, mask_len + mzrkey_len + 4 * sizeof(int) + i, out); 
  66.  
  67.    for (int j = 0; j < SHA512_DIGEST_LENGTH; ++j) 
  68.  
  69.        key[i] ^= out[j]; 
  70.  
  71.  } 

AES CBC的IV将使用AES 128 ECB生成,位置在一个16字节缓冲区内。类似的,Twofish NOFB的IV将使用Twofish 128 ECB生成,位置同样在一个16字节缓冲区内。掩码的初始内容生成如下:


  1. memset(mask_in, MASK_IN_SZ, 0); 
  2.  
  3.  memset(mask_out, MASK_OUT_SZ, 0); 
  4.  
  5.   
  6.  
  7.  for (int i = 0; i < 0x80; ++i) { 
  8.  
  9.    SHA1(mask_in, 0x84, mask_out); 
  10.  
  11.    *(int*)mask_in = i + 1; 
  12.  
  13.    *(mask_in + 3 + i + 1) = mask_out[0]; 
  14.  
  15.  } 

实际上,这种加密机制我们此前从未在其他勒索软件中见到过,而且恶意代码还会对整个文件系统进行加密,该勒索软件的硬编码文件和驱动器列表如下:

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章