#linker #binary #elf #pe #format

linkstore

使用链接器段嵌入、操作和检索二进制中嵌入数据的库

3个版本 (稳定版)

1.0.2 2022年11月17日
1.0.1 2022年11月16日
0.1.0 2022年1月24日

FFI中排名330

MIT许可证

45KB
1K SLoC

linkstore

linkstore是一个库,允许您在最终编译的二进制文件中定义全局变量,这些变量可以在编译后进行修改。

linkstore目前支持ELF和PE可执行格式,可以与静态和动态链接库一起使用。

支持类型

目前,linkstore可以开箱即用地序列化和反序列化数字(不包括usizeisize)、bool和固定长度的数组。

对于其他任何内容,您需要实现从固定长度字节数组进行自己的反序列化。

用法

定义和使用linkstore全局变量

#[macro_use] extern crate linkstore;

linkstore! {
    pub static LINKSTORE_TEST: u64 = 0xDEADBEEF;
    pub static LINKSTORE_YEAH: u32 = 0xDEADBEEF;
    pub static LINKSTORE_BYTES: [u8; 4] = [0xDE, 0xAD, 0xBE, 0xEF];
    pub static LINKSTORE_SHORTS: [u16; 4] = [0xDE, 0xAD, 0xBE, 0xEF];
    pub static LINKSTORE_BIG: u128 = 0xDEADBEEF;
}

fn main() {
    unsafe {
        println!("LINKSTORE_TEST = {:x}", LINKSTORE_TEST::get());
        println!("LINKSTORE_YEAH = {:x}", LINKSTORE_YEAH::get());
        println!("LINKSTORE_BYTES = {:?}", LINKSTORE_BYTES::get());
        println!("LINKSTORE_SHORTS = {:?}", LINKSTORE_SHORTS::get());
        println!("LINKSTORE_BIG = {:b}", LINKSTORE_BIG::get());
    }
}

编译后操作linkstore全局变量

一旦您的二进制文件构建完成,您就可以使用linkstore来修改值。

// You can use `linkstore::open_binary` to open a binary file from the filesystem.
let mut binary: std::fs::File = linkstore::open_binary("C:\\Windows\\system32\\kernel32.dll").unwrap();

// Alternatively, you can work directly on a memory buffer or memory-mapped file using a `std::io::Cursor`
let mut binary: Vec<u8> = std::fs::read("C:\\Windows\\system32\\kernel32.dll").unwrap();
let mut binary: std::io::Cursor<&mut [u8]> = std::io::Cursor::new(&mut binary);

let mut embedder = linkstore::Embedder::new(&mut binary).unwrap();

embedder.embed("LINKSTORE_TEST", &69_u64).unwrap();
embedder.embed("LINKSTORE_YEAH", &420_u32).unwrap();
embedder.embed("LINKSTORE_BYTES", &[1_u8, 2, 3, 4]).unwrap();
embedder.embed("LINKSTORE_SHORTS", &[1_u16, 2, 3, 4]).unwrap();
embedder.embed("LINKSTORE_BIG", &(u128::MAX / 2)).unwrap();

embedder.finish().unwrap();

依赖项

~2.5MB
~47K SLoC