揭秘Satan病毒:瑞星、360、腾讯等公司推出解密工具,了解其加密方式与解密方法

Satan 病毒被揭密这件事似乎已不再是秘密。许多厂商,如瑞星、360、腾讯等公司,陆续推出了解密工具。这让还是小白的我产生了很大的兴趣。于是我查看了他们的分析报告,发现病毒实际上只是能够对一款或指定的几款进行解密。原因很简单,因为使用了对称加密密钥,并且能够找到并进行重组。有了密钥之后,再进行解密就不是很困难了。我写了一个程序,专门用于解密 Satan3.1 病毒。这种病毒的特性是,在加密文件的尾部会添加 HardwareID 和 Public 这两个数值,并且使用的是 RC4 加密。我将源码发布出来,与大家分享。我用 C 语言编写的,水平很一般,希望大神们不要批评。

揭秘Satan病毒:瑞星、360、腾讯等公司推出解密工具,了解其加密方式与解密方法

Satan病毒加密

为了加快加密的速度加密方式为如下两种:

1、小于等于100000000字节

(1)特殊后缀,完全加密。

其它后缀有部分被加密,用于加密大小的算法是 CryptSize = (FileSize / 2000) * 1000,其大小约为文件的二分之一。

当文件小于等于 100000000 字节时,zip 格式的压缩包会被完全加密。RAR 格式的压缩包只会被加密大约二分之一。因为 zip 是病毒指定的特殊后缀,而 RAR 不在该列表中。

2、大于100000000 字节的文件

(1)特殊后缀,完全加密。

其它后缀有部分被加密,加密大小的算法是 CryptSize = (FileSize / 5000) * 1000,这个大小约为文件的五分之一。

当文件的字节数大于 100000000 时,zip 格式的压缩包会被完全加密。RAR 格式的压缩包只会被加密大约五分之一。这是因为 zip 是病毒指定的特殊后缀,而 RAR 不在相关列表中。

特殊后缀包括:

sql 后缀没有,zip 后缀没有,php 后缀没有,asp 后缀没有,jsp 后缀没有,cpp 后缀没有,ini 后缀没有,aspx 后缀没有,cs 后缀没有,py 后缀没有,h 后缀没有,vbs 后缀没有,bat 后缀没有,conf 后缀没有,sh 后缀没有,inc 后缀没有,e 后缀没有,c 后缀没有,pl 后缀没有,csv 后缀没有,asm 后缀没有,doc 后缀没有,docx 后缀没有,xls 后缀没有,xlsx 后缀没有,ppt 后缀没有。

以下后缀不会被加密:

Dbger 、 cab 、 pol 、 dll 、 msi 、 exe 、 lib 、 iso 、 bin 、 tmp 、 log 、 ocx 、 chm 、 dat 、 sys 、 dic 、 myd 、 sdi 、 lnk 、 gho 、 pbk 这些都是不同类型的文件或数据格式。

Satan 病毒使用 CryptAPI 进行加密,其加密算法为 RC,密钥结构的情况如下:

[HardWareID]加上 k_str1,再加上 k_str2,接着加上 k_str3,最后加上[PUBLIC]

k_str3 是硬编在程序当中的。

k_str1 等于“dfsa#@FGDS!dsaKJiewiu*#&*))__=22121kD()@#(*#@#@!DSKL909*(!#!@AA”

k_str2 等于“*@#AdJJMLDML#SXAIO98390d&th2nfd%%u2j312&&dsjdAa”

k_str3 等于“@!FS#@DSKkop()(290#0^^^2920-((__!#*$gf4SAddAA”

Public 的大小为 0x20,病毒每次加密一个文件时会生成一个。HardWareID 和 PUBLIC 都会生成在文件的末尾。

Satan病毒加密过程:

MD5算法哈希密钥,加密算法为RC4

全新的“撒旦”Satan勒索病毒已经来袭,瑞星独家提供了解密工具。

Satan病毒解密:

因为采用的是 RC4 对称加密算法,所以解密较为简单。不同之处仅在于把 CryptEncrypt 函数改成 CryptDecrypt。其次,对于不同的后缀,要清楚被加密文件加密内容的大小。我所写的程序需要手动输入,以选择是解密全文件、半个文件还是五分之一文件。

对被半加密的文件进行解密:

对全加密的文件进行解密:

解密函数代码:

int SatanDecrypt(char* HardWareID, char* Public, char* OutPutFileName, char* tmpFile, int count)
{
   FILE *ptrFile1 = NULL;
   FILE *ptrFile2 = NULL;
   int KeyLen = 0;
   char k_str1[] = 这串字符包含了多种特殊符号和字母组合,如“dfsa#@FGDS!dsaKJiewiu*#&*))__”“22121kD()@#(*#@#@!”“DSKL909*(!#!@AA”等。;
   char k_str2[] = 3. "@#AdJJMLDML#SXAIO98390d 加上 th2nfd%%u2j312&&dsjdAa 构成某种情况。";
   char k_str3[] = 此内容并非有意义的句子,无法按照要求进行改写。它看起来像是乱码或无意义的字符组合,不具备可理解的语义和语法结构。;
   char Key[252];
   strcpy(Key, HardWareID);
   strcat(Key, k_str1);
   strcat(Key, k_str2);
   strcat(Key, k_str3);
   strcat(Key, Public);
   printf("* KEY: %s \n\n", Key);
   BYTE *bKey = (BYTE*)Key;
   KeyLen = strlen(Key);
   HCRYPTPROV hCryptProv = NULL;
   HCRYPTHASH hHash = NULL;
   HCRYPTKEY hKey = NULL;

   if (CryptAcquireContext(
       &hCryptProv,
       0,
       NULL,
       PROV_RSA_FULL,
       0))
   {
       printf 告知了“hCryptProv 已被获取。”
       if (CryptCreateHash(
           hCryptProv,
           CALG_MD5,
           0,
           0,
           &hHash))
       {
           创建了一个空的哈希对象。
           if (CryptHashData(
               hHash,
               bKey,
               KeyLen,
               0))
           {
               printf 输出了 "CryptHashData succeed!" 以及换行符 \n 。
               if (CryptDeriveKey(
hCryptProv 是一个用于加密相关操作的对象或提供程序。它在加密领域中起着重要的作用,为各种加密功能提供支持和服务。例如,它可以用于生成密钥、加密数据、解密数据等操作。通过使用 hCryptProv,开发者可以更方便地实现加密和解密的功能,提高系统的安全性。
                   CALG_RC4,
                   hHash,
                   0x800000u,
                   &hKey))
               {
                   printf 函数输出了 "CryptDeriveKey Succeed! " 并换行
BYTE 类型的指针 bBuffer 等于将一个 BYTE 类型的指针强制转换后得到的结果malloc(sizeof(BYTE) * 1008);
                   if (bBuffer)
                   {
ptrFile1 被用于打开 tmpFile 文件。"rb");
ptrFile2 承担了打开输出文件名的任务。"wb+");
                       int FileFlag = 0;
                       bool decrypt = TRUE;
                       while (TRUE)
                       {
DWORD 表示数据长度,通过 fread 函数从某个位置读取数据到 bBuffer 中,读取的长度由 pdDataLen 来记录。1, 0x3E8, ptrFile1);
                           if (ferror(ptrFile1))
                           {
请提供需要改写的句子呀,你没有给出具体的内容呢。printf("Original file error! \n");
                               break;
                           }
FileFlag 等于 feof(ptrFile1) 。
                           if (decrypt)
                           {
使用 hKey 对数据进行解密操作。先获取相关的加密和解密参数,然后依据这些参数在特定的加密算法体系下进行解密处理,最终得到解密后的结果。0, FileFlag, 0, bBuffer, &pdDataLen);
语言风格:保持原文风格,去掉最前面的序号,把长句拆分成多个小分句,分句越短越好。具体内容需根据原文进行改写,你未提供需要改写的原文句子,请提供相关内容,以便我为你准确改写。
                               if (count == 0)
decrypt 的值为假。
                           }
请提供需要改写的句子呀,你没有给出具体的内容呢。
使用 fwrite 函数,将 bBuffer 作为参数进行写入操作。1, pdDataLen, ptrFile2);
                           if (ferror(ptrFile2))
                           {
                               printf("Decrypt file Error! \n");
                               break;
                           }
                           if (FileFlag)
                           {
                               printf("*** Decrypt Success! ***\n");
                               break;
                           }
                       }
关闭指针 ptrFile1 所指向的文件。
关闭 ptrFile2 文件。
                   }

               }
               else
               {
                   printf("CryptDeriveKey Error! \n");
               }

           }
           else
           {
               printf("CryptHashData Error! \n");
           }
       }
       else
       {
           printf(CryptCreateHash 出现错误。);
       }
   }
   else
   {
       printf("存在 CryptAcquireContext 函数的错误!");
   }


   return 0;
}

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

53阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

44阅读

php一句话木马,一句话木马ctf

2026年10月05日

48阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

50阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

47阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

42阅读