1个不稳定版本

0.1.0 2022年4月15日

#32 in #obfuscation

Download history 231/week @ 2024-03-13 318/week @ 2024-03-20 286/week @ 2024-03-27 388/week @ 2024-04-03 461/week @ 2024-04-10 344/week @ 2024-04-17 365/week @ 2024-04-24 348/week @ 2024-05-01 339/week @ 2024-05-08 247/week @ 2024-05-15 898/week @ 2024-05-22 692/week @ 2024-05-29 290/week @ 2024-06-05 145/week @ 2024-06-12 126/week @ 2024-06-19 344/week @ 2024-06-26

928 每月下载量
用于 5 个crate(3个直接使用)

GPL-3.0 许可证

41KB
775

Goldberg

Goldberg 是一个用于混淆Rust代码的Rust进程宏库。其混淆技术旨在在编译和优化过程中都能存活。虽然不是专门用作源代码混淆器,但它 可以 被如此使用。它以Rube Goldberg机器命名。

目前支持以下类型的混淆:

  • 代码流程混淆
  • 字符串字面量加密
  • 整数字面量混淆

文档可在此处找到这里。使用示例请参阅测试文件。变更日志历史记录可在此处找到这里


lib.rs:

Goldberg 是一个Rust混淆宏库。

目前,Goldberg能够实现以下类型的混淆:

  • 代码流程混淆
  • 字符串字面量加密
  • 整数字面量混淆

当然,还有一些注意事项

  • 代码流程混淆仅适用于具有移动性的语句(见goldberg_stmts)。
  • 字符串字面量加密会产生临时对象(见goldberg_string)。
  • 整数字面量必须是类型化的(见goldberg_int)。

尽管有这些注意事项,这些简单的技术仍然可以产生强大的、在代码优化过程中仍然存在的混淆。

use goldberg::goldberg_stmts;

let result = goldberg_stmts! {
   {
      fn print(value: u32) {
         let msg = String::from("value:");
         println!("{} {}", msg, value);
      }

      let mut x: u32 = 0xDEADBEEFu32;
      print(x);
      x ^= 0xFACEBABEu32;
      print(x);
      x ^= 0xDEFACED1u32;
      print(x);
      x ^= 0xABAD1DEAu32;
      print(x);
      x
   }
};

assert_eq!(result, 0x5134d76a);

此示例展开为类似以下代码

fn print(value: u32) {
    let msg = String::from(
        {
            let key_fgnliibu: Vec<u8> = vec![75u8, 87u8, 169u8, 234u8, 230u8, 38u8];
            let mut string_hkzmkgaw: Vec<u8> = vec![61u8, 54u8, 197u8, 159u8, 131u8, 28u8];
            for pulhfjddcbiztuxz in 0..string_hkzmkgaw.len() {
                string_hkzmkgaw[pulhfjddcbiztuxz] ^= key_fgnliibu[pulhfjddcbiztuxz];
            }
            String::from_utf8(string_hkzmkgaw).unwrap()
        }
        .as_str(),
    );
    println!("{} {}", msg, value);
}
struct _AssertDefault_cfygodkf
where
    u32: Default;
let mut x: u32 = u32::default();
let mut ident_gqtkhobp = 1113386507u32;
let mut key_ftudpieg = 0u32;
'loop_obfu_jmcfjvhq: loop {
    match ident_gqtkhobp {
        2158235392u32 => {
            print(x);
            key_ftudpieg = 3044081204u32;
        }
        2506875858u32 => {
            x ^= {
                struct _AssertDefault_vedfwrhy
                where
                    u32: Default;
                let mut calc_whsuusro: u32 = u32::default();
                let mut ident_tmheadmi = 1821101871u32;
                let mut key_pzediytf = 0u32;
                'loop_obfu_msqcffqh: loop {
                    match ident_tmheadmi {
                        1103538895u32 => {
                            calc_whsuusro ^= 2534362044u32;
                            key_pzediytf = 2755681459u32;
                        }
                        3757011920u32 => {
                            calc_whsuusro = calc_whsuusro.swap_bytes();
                            key_pzediytf = 849856391u32;
                        }
                        1071321848u32 => {
                            calc_whsuusro = calc_whsuusro.rotate_left(1692640787u32);
                            key_pzediytf = 1375898541u32;
                        }
                        ...

为了混淆语句,请使用 goldberg_stmts。为了加密字符串,请使用 goldberg_string。对于整数,请使用 goldberg_int。要将混淆语句转换为字符串进行外部处理,请使用 goldberg_stringify。有关功能示例,请阅读 测试文件

依赖项

~2MB
~42K SLoC