diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-02-28 14:19:04 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-02-28 14:19:04 +0100 |
| commit | e753c19da1b621b1e667de85ce5ef60d186f0684 (patch) | |
| tree | 9bc80378efbe42ec72678230de2905ab121a4d8f /src/box64context.c | |
| parent | 7b50468b61b7bdd9a15753c0a28711c1654a8c12 (diff) | |
| download | box64-e753c19da1b621b1e667de85ce5ef60d186f0684.tar.gz box64-e753c19da1b621b1e667de85ce5ef60d186f0684.zip | |
Added some minimal set of source (now box64 compile and say hello at least)
Diffstat (limited to 'src/box64context.c')
| -rwxr-xr-x | src/box64context.c | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/src/box64context.c b/src/box64context.c new file mode 100755 index 00000000..21768fb2 --- /dev/null +++ b/src/box64context.c @@ -0,0 +1,200 @@ +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <dlfcn.h> +#include <signal.h> +#include <sys/mman.h> + +#include "box64context.h" +#include "debug.h" + + +EXPORTDYN +void initAllHelpers(box64context_t* context) +{ + static int inited = 0; + if(inited) + return; + my_context = context; + //init_pthread_helper(); + //init_signal_helper(context); + inited = 1; +} + +EXPORTDYN +void finiAllHelpers(box64context_t* context) +{ + static int finied = 0; + if(finied) + return; + //fini_pthread_helper(context); + //fini_signal_helper(); + //cleanAlternate(); + //fini_custommem_helper(context); + finied = 1; +} + +/// maxval not inclusive +int getrand(int maxval) +{ + if(maxval<1024) { + return ((random()&0x7fff)*maxval)/0x7fff; + } + uint64_t r = random(); + r = (r*maxval) / RAND_MAX; + return r; + +} + +void free_tlsdatasize(void* p) +{ + if(!p) + return; + tlsdatasize_t *data = (tlsdatasize_t*)p; + free(data->tlsdata); + free(p); +} + +EXPORTDYN +box64context_t *NewBox64Context(int argc) +{ +#ifdef BUILD_DYNAMIC + if(my_context) { + ++my_context->count; + return my_context; + } +#endif + // init and put default values + box64context_t *context = my_context = (box64context_t*)calloc(1, sizeof(box64context_t)); + + context->deferedInit = 1; + context->sel_serial = 1; + + //init_custommem_helper(context); + + context->box64lib = dlopen(NULL, RTLD_NOW|RTLD_GLOBAL); + //context->dlprivate = NewDLPrivate(); + + context->argc = argc; + context->argv = (char**)calloc(context->argc+1, sizeof(char*)); + + for (int i=0; i<4; ++i) context->canary[i] = 1 + getrand(255); + context->canary[getrand(4)] = 0; + printf_log(LOG_DEBUG, "Setting up canary (for Stack protector) at GS:0x14, value:%08X\n", *(uint32_t*)context->canary); + + initAllHelpers(context); + + return context; +} + +EXPORTDYN +void FreeBox64Context(box64context_t** context) +{ + if(!context) + return; + + box64context_t* ctx = *context; // local copy to do the cleanning + + FreeCollection(&ctx->box64_path); + FreeCollection(&ctx->box64_ld_lib); + FreeCollection(&ctx->box64_emulated_libs); + // stop trace now + /*if(ctx->dec) + DeleteX86TraceDecoder(&ctx->dec); + if(ctx->zydis) + DeleteX86Trace(ctx);*/ + + free(ctx->argv); + + for (int i=0; i<ctx->envc; ++i) + free(ctx->envv[i]); + free(ctx->envv); + + for(int i=0; i<MAX_SIGNAL; ++i) + if(ctx->signals[i]!=0 && ctx->signals[i]!=1) { + signal(i, SIG_DFL); + } + + *context = NULL; // bye bye my_context + + //CleanStackSize(ctx); + +#ifndef BUILD_LIB + if(ctx->box64lib) + dlclose(ctx->box64lib); +#endif + + //FreeDLPrivate(&ctx->dlprivate); + + free(ctx->stack); + + free(ctx->fullpath); + free(ctx->box64path); + + void* ptr; + if ((ptr = pthread_getspecific(ctx->tlskey)) != NULL) { + free_tlsdatasize(ptr); + pthread_setspecific(ctx->tlskey, NULL); + } + pthread_key_delete(ctx->tlskey); + + if(ctx->tlsdata) + free(ctx->tlsdata); + + finiAllHelpers(ctx); + + free(ctx); +} +/* +int AddElfHeader(box64context_t* ctx, elfheader_t* head) { + int idx = ctx->elfsize; + if(idx==ctx->elfcap) { + // resize... + ctx->elfcap += 16; + ctx->elfs = (elfheader_t**)realloc(ctx->elfs, sizeof(elfheader_t*) * ctx->elfcap); + } + ctx->elfs[idx] = head; + ctx->elfsize++; + printf_log(LOG_DEBUG, "Adding \"%s\" as #%d in elf collection\n", ElfName(head), idx); + return idx; +} +*/ +int AddTLSPartition(box64context_t* context, int tlssize) { + int oldsize = context->tlssize; + context->tlssize += tlssize; + context->tlsdata = realloc(context->tlsdata, context->tlssize); + memmove(context->tlsdata+tlssize, context->tlsdata, oldsize); // move to the top, using memmove as regions will probably overlap + memset(context->tlsdata, 0, tlssize); // fill new space with 0 (not mandatory) + // clean GS segment for current emu + if(my_context) { + //ResetSegmentsCache(thread_get_emu()); + if(!(++context->sel_serial)) + ++context->sel_serial; + } + + return -context->tlssize; // negative offset +} +/* +void add_neededlib(needed_libs_t* needed, library_t* lib) +{ + if(!needed) + return; + if(needed->size == needed->cap) { + needed->cap += 8; + needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*)); + } + needed->libs[needed->size++] = lib; +} + +void free_neededlib(needed_libs_t* needed) +{ + if(!needed) + return; + needed->cap = 0; + needed->size = 0; + if(needed->libs) + free(needed->libs); + needed->libs = NULL; +} +*/ \ No newline at end of file |