6个版本 (3个重大更新)
0.4.2 | 2023年1月6日 |
---|---|
0.4.1 | 2022年4月23日 |
0.4.0 | 2022年3月29日 |
0.3.0 | 2022年3月26日 |
0.1.0 | 2022年2月18日 |
#2000 in 算法
每月731次下载
用于 7 个crate(直接使用2个)
79KB
1K SLoC
PKBuffer
PKBuffer
是一个简单但灵活的缓冲区库,允许您将Rust对象转换为字节缓冲区。它源于多种内存解析场景,如可执行文件头解析和游戏ROM内存映射。其名称来源于在字节缓冲区上进行任意结构定义转换的魔法,以及我在当时逆向工程游戏 EarthBound 的实际情况。
lib.rs
:
PKBuffer 是一个用于将数据结构任意转换为内存段段的库!这包括非所有者内存的部分,例如检查当前正在运行的可执行文件的头部。它为读取和写入数据结构到任意字节缓冲区创建了一个接口。
例如
use pkbuffer::{Buffer, VecBuffer, Castable};
#[repr(packed)]
#[derive(Copy, Clone, Castable)]
struct Object {
byte: u8,
word: u16,
dword: u32,
}
let mut buffer = VecBuffer::with_initial_size(std::mem::size_of::<Object>());
let object = buffer.get_mut_ref::<Object>(0).unwrap();
object.byte = 0x01;
object.word = 0x0302;
object.dword = 0x07060504;
assert_eq!(buffer, [1,2,3,4,5,6,7]);
从 Buffer
对象检索的任何对象都必须实现 Castable
特性。此特性确保对对象应用一系列属性。为了方便,提供了一个 派生宏。
缓冲区对象是从 Buffer
特性派生出来的。此特性实现了切片对象的大部分功能以及派生缓冲区对象的派生数据转换能力。
缓冲区对象有两种形式:指针形式 (PtrBuffer
) 和 分配形式 (VecBuffer
)。每种结构都有其特定的用途。 PtrBuffer
用于非所有者数据,如内存中的任意位置,而 VecBuffer
的用途在于能够操作底层所有者数据。
VecBuffer
非常有用,可以创建一个新的对象缓冲区。
use pkbuffer::{Buffer, VecBuffer};
let mut buffer = VecBuffer::new();
buffer.append_ref::<u8>(&0x1);
buffer.append_ref::<u16>(&0x0302);
buffer.append_ref::<u32>(&0x07060504);
assert_eq!(buffer, [1,2,3,4,5,6,7]);
依赖项
~2MB
~41K SLoC