#string #obfuscation #obfuscate #hide #proc-macro

muddy_macros

用于字符串混淆的进程宏。应仅作为 'muddy'crate 的一部分使用。

3个版本

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

#7 in #obfuscate

Download history 1/week @ 2024-04-14 28/week @ 2024-05-12 21/week @ 2024-05-19 46/week @ 2024-06-02 31/week @ 2024-06-09 47/week @ 2024-06-16 50/week @ 2024-06-23 66/week @ 2024-06-30 59/week @ 2024-07-07 17/week @ 2024-07-14 2/week @ 2024-07-21 18/week @ 2024-07-28

每月 98 次下载
muddy 中使用

MIT/Apache

22KB
333

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")

关于混淆和加密的说明

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

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

# 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.4–2MB
~41K SLoC