4个版本

0.2.2 2021年8月12日
0.2.1 2021年8月12日
0.2.0 2021年8月12日
0.1.0 2021年7月29日

#35 in #object-file

Apache-2.0

81KB
2K SLoC

C 1.5K SLoC // 0.1% comments Rust 373 SLoC // 0.1% comments

plthook的Rust绑定

本crate为plthook库提供Rust绑定。

请参阅API文档plthook库中的描述以获取更多详细信息。

示例

打印当前进程中的符号

use plthook::ObjectFile;

fn main() {
    let object = ObjectFile::open_main_program().unwrap();

    for symbol in object.symbols() {
        println!("{:?} {:?}", symbol.func_address, symbol.name);
    }
}

替换符号

use plthook::ObjectFile;
use std::mem::{self, MaybeUninit};
use std::os::raw::{c_char, c_int};

static mut ATOI_FN: MaybeUninit<fn(*const c_char) -> c_int> = MaybeUninit::uninit();

extern "C" fn neg_atoi(nptr: *const c_char) -> c_int {
    let i = unsafe { (ATOI_FN.assume_init())(nptr) };
    -i
}

fn main() {
    let object = ObjectFile::open_main_program().expect("Failed to open main program");

    unsafe {
        let mut atoi_entry = object.replace("atoi", neg_atoi as *const _).unwrap();
        ATOI_FN = MaybeUninit::new(mem::transmute(atoi_entry.original_address()));
        atoi_entry.discard();
    };

    let i = unsafe { libc::atoi(b"100\0".as_ptr().cast()) };
    assert_eq!(i, -100);
}

依赖

~0.4–395KB