3个版本

0.2.2 2024年8月7日
0.2.1 2024年4月3日
0.2.0 2024年2月22日

#704编码

Download history 27/week @ 2024-05-11 20/week @ 2024-05-18 1/week @ 2024-05-25 42/week @ 2024-06-01 35/week @ 2024-06-08 40/week @ 2024-06-15 62/week @ 2024-06-22 61/week @ 2024-06-29 61/week @ 2024-07-06 12/week @ 2024-07-13 5/week @ 2024-07-20 17/week @ 2024-07-27 124/week @ 2024-08-03 27/week @ 2024-08-10

每月 173 次下载

MIT/Apache

16KB
77

muddy

muddy 是一个静态字符串混淆库,旨在提供一个简单的方式来避免简单的静态二进制分析工具,如 strings 或 YARA规则。它通过在构建时加密文本,并在运行时懒加载地解密它们来实现。

用法与示例

use muddy::{m, muddy_init};

muddy_init!();

println!("{}", m!("My highly obfuscated text"));
println!("{}", "My non obfuscated static str - ripgrep me");

编译此示例并使用grep在二进制文件中查找 obfuscated

cargob --examplesimple

strings./target/debug/examples/simple|grep obfuscated
只有第二行非混淆行应该出现。

muddy 主要提供导出的宏 m!()#[muddy]muddy_all! { },所有这些宏都接受文本作为输入并对其进行加密。宏 muddy_init!() 为在运行时解密字符串提供框架,并应放在用户crate的 root

这些宏可以作为内联文本替换与 m!("my text") 使用

use muddy::{muddy_init, m};

muddy_init!();

println!("{}", m!("my plaintext"));

作为一个带有 muddy 属性的注解 &'static str

use muddy::{muddy, muddy_init};

muddy_init!();

#[muddy]
static MY_STR: &str = "my plaintext";

或者作为一个带有 muddy_all 的多个注解 &'static str 的调用

use muddy::{muddy_all, muddy_init};

muddy_init!();

muddy_all! {
   pub static MY_STR: &str = "my plaintext";
   pub static MY_SECOND_STR: &str = "my second plaintext";
   static MY_THIRD_STR: &str = "my module-specific third plaintext";
}

默认情况下,muddy 将使用 chacha20poly1305 实现加密静态字符串,并将密钥嵌入到二进制文件中。

为了避免将去混淆密钥硬编码到您的二进制文件中,您可以使用


use muddy::{m, muddy_init};

muddy_init!("env");

// If you build your program with `muddy_init!("env")`,
// the deobfuscation key env variable and deobfuscation key
// will be printed out to stderr:  
// `MUDDY='D47A372C13DEFED74FD3B9B4C741C355F9CB2C23C43F98ADE2C02FD50CA55C3D'`

// This key needs to be provided at runtime else the program will panic.  
// `MUDDY='D47A372C13DEFED74FD3B9B4C741C355F9CB2C23C43F98ADE2C02FD50CA55C3D' ./target/debug/examples/env`
    println!("{}", m!("My highly obfuscated text"));
    println!("{}", "My non obfuscated static str - ripgrep me");

如果设置了 muddy_init!("env"),则在运行时会检查 MUDDY(默认)环境变量以获取密钥。如果未找到,程序将崩溃。

您也可以在构建时通过 MUDDY 设置自己的环境密钥标识符
例如: MUDDY='MY_KEY_NAME_2' cargo b --example env
将输出: MY_KEY_NAME_2='FD5B85045B5278F5EDA567AD7C58EB56934BD8D7432C878B1AB6090052A64080'

muddy_init!

muddy_init!() 可以取两个值之一

  • muddy_init!("embed")
  • muddy_init!("env")

如果没有提供值,该宏默认为 "embed" 配置。
如果提供了 "env",您还可以将环境密钥标识符设置为第二个字段: muddy_init!("env", "MY_KEY")

关于混淆和加密的说明

此 crate 不提供任何形式的实际加密。它只是使理解您二进制文件中的字符串更困难。 混淆不是安全

此 crate 也不混淆您可能有的任何调试符号。配置文件设置,如

# inside Cargo.toml

[profile]
strip = true
panic = "abort"
# ...

等等,可以在 cargo参考 中找到。

宏展开

要检查此宏展开的内容

  • 安装 cargo expand
  • 运行: cargo expand -p muddy --example env

下一步

  • 处理 #![no_std] 环境
  • 通过泄漏 mut 静态检查安全性
  • 检查过程宏测试套件

免责声明

此库的开发目的是提供一种工具,以挑战和教育网络安全专业人员。它不适用于任何恶意或非法活动。此库的创建者和贡献者不支持或鼓励使用此工具进行任何非法目的。

类似/相关项目

许可证

根据 Apache 2.0 和 MIT 条款双许可。

依赖关系

~1.5–2.1MB
~43K SLoC