From f62bb6b96cd621094a192d0fb67a1bc0a07b32f0 Mon Sep 17 00:00:00 2001 From: Matthew Francis-Landau Date: Sat, 30 Apr 2016 19:01:36 -0700 Subject: [PATCH] system is now printing out the instrunction pointer and what the current instrunction is --- .deps | 90 --------------------------------- .gitignore | 1 + build/main.o | Bin 161912 -> 0 bytes deps/udis86/.gitignore | 26 ++++++++++ make | 15 +++++- src/jit_internal.h | 18 ++++++- src/jit_main.cc | 110 +++++++++++++++++++++++++++++++++++++++-- src/main.cc | 12 ++--- 8 files changed, 168 insertions(+), 104 deletions(-) delete mode 100644 .deps delete mode 100644 build/main.o create mode 100644 deps/udis86/.gitignore diff --git a/.deps b/.deps deleted file mode 100644 index c8421e4..0000000 --- a/.deps +++ /dev/null @@ -1,90 +0,0 @@ -{ - ".deps_version": 2, - "g++ -I ./deps/ -ggdb -O0 -fopenmp -I /home/matthew/Downloads/bochs-code/bochs/cpu/ -I /home/matthew/Downloads/bochs-code/bochs/ -I /home/matthew/Downloads/bochs-code/bochs/instrument/stubs -c src/main.cc -o build/main.o": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/main.o": "output-36f081203eb0d55aaf9b5b8fce186fc8", - "deps": "input-44f85496bf6930d196d5904271343563", - "src": "input-25d902c24283ab8cfbac54dfa101ad31", - "src/main.cc": "input-ac4474224a99a0b2a8a219730ccc8a80" - }, - "g++ -I ./deps/ -ggdb -O0 -fopenmp -I /home/matthew/Downloads/bochs-code/bochs/cpu/ -c src/main.cc -o build/main.o": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/main.o": "output-e31a9b6e492d520c1cb6d41c37ee9be2", - "deps": "input-44f85496bf6930d196d5904271343563", - "src": "input-25d902c24283ab8cfbac54dfa101ad31", - "src/main.cc": "input-6bc1ff7263269e5dd0627b99f57efa1f" - }, - "g++ -I ./deps/ -ggdb -O0 -fopenmp -c src/main.cc -o build/main.o": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/main.o": "output-e31a9b6e492d520c1cb6d41c37ee9be2", - "deps": "input-44f85496bf6930d196d5904271343563", - "src": "input-25d902c24283ab8cfbac54dfa101ad31", - "src/main.cc": "input-6bc1ff7263269e5dd0627b99f57efa1f" - }, - "g++ -o hello-world build/main.o -fopenmp": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/main.o": "input-e31a9b6e492d520c1cb6d41c37ee9be2", - "hello-world": "output-186b6b1d0b5c505251b6af0b5f290f8c" - }, - "g++ -o jit-test build/main.o -fopenmp /home/matthew/Downloads/bochs-code/bochs/cpu/libcpu.a": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/main.o": "input-36f081203eb0d55aaf9b5b8fce186fc8", - "jit-test": "output-e65cd6e5fb2c301fa3ff80210175d9ae" - }, - "g++ -o jit-test build/main.o build/jit_main.o -fopenmp": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/jit_main.o": "input-54f986a9d1394edf86e18f9f5bd6562b", - "build/main.o": "input-c03c77552af34b05d974d9c9aaa4e497", - "jit-test": "output-9ae25ac46104bcf1aa84d3741416294b" - }, - "g++ -o jit-test build/main.o build/jit_main.o -pthread": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/jit_main.o": "input-81f5bf4e2d1ac194a50c2800b4733ffb", - "build/main.o": "input-cb50800c06debe2b511fa6ae69ba8693", - "jit-test": "output-21a43ecaaed5926456e3bb8f6845347f" - }, - "g++ -std=c++14 -I ./deps/ -ggdb -O0 -fopenmp -I /home/matthew/Downloads/bochs-code/bochs/cpu/ -I /home/matthew/Downloads/bochs-code/bochs/ -I /home/matthew/Downloads/bochs-code/bochs/instrument/stubs -c src/jit_main.cc -o build/jit_main.o": { - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/jit_main.o": "output-59476dba0c009eb8580050449ffc8c05", - "deps": "input-44f85496bf6930d196d5904271343563", - "src": "input-25d902c24283ab8cfbac54dfa101ad31", - "src/jit_internal.h": "input-6fd0535e4a5d6681963eeb2d2af6b363", - "src/jit_main.cc": "input-b97e626fb7d265df88d916b39446f987", - "src/redmagic.h": "input-1440d4a512e6d1c48035c2ecdef2f0a6" - }, - "g++ -std=c++14 -I ./deps/ -ggdb -O0 -fopenmp -I /home/matthew/Downloads/bochs-code/bochs/cpu/ -I /home/matthew/Downloads/bochs-code/bochs/ -I /home/matthew/Downloads/bochs-code/bochs/instrument/stubs -c src/main.cc -o build/main.o": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/main.o": "output-a7d347c74435095182c140e344a40c72", - "deps": "input-44f85496bf6930d196d5904271343563", - "src": "input-25d902c24283ab8cfbac54dfa101ad31", - "src/main.cc": "input-68635ea27c091b7a1b1e53f71bdf9983", - "src/redmagic.h": "input-1440d4a512e6d1c48035c2ecdef2f0a6" - }, - "g++ -std=c++14 -I ./deps/ -ggdb -O0 -fopenmp -c src/jit_main.cc -o build/jit_main.o": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/jit_main.o": "output-81f5bf4e2d1ac194a50c2800b4733ffb", - "deps": "input-44f85496bf6930d196d5904271343563", - "src": "input-25d902c24283ab8cfbac54dfa101ad31", - "src/jit_internal.h": "input-e6f16b06e14af4b0bb12e2016683f1ba", - "src/jit_main.cc": "input-1e19771e930f34b4db2fa4d258b1a35f", - "src/redmagic.h": "input-b4a23c3cda8f4300129b08414da09f47" - }, - "g++ -std=c++14 -I ./deps/ -ggdb -O0 -fopenmp -c src/main.cc -o build/main.o": { - ".": "input-5058f1af8388633f609cadb75a75dc9d", - "build": "input-b0da275520918e23dd615e2a747528f1", - "build/main.o": "output-cb50800c06debe2b511fa6ae69ba8693", - "deps": "input-44f85496bf6930d196d5904271343563", - "src": "input-25d902c24283ab8cfbac54dfa101ad31", - "src/main.cc": "input-374d19cee06c17bf24a83e08daf20fc7", - "src/redmagic.h": "input-b4a23c3cda8f4300129b08414da09f47" - } -} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2712130..1e41277 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.o jit-test +.deps diff --git a/build/main.o b/build/main.o deleted file mode 100644 index 8282641e369e391cadcddd5477e7595f09cd93c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161912 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 KB<3#k|NjA4GzJ*} diff --git a/deps/udis86/.gitignore b/deps/udis86/.gitignore new file mode 100644 index 0000000..e937b8e --- /dev/null +++ b/deps/udis86/.gitignore @@ -0,0 +1,26 @@ +Makefile +config.h +config.log +config.status +docs/Makefile +docs/manual/Makefile +docs/x86/Makefile +libtool +libudis86/.deps/ +libudis86/.libs/ +libudis86/Makefile +libudis86/decode.lo +libudis86/itab.lo +libudis86/libudis86.la +libudis86/syn-att.lo +libudis86/syn-intel.lo +libudis86/syn.lo +libudis86/udis86.lo +scripts/Makefile +stamp-h1 +tests/.deps/ +tests/Makefile +tests/difftest.sh +udcli/.deps/ +udcli/Makefile +udcli/udcli \ No newline at end of file diff --git a/make b/make index ad18294..93068ff 100755 --- a/make +++ b/make @@ -17,7 +17,7 @@ CXX_FLAGS = ( '-I ./deps/ ' '-ggdb ' '-O0 ' - '-fopenmp ' + '-I ./deps/udis86' # '-I /home/matthew/Downloads/bochs-code/bochs/cpu/ ' # '-I /home/matthew/Downloads/bochs-code/bochs/ ' # '-I /home/matthew/Downloads/bochs-code/bochs/instrument/stubs ' @@ -28,7 +28,8 @@ CXX_FLAGS_UNIT = ( '-I ./src/ ' ) LIBS = ( - '-pthread' + '-pthread ' + 'deps/udis86/libudis86/.libs/libudis86.a ' # '/home/matthew/Downloads/bochs-code/bochs/cpu/libcpu.a ' # '/home/matthew/Downloads/bochs-code/bochs/logio.o ' # '/home/matthew/Downloads/bochs-code/bochs/cpu/fpu/libfpu.a ' @@ -42,6 +43,7 @@ CXX='g++' LD='g++' def build(): + deps() compile() link() @@ -54,9 +56,11 @@ def mic(): def release(): global CXX_FLAGS CXX_FLAGS = CXX_FLAGS.replace('-O0', '-O3') + CXX_FLAGS = CXX_FLAGS.replace('-ggdb', '') build() def clean(): + Shell('cd deps/udis86 && make clean', shell=True) autoclean() def run(): @@ -103,11 +107,18 @@ def unit_link(): after() def unit(): + deps() unit_compile() compile() unit_link() Shell('./' + UNIT_TARGET) +def deps(): + # udis86 version 1.7.2 + # TODO: make this auto build if not there + #Shell('cd deps/udis86 && ./configure && make', shell=True) + after() + if __name__ == '__main__': main(parallel_ok=True)#, jobs=4) diff --git a/src/jit_internal.h b/src/jit_internal.h index 6c718ac..1323a91 100644 --- a/src/jit_internal.h +++ b/src/jit_internal.h @@ -12,14 +12,30 @@ #include #include #include -#include +//#include + #include +#include + #include #include +#include + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +typedef unsigned long long int register_type; + struct redmagic_handle_t { struct redmagic_thread_trace_t *head = nullptr; + pid_t child_pid; + + // hacky stuff to get things working.... + register_type pc; + unsigned long read_offset; }; struct redmagic_thread_trace_t { diff --git a/src/jit_main.cc b/src/jit_main.cc index 8569d50..84b7f3c 100644 --- a/src/jit_main.cc +++ b/src/jit_main.cc @@ -2,6 +2,7 @@ #include "redmagic.h" #include "jit_internal.h" +#include "udis86.h" #include using namespace std; @@ -14,14 +15,115 @@ struct redmagic_handle_t *redmagic_global_default = nullptr; handle = redmagic_global_default; \ } +static int udis_input_hook(ud_t *obj) { + // this method is suppose to only go forward one byte each time + // if the skip method is called then this just get call n times, so not too useful + struct redmagic_handle_t *user = (struct redmagic_handle_t*)ud_get_user_opaque_data(obj); + + unsigned long at = user->read_offset; + long res = ptrace(PTRACE_PEEKDATA, user->child_pid, at, NULL); + // TODO: make this cache the internal result + user->read_offset++; + return res & 0xff; +} + extern "C" struct redmagic_handle_t *redmagic_init() { - auto r = new redmagic_handle_t; - if(redmagic_global_default == nullptr) { + // auto r = new redmagic_handle_t; + // if(redmagic_global_default == nullptr) { + // redmagic_global_default = r; + // } + // return r; + + pid_t child = fork(); + if(child == 0) { + // we are the child process + ptrace(PTRACE_TRACEME, 0, NULL, NULL); + + asm("int3"); + + + return NULL; + } else { + auto r = new redmagic_handle_t; redmagic_global_default = r; - } - return r; + r->child_pid = child; + + ud_t disassm; + ud_init(&disassm); + ud_set_user_opaque_data(&disassm, r); + ud_set_input_hook(&disassm, udis_input_hook); + ud_set_mode(&disassm, 64); // 64 bit + ud_set_vendor(&disassm, UD_VENDOR_INTEL); + ud_set_syntax(&disassm, UD_SYN_INTEL); + + int res, stat; + // wait for a traceme call to arrive + res = waitpid(child, &stat, WUNTRACED); + cout << "attached to childed: " << res << " " << stat << endl << flush; + if((res != child) || !(WIFSTOPPED(stat))) { + cerr << "unexpected state\n"; + exit(-1); + } + //struct user_regs_struct regs, oregs; + // ptrace(PTRACE_GETREGS, r->child_pid, ®s, NULL); + // cout << "got back regs\n" << flush; + + // while(waitpid(child, NULL, WNOHANG) == 0) { + // ptrace(PTRACE_CONT, child, NULL, NULL); + // wait(NULL); + // long i = ptrace(PTRACE_GETREGS, child, ®s, NULL); + // //if(memcmp(®s,&oregs, sizeof(regs)) != 0) { + // cout << "a:" << regs.rip << endl << flush; + // oregs = regs; + // //} + // //asm("int3"); + // ptrace(PTRACE_CONT, child, NULL, NULL); + // } + + // http://www.secretmango.com/jimb/Whitepapers/ptrace/ptrace.html + + while(true) { + if((res = ptrace(PTRACE_SINGLESTEP, child, NULL, NULL)) < 0) { + cerr << "failed single step\n"; + exit(-1); + } + res = wait(&stat); + + int signo; + if((signo = WSTOPSIG(stat)) == SIGTRAP) { + signo = 0; + } + if(signo == SIGINT) { + cerr << "processes was killed\n"; + exit(-1); + } + struct user_regs_struct regs; + if(ptrace(PTRACE_GETREGS, child, ®s, ®s) < 0) { + cerr << "failed to get regs\n"; + exit(-1); + } + r->pc = regs.rip; + r->read_offset = regs.rip; + ud_set_pc(&disassm, regs.rip); + + if (!ud_disassemble(&disassm)) { + cerr << "fail disassm\n"; + exit(-1); + } + + + cout << "instrunction pointer: "<