1个不稳定版本
0.1.0 | 2022年4月15日 |
---|
#32 in #obfuscation
928 每月下载量
用于 5 个crate(3个直接使用)
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