#attributes #obfuscation #security #macro #debugging

macro no-std random_struct_layout

用于随机化结构体成员布局的自定义属性

5个不稳定版本

0.3.2 2023年5月11日
0.3.1 2023年5月11日
0.2.1 2023年5月11日
0.1.1 2022年8月13日
0.1.0 2022年8月13日

#925 in 过程宏

49次每月下载

MIT 许可证

7KB
87 代码行

random_struct_layout

此crate提供自定义属性以随机化结构体布局,类似于gcc的随机化结构体布局(https://lwn.net/Articles/722293/)。

示例

use offset;
use random_struct_layout::layout_randomize;

#[macro_use]
extern crate random_struct_layout;

#[layout_randomize(Debug)]
struct Data {
    a: i32,
    b: i32,
    c: i32,
    d: i64,
    e: i64,
}

fn main() {
    let data = Data {
        a: 0x10,
        b: 0x20,
        c: 0x30,
        d: 0x30,
        e: 0x40,
    };

    println!("{}", offset::offset_of!(Data::a));
    println!("{}", offset::offset_of!(Data::b));
    println!("{}", offset::offset_of!(Data::c));
    println!("{}", offset::offset_of!(Data::d));
    println!("{}", offset::offset_of!(Data::e));

    /* example output
    20
    16
    0
    8
    24
    */

    println!("{:x?}", data); // Debug print order is same as normal one.
                             // Data { a: 10, b: 20, c: 30, d: 30, e: 40 }
}

#[layout_randomize]
struct HasDst {
    value1: i32,
    value2: i32,

    #[dst]
    value3: [u8], // support dst type.
}

依赖项

~1.5MB
~40K SLoC