osi/
osi.rs

1use std::ffi::CStr;
2use std::sync::atomic::{AtomicU64, Ordering};
3
4use panda::plugins::osi::OSI;
5use panda::prelude::*;
6
7static NUM_BB: AtomicU64 = AtomicU64::new(0);
8
9#[panda::init]
10fn init(_: &mut PluginHandle) {
11    // No specialized init needed
12}
13
14// Print every 1000 basic blocks
15#[panda::after_block_exec]
16fn every_basic_block(cpu: &mut CPUState, tb: &mut TranslationBlock, exit_code: u8) {
17    if (u32::from(exit_code) > panda_sys::TB_EXIT_IDX1) || (panda::in_kernel_mode(cpu)) {
18        return;
19    }
20
21    let curr_proc = OSI.get_current_process(cpu);
22    let curr_proc_name_c_str = unsafe { CStr::from_ptr(curr_proc.as_ref().unwrap().name) };
23
24    let curr_bb = NUM_BB.fetch_add(1, Ordering::SeqCst);
25    if (curr_bb % 1000 == 0) && (curr_bb != 0) {
26        println!(
27            "{:?} @ 0x{:016x}, {} BBs in - in shared lib? {}",
28            curr_proc_name_c_str,
29            tb.pc,
30            NUM_BB.load(Ordering::SeqCst) - 1,
31            OSI.in_shared_object(cpu, &**curr_proc.as_ref().unwrap()),
32        );
33    }
34}
35
36use panda::plugins::proc_start_linux::AuxvValues;
37
38#[panda::on_rec_auxv]
39fn on_proc_start(cpu: &mut CPUState, tb: &mut TranslationBlock, auxv: &AuxvValues) {
40    dbg!(auxv);
41}
42
43fn main() {
44    Panda::new().generic("x86_64").replay("test").run();
45}