hack main.c to measure instructions

This commit is contained in:
Alwin Berger 2024-06-18 17:13:31 +02:00
parent 9a0a6ebc35
commit ccc7d889c4
4 changed files with 46 additions and 19 deletions

11
README_icount.txt Normal file
View File

@ -0,0 +1,11 @@
# dependencies
nix-shell
# build qemu
mkdir build
cd build
../myconfigureunsared.sh
make -j 8
# prepare img
qemu-img create -f qcow2 dummy.qcow2 32M
# run
./qemu-system-arm 12a0 1404 -machine mps2-an385 -cpu cortex-m3 -kernel kernel.elf -serial none -icount shift=5,align=off,sleep=on -monitor none -nographic

View File

@ -37,7 +37,6 @@ cd build
--disable-gtk \ --disable-gtk \
--disable-guest-agent \ --disable-guest-agent \
--disable-guest-agent-msi \ --disable-guest-agent-msi \
--disable-hax \
--disable-hvf \ --disable-hvf \
--disable-iconv \ --disable-iconv \
--disable-jack \ --disable-jack \

View File

@ -24,6 +24,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu-main.h" #include "qemu-main.h"
#include "sysemu/runstate.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#ifdef CONFIG_SDL #ifdef CONFIG_SDL
@ -47,6 +48,9 @@ int (*qemu_main)(void) = qemu_default_main;
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "exec/cpu-common.h" #include "exec/cpu-common.h"
void libafl_qemu_set_native_breakpoint( vaddr );
void libafl_qemu_remove_native_breakpoint( vaddr );
int64_t icount_get_raw(void);
//========= Instrumentation end //========= Instrumentation end
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
@ -56,20 +60,23 @@ int main(int argc, char **argv)
fprintf(stderr, "Need address and input file argument\n"); fprintf(stderr, "Need address and input file argument\n");
exit(1); exit(1);
} }
hwaddr target_addr = (hwaddr) strtoll(argv[1], NULL, 16); hwaddr start = (hwaddr) strtoll(argv[1], NULL, 16);
char buffer[4097]; hwaddr end = (hwaddr) strtoll(argv[2], NULL, 16);
FILE* inputfile = fopen(argv[2], "rb"); // hwaddr target_addr = (hwaddr) strtoll(argv[1], NULL, 16);
if (!inputfile) { // vm_start();
perror("fopen"); // char buffer[4097];
exit(1); // FILE* inputfile = fopen(argv[2], "rb");
} // if (!inputfile) {
size_t read_len = fread(buffer, sizeof(char), 4096, inputfile); // perror("fopen");
buffer[read_len]=0; // exit(1);
if (!read_len) { // }
fprintf(stderr, "No input in file\n"); // size_t read_len = fread(buffer, sizeof(char), 4096, inputfile);
exit(1); // buffer[read_len]=0;
} // if (!read_len) {
printf("Load at %lx: %s\n", target_addr, buffer); // fprintf(stderr, "No input in file\n");
// exit(1);
// }
// printf("Load at %lx: %s\n", target_addr, buffer);
// fix arguments for qemu // fix arguments for qemu
argv[2]=argv[0]; argv[2]=argv[0];
argv=&argv[2]; argv=&argv[2];
@ -78,7 +85,17 @@ int main(int argc, char **argv)
qemu_init(argc, argv); qemu_init(argc, argv);
//========= Instrumentation start //========= Instrumentation start
// load input // load input
cpu_physical_memory_rw(target_addr, buffer, read_len, true); // cpu_physical_memory_rw(target_addr, buffer, read_len, true);
libafl_qemu_set_native_breakpoint(start);
vm_start();
qemu_main_loop();
libafl_qemu_remove_native_breakpoint(start);
libafl_qemu_set_native_breakpoint(end);
printf("Start: %lu\n", icount_get_raw());
vm_start();
qemu_main_loop();
printf("End: %lu\n", icount_get_raw());
return 0;
//========= Instrumentation end //========= Instrumentation end
return qemu_main(); return qemu_main();
} }

View File

@ -724,9 +724,9 @@ static bool main_loop_should_exit(int *status)
vm_stop(RUN_STATE_DEBUG); vm_stop(RUN_STATE_DEBUG);
//// --- Begin LibAFL code --- //// --- Begin LibAFL code ---
#ifdef AS_LIB // #ifdef AS_LIB // Also exit in standalone mode for debugging
return true; // exit back to fuzzing harness return true; // exit back to fuzzing harness
#endif // #endif
//// --- End LibAFL code --- //// --- End LibAFL code ---
} }