diff --git a/linux-user/main.c b/linux-user/main.c index 96e253098b..62c3de278f 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -581,6 +581,16 @@ static int parse_args(int argc, char **argv) r++; } + if (!strncmp(r, "libafl", 6)) { + if (optind >= argc) { + (void) fprintf(stderr, + "qemu: missing argument for option '%s'\n", r); + exit(EXIT_FAILURE); + } + optind++; + continue; + } + for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) { if (!strcmp(r, arginfo->argv)) { if (arginfo->has_arg) { diff --git a/qemu_libafl_bridge/.gitignore b/qemu_libafl_bridge/.gitignore new file mode 100644 index 0000000000..6985cf1bd0 --- /dev/null +++ b/qemu_libafl_bridge/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/qemu_libafl_bridge/Cargo.toml b/qemu_libafl_bridge/Cargo.toml index 442416c1c5..d0bb04fb93 100644 --- a/qemu_libafl_bridge/Cargo.toml +++ b/qemu_libafl_bridge/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qemu_libafl_bridge" -version = "0.1.0" +version = "0.2.0" authors = ["Andrea Fioraldi "] description = "QEMU and LibAFL bridge lib" repository = "https://github.com/AFLplusplus/qemu-libafl-bridge/" @@ -13,3 +13,6 @@ edition = "2018" [dependencies] num = "0.4" num_enum = "0.5.1" + +[build-dependencies] +cc = { version = "1.0" } diff --git a/qemu_libafl_bridge/build.rs b/qemu_libafl_bridge/build.rs new file mode 100644 index 0000000000..02508128d6 --- /dev/null +++ b/qemu_libafl_bridge/build.rs @@ -0,0 +1,17 @@ +use std::{env, path::Path}; + +fn main() { + let out_dir = env::var_os("OUT_DIR").unwrap(); + let out_dir = out_dir.to_string_lossy().to_string(); + let src_dir = Path::new("src"); + + println!("cargo:rerun-if-changed=src/weaks.c"); + + cc::Build::new() + .file(src_dir.join("weaks.c")) + .compile("weaks"); + + println!("cargo:rustc-link-search=native={}", &out_dir); + + println!("cargo:rerun-if-changed=build.rs"); +} diff --git a/qemu_libafl_bridge/src/lib.rs b/qemu_libafl_bridge/src/lib.rs index 01f9f5c7b7..ce4589639f 100644 --- a/qemu_libafl_bridge/src/lib.rs +++ b/qemu_libafl_bridge/src/lib.rs @@ -89,4 +89,8 @@ impl QemuEmulator { pub fn h2g(&self, addr: isize) -> *mut u8 { unsafe { transmute(addr - guest_base) } } + + pub fn new() -> Self { + Self {} + } } diff --git a/qemu_libafl_bridge/src/weaks.c b/qemu_libafl_bridge/src/weaks.c new file mode 100644 index 0000000000..4d2c192473 --- /dev/null +++ b/qemu_libafl_bridge/src/weaks.c @@ -0,0 +1,30 @@ +#include +#include + +__attribute__((weak)) int libafl_qemu_write_reg(int reg, uint8_t* val) { + (void)reg; + (void)val; + return 0; +} + +__attribute__((weak)) int libafl_qemu_read_reg(int reg, uint8_t* val) { + (void)reg; + (void)val; + return 0; +} + +__attribute__((weak)) int libafl_qemu_num_regs(void) { + return 0; +} + +__attribute__((weak)) int libafl_qemu_set_breakpoint(uint64_t addr) { + (void)addr; + return 0; +} + +__attribute__((weak)) int libafl_qemu_remove_breakpoint(uint64_t addr) { + (void)addr; + return 0; +} + +__attribute__((weak)) size_t guest_base = 0;