use std::collections::HashMap;
#[repr(C)]
struct TestStruct {
value: i32,
name: [u8; 32],
}
static HELLO_WORLD: &str = "Hello, Ghidra CLI!";
static VERSION_STRING: &str = "test_binary v1.0.0";
static SECRET_KEY: &str = "super_secret_key_12345";
#[no_mangle]
pub extern "C" fn add_numbers(a: i32, b: i32) -> i32 {
a + b
}
#[no_mangle]
pub extern "C" fn multiply(x: i32, y: i32) -> i32 {
x * y
}
#[no_mangle]
pub extern "C" fn factorial(n: u64) -> u64 {
if n <= 1 {
1
} else {
n * factorial(n - 1)
}
}
#[no_mangle]
pub extern "C" fn fibonacci(n: u32) -> u64 {
if n == 0 {
return 0;
}
if n == 1 {
return 1;
}
let mut a = 0u64;
let mut b = 1u64;
for _ in 2..=n {
let temp = a + b;
a = b;
b = temp;
}
b
}
#[no_mangle]
pub extern "C" fn process_string(input: *const u8, len: usize) -> i32 {
if input.is_null() || len == 0 {
return -1;
}
let slice = unsafe { std::slice::from_raw_parts(input, len) };
let mut sum: i32 = 0;
for &byte in slice {
sum += byte as i32;
}
sum
}
#[no_mangle]
pub extern "C" fn xor_encrypt(data: *mut u8, len: usize, key: u8) {
if data.is_null() || len == 0 {
return;
}
let slice = unsafe { std::slice::from_raw_parts_mut(data, len) };
for byte in slice.iter_mut() {
*byte ^= key;
}
}
#[no_mangle]
pub extern "C" fn simple_hash(data: *const u8, len: usize) -> u32 {
if data.is_null() || len == 0 {
return 0;
}
let slice = unsafe { std::slice::from_raw_parts(data, len) };
let mut hash: u32 = 5381;
for &byte in slice {
hash = hash.wrapping_mul(33).wrapping_add(byte as u32);
}
hash
}
#[no_mangle]
pub extern "C" fn init_struct(ts: *mut TestStruct, value: i32) {
if ts.is_null() {
return;
}
unsafe {
(*ts).value = value;
(*ts).name = [0; 32];
}
}
fn internal_helper(x: i32) -> i32 {
x * 2 + 1
}
fn main() {
println!("{}", HELLO_WORLD);
println!("{}", VERSION_STRING);
let sum = add_numbers(10, 20);
println!("10 + 20 = {}", sum);
let product = multiply(5, 6);
println!("5 * 6 = {}", product);
let fact = factorial(10);
println!("10! = {}", fact);
let fib = fibonacci(20);
println!("fib(20) = {}", fib);
let hash = simple_hash(SECRET_KEY.as_ptr(), SECRET_KEY.len());
println!("hash = {:x}", hash);
let helper_result = internal_helper(42);
println!("internal: {}", helper_result);
let mut lookup: HashMap<&str, i32> = HashMap::new();
lookup.insert("one", 1);
lookup.insert("two", 2);
lookup.insert("three", 3);
for (key, value) in &lookup {
println!("{} = {}", key, value);
}
}