raw_struct - 用Rust宏定义C结构体

raw_struct 是一个可以帮助你使用Rust宏快捷定义C结构体的crate,支持显式声明字段偏移等等,非常适合在逆向环境下使用。

原仓库链接:WolverinDEV/raw-struct

示例代码:

#[raw_struct(size = 0x10)]
struct MyStruct {
    #[field(offset = 0x00)]
    pub field_a: u32,

    #[field(offset = 0x04)]
    pub field_b: u32,

    #[field(offset = 0x08)]
    pub field_c: [u8; 0x8],
}

可以看到这段代码可以轻松的显式定义一个结构体的大小和每个字段的偏移,省去写padding和手动计算padding大小的烦恼。

引用或者拷贝的示例代码:

let memory = [0u8; 0x10];
{
    let object = Reference::<MyStruct>::new(0x00, Arc::new(memory.clone()));
    println!("field_a = {:X}", object.read_field(MyStruct::field_a)?);
    println!("field_b = {:X}", object.read_field(MyStruct::field_b)?);
}

{
    let object = Copy::<MyStruct>::new(memory);
    println!("field_a = {:X}", object.read_field(MyStruct::field_a)?);
    println!("field_b = {:X}", object.read_field(MyStruct::field_b)?);
}

他的宏还支持表达式求值:

#[raw_struct(memory = "([u8; 0x10], T)")]
struct Container<T: CopyConstructable + 'static> {
    #[field(offset = 0x00)]
    pub var_a: u64,

    #[field(offset = 0x08)]
    pub inner: T,

    #[field(offset = "0x08 + core::mem::size_of::<T>()")]
    pub var_b: u64,
}

这个结构体的大小就等于 ([u8; 0x10], T) 的大小,var_b的偏移就等于 0x08 + core::mem::size_of::<T>()

Comments