diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-12-15 14:15:34 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-12-15 14:15:34 +0100 |
| commit | 5ce3e2991360771bf5ed9b2b8c7228c742e5134b (patch) | |
| tree | fe26d176af47ca77d3f2ef8aba021164b6056a5f /src | |
| parent | 1a7cff559aa23e935a12cedb6ce84fd81e4548f2 (diff) | |
| download | box64-5ce3e2991360771bf5ed9b2b8c7228c742e5134b.tar.gz box64-5ce3e2991360771bf5ed9b2b8c7228c742e5134b.zip | |
[BOX32][WRAPPER] More work on libc wrapping, and some new syscall too
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x86syscall_32.c | 27 | ||||
| -rwxr-xr-x | src/include/myalign32.h | 20 | ||||
| -rw-r--r-- | src/wrapped32/generated/functions_list.txt | 5 | ||||
| -rw-r--r-- | src/wrapped32/generated/wrappedlibresolvtypes32.h | 4 | ||||
| -rw-r--r-- | src/wrapped32/generated/wrapper32.c | 2 | ||||
| -rw-r--r-- | src/wrapped32/generated/wrapper32.h | 1 | ||||
| -rwxr-xr-x | src/wrapped32/wrappedlibc.c | 15 | ||||
| -rwxr-xr-x | src/wrapped32/wrappedlibc_private.h | 2 | ||||
| -rw-r--r-- | src/wrapped32/wrappedlibresolv.c | 83 | ||||
| -rw-r--r-- | src/wrapped32/wrappedlibresolv_private.h | 4 | ||||
| -rw-r--r-- | src/wrapped32/wrappedlibx11.c | 2 |
11 files changed, 135 insertions, 30 deletions
diff --git a/src/emu/x86syscall_32.c b/src/emu/x86syscall_32.c index 20a149ba..da40783c 100644 --- a/src/emu/x86syscall_32.c +++ b/src/emu/x86syscall_32.c @@ -268,10 +268,13 @@ pid_t my_vfork(x64emu_t* emu); static int clone32_fn(void* arg) { x64emu_t *emu = (x64emu_t*)arg; + printf_log(LOG_DEBUG, "%04d|New clone32_fn starting with emu=%p (R_ESP=%p)\n", GetTID(), arg, from_ptrv(R_ESP)); + thread_forget_emu(); thread_set_emu(emu); R_EAX = 0; DynaRun(emu); int ret = S_EAX; + printf_log(LOG_DEBUG, "%04d|clone32_fn ending with ret=%d (emu=%p)\n", GetTID(), ret, arg); FreeX64Emu(&emu); my_context->stack_clone_used = 0; return ret; @@ -281,7 +284,7 @@ static int clone32_fn(void* arg) void EXPORT x86Syscall(x64emu_t *emu) { uint32_t s = R_EAX; - printf_log(LOG_DEBUG, "%p: Calling 32bits syscall 0x%02X (%d) %p %p %p %p %p", (void*)R_RIP, s, s, (void*)(uintptr_t)R_EBX, (void*)(uintptr_t)R_ECX, (void*)(uintptr_t)R_EDX, (void*)(uintptr_t)R_ESI, (void*)(uintptr_t)R_EDI); + printf_log(LOG_DEBUG, "%04d|%p: Calling 32bits syscall 0x%02X (%d) %p %p %p %p %p", GetTID(), (void*)R_RIP, s, s, (void*)(uintptr_t)R_EBX, (void*)(uintptr_t)R_ECX, (void*)(uintptr_t)R_EDX, (void*)(uintptr_t)R_ESI, (void*)(uintptr_t)R_EDI); // check wrapper first int cnt = sizeof(syscallwrap) / sizeof(scwrap_t); void* tmp; @@ -377,24 +380,7 @@ void EXPORT x86Syscall(x64emu_t *emu) void* stack_base = from_ptrv(R_ECX); int stack_size = 0; uintptr_t sp = R_ECX; - if(!R_RSI) { - // allocate a new stack... - int currstack = 0; - if((R_ESP>=(uintptr_t)emu->init_stack) && (R_ESP<=((uintptr_t)emu->init_stack+emu->size_stack))) - currstack = 1; - stack_size = (currstack && emu->size_stack)?emu->size_stack:(1024*1024); - stack_base = mmap(NULL, stack_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_32BIT, -1, 0); - // copy value from old stack to new stack - if(currstack) { - memcpy(stack_base, emu->init_stack, stack_size); - sp = (uintptr_t)emu->init_stack + R_ESP - (uintptr_t)stack_base; - } else { - int size_to_copy = (uintptr_t)emu->init_stack + emu->size_stack - (R_ESP); - memcpy(stack_base+stack_size-size_to_copy, from_ptrv(R_ESP), size_to_copy); - sp = (uintptr_t)stack_base+stack_size-size_to_copy; - } - } - x64emu_t * newemu = NewX64Emu(emu->context, R_EIP, (uintptr_t)stack_base, stack_size, (R_ECX)?0:1); + x64emu_t * newemu = NewX64Emu(emu->context, R_EIP, (uintptr_t)stack_base, stack_size, 0); SetupX64Emu(newemu, emu); CloneEmu(newemu, emu); newemu->regs[_SP].q[0] = sp; // setup new stack pointer @@ -417,7 +403,8 @@ void EXPORT x86Syscall(x64emu_t *emu) S_RAX = syscall(__NR_clone, R_EBX, R_ECX, R_EDX, R_EDI, R_ESI); // invert R_ESI/R_EDI on Aarch64 and most other #endif } - break; /*case 123: // SYS_modify_ldt + break; + /*case 123: // SYS_modify_ldt R_EAX = my32_modify_ldt(emu, R_EBX, (thread_area_t*)(uintptr_t)R_ECX, R_EDX); if(R_EAX==0xffffffff && errno>0) R_EAX = (uint32_t)-errno; diff --git a/src/include/myalign32.h b/src/include/myalign32.h index caf2721f..80928b3c 100755 --- a/src/include/myalign32.h +++ b/src/include/myalign32.h @@ -602,5 +602,25 @@ typedef struct my_regex_32_s void convert_regext_to_32(void* d, void* s); void convert_regext_to_64(void* d, void* s); +typedef struct my_ns_msg_32_s { + ptr_t _msg; //const unsigned char *_ + ptr_t _eom; //const unsigned char *_ + uint16_t _id; + uint16_t _flags; + uint16_t _counts[4]; + ptr_t _sections[4];//const unsigned char *_ + uint32_t _sect; + int _rrnum; + ptr_t _msg_ptr; //const unsigned char * +} my_ns_msg_32_t; + +typedef struct my_ns_rr_32_s { + char name[1025]; + uint16_t type; + uint16_t rr_class; + uint32_t ttl; + uint16_t rdlength; + ptr_t rdata; //const unsigned char * +} my_ns_rr_32_t; #endif//__MY_ALIGN32__H_ \ No newline at end of file diff --git a/src/wrapped32/generated/functions_list.txt b/src/wrapped32/generated/functions_list.txt index 91559650..2bc07315 100644 --- a/src/wrapped32/generated/functions_list.txt +++ b/src/wrapped32/generated/functions_list.txt @@ -909,7 +909,6 @@ #() iFpCCC -> iFpCCC #() iFpWWu -> iFpWWu #() iEpuiL -> iEpuiL -#() iFpuip -> iFpuip #() iFpuuU -> iFpuuU #() iFpuLp -> iFpuLp #() iFpupi -> iFpupi @@ -2395,6 +2394,10 @@ wrappedlibpthread: - iEBh_ppp: - pthread_create wrappedlibresolv: +- iFpip: + - ns_initparse +- iFpuip: + - ns_parserr - iEpiipi: - __res_query - res_query diff --git a/src/wrapped32/generated/wrappedlibresolvtypes32.h b/src/wrapped32/generated/wrappedlibresolvtypes32.h index 3df66b40..0668da67 100644 --- a/src/wrapped32/generated/wrappedlibresolvtypes32.h +++ b/src/wrapped32/generated/wrappedlibresolvtypes32.h @@ -11,10 +11,14 @@ #define ADDED_FUNCTIONS() #endif +typedef int32_t (*iFpip_t)(void*, int32_t, void*); +typedef int32_t (*iFpuip_t)(void*, uint32_t, int32_t, void*); typedef int32_t (*iEpiipi_t)(void*, int32_t, int32_t, void*, int32_t); typedef int32_t (*iFpiipi_t)(void*, int32_t, int32_t, void*, int32_t); #define SUPER() ADDED_FUNCTIONS() \ + GO(ns_initparse, iFpip_t) \ + GO(ns_parserr, iFpuip_t) \ GO(__res_query, iEpiipi_t) \ GO(res_query, iEpiipi_t) \ GO(res_search, iEpiipi_t) \ diff --git a/src/wrapped32/generated/wrapper32.c b/src/wrapped32/generated/wrapper32.c index 19302856..ef8eecc7 100644 --- a/src/wrapped32/generated/wrapper32.c +++ b/src/wrapped32/generated/wrapper32.c @@ -1000,7 +1000,6 @@ typedef int32_t (*iFpipp_t)(void*, int32_t, void*, void*); typedef int32_t (*iFpCCC_t)(void*, uint8_t, uint8_t, uint8_t); typedef int32_t (*iFpWWu_t)(void*, uint16_t, uint16_t, uint32_t); typedef int32_t (*iEpuiL_t)(void*, uint32_t, int32_t, uintptr_t); -typedef int32_t (*iFpuip_t)(void*, uint32_t, int32_t, void*); typedef int32_t (*iFpuuU_t)(void*, uint32_t, uint32_t, uint64_t); typedef int32_t (*iFpuLp_t)(void*, uint32_t, uintptr_t, void*); typedef int32_t (*iFpupi_t)(void*, uint32_t, void*, int32_t); @@ -2773,7 +2772,6 @@ void iFpipp_32(x64emu_t *emu, uintptr_t fcn) { iFpipp_t fn = (iFpipp_t)fcn; R_EA void iFpCCC_32(x64emu_t *emu, uintptr_t fcn) { iFpCCC_t fn = (iFpCCC_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptri(uint8_t, R_ESP + 8), from_ptri(uint8_t, R_ESP + 12), from_ptri(uint8_t, R_ESP + 16)); } void iFpWWu_32(x64emu_t *emu, uintptr_t fcn) { iFpWWu_t fn = (iFpWWu_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptri(uint16_t, R_ESP + 8), from_ptri(uint16_t, R_ESP + 12), from_ptri(uint32_t, R_ESP + 16)); } void iEpuiL_32(x64emu_t *emu, uintptr_t fcn) { iEpuiL_t fn = (iEpuiL_t)fcn; errno = emu->libc_err; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptri(uint32_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ulong(from_ptri(ulong_t, R_ESP + 16))); emu->libc_err = errno; } -void iFpuip_32(x64emu_t *emu, uintptr_t fcn) { iFpuip_t fn = (iFpuip_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptri(uint32_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptriv(R_ESP + 16)); } void iFpuuU_32(x64emu_t *emu, uintptr_t fcn) { iFpuuU_t fn = (iFpuuU_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptri(uint32_t, R_ESP + 8), from_ptri(uint32_t, R_ESP + 12), from_ptri(uint64_t, R_ESP + 16)); } void iFpuLp_32(x64emu_t *emu, uintptr_t fcn) { iFpuLp_t fn = (iFpuLp_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptri(uint32_t, R_ESP + 8), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptriv(R_ESP + 16)); } void iFpupi_32(x64emu_t *emu, uintptr_t fcn) { iFpupi_t fn = (iFpupi_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptri(uint32_t, R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16)); } diff --git a/src/wrapped32/generated/wrapper32.h b/src/wrapped32/generated/wrapper32.h index d2f84b24..c0e74182 100644 --- a/src/wrapped32/generated/wrapper32.h +++ b/src/wrapped32/generated/wrapper32.h @@ -950,7 +950,6 @@ void iFpipp_32(x64emu_t *emu, uintptr_t fnc); void iFpCCC_32(x64emu_t *emu, uintptr_t fnc); void iFpWWu_32(x64emu_t *emu, uintptr_t fnc); void iEpuiL_32(x64emu_t *emu, uintptr_t fnc); -void iFpuip_32(x64emu_t *emu, uintptr_t fnc); void iFpuuU_32(x64emu_t *emu, uintptr_t fnc); void iFpuLp_32(x64emu_t *emu, uintptr_t fnc); void iFpupi_32(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped32/wrappedlibc.c b/src/wrapped32/wrappedlibc.c index 284d04e8..b0ba7c52 100755 --- a/src/wrapped32/wrappedlibc.c +++ b/src/wrapped32/wrappedlibc.c @@ -1720,6 +1720,7 @@ EXPORT int32_t my32_execv(x64emu_t* emu, const char* path, ptr_t argv[]) int self = isProcSelf(path, "exe"); int x86 = FileIsX86ELF(path); int x64 = FileIsX64ELF(path); + int script = (my_context->bashpath && FileIsShell(path))?1:0; printf_log(LOG_DEBUG, "execv(\"%s\", %p) is x86=%d\n", path, argv, x86); if (x86 || x64 || self) { int skip_first = 0; @@ -1728,11 +1729,19 @@ EXPORT int32_t my32_execv(x64emu_t* emu, const char* path, ptr_t argv[]) // count argv... int n=skip_first; while(argv[n]) ++n; - const char** newargv = (const char**)calloc(n+2, sizeof(char*)); + int toadd = script?2:1; + const char** newargv = (const char**)calloc(n+toadd+2, sizeof(char*)); newargv[0] = x64?emu->context->box64path:emu->context->box64path; for(int i=0; i<n; ++i) newargv[i+1] = from_ptrv(argv[skip_first+i]); - if(self) newargv[1] = emu->context->fullpath; + if(self) + newargv[1] = emu->context->fullpath; + else { + // TODO check if envp is not environ and add the value on a copy + if(strcmp(newargv[toadd], skip_first?from_ptrv(argv[skip_first]):path)) + setenv(x86?"BOX86_ARG0":"BOX64_ARG0", newargv[toadd], 1); + newargv[toadd] = skip_first?from_ptrv(argv[skip_first]):path; + } printf_log(LOG_DEBUG, " => execv(\"%s\", %p [\"%s\", \"%s\", \"%s\"...:%d])\n", emu->context->box64path, newargv, newargv[0], n?newargv[1]:"", (n>1)?newargv[2]:"",n); int ret = execv(newargv[0], (char* const*)newargv); free(newargv); @@ -3255,6 +3264,8 @@ EXPORT ptr_t my32_stdin = 0; EXPORT ptr_t my32_stdout = 0; EXPORT ptr_t my32_stderr = 0; +EXPORT int __libc_enable_secure = 1; + EXPORT long_t my32_timezone = 0; EXPORT void my32_tzset() { diff --git a/src/wrapped32/wrappedlibc_private.h b/src/wrapped32/wrappedlibc_private.h index 8b2b21f6..481f77af 100755 --- a/src/wrapped32/wrappedlibc_private.h +++ b/src/wrapped32/wrappedlibc_private.h @@ -2194,7 +2194,7 @@ GO(fallocate64, iEiiII) //DATAM(__libc_stack_end, 4) //DATAM(___brk_addr, 4) -//DATA(__libc_enable_secure, 4) +DATA(__libc_enable_secure, 4) GOM(__register_frame_info, vEpp) //%%,noE faked function GOM(__deregister_frame_info, pEp) //%%,noE diff --git a/src/wrapped32/wrappedlibresolv.c b/src/wrapped32/wrappedlibresolv.c index c314592e..3baeae3c 100644 --- a/src/wrapped32/wrappedlibresolv.c +++ b/src/wrapped32/wrappedlibresolv.c @@ -4,6 +4,7 @@ #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <dlfcn.h> #include <netdb.h> +#include <resolv.h> #include "wrappedlibs.h" @@ -18,6 +19,7 @@ #include "box64context.h" #include "emu/x64emu_private.h" #include "box32.h" +#include "myalign32.h" static const char* libresolvName = "libresolv.so.2"; #define LIBNAME libresolv @@ -45,4 +47,85 @@ EXPORT int my32_res_search(x64emu_t* emu, void* dname, int class, int type, void return ret; } +void convert_ns_msg_to_32(void* d, void* s) +{ + if(!d || !s) return; + ns_msg* src = s; + my_ns_msg_32_t* dst = d; + dst->_msg = to_ptrv((void*)src->_msg); + dst->_eom = to_ptrv((void*)src->_eom); + dst->_id = src->_id; + dst->_flags = src->_flags; + for(int i=0; i<4; ++i) + dst->_counts[i] = src->_counts[i]; + for(int i=0; i<4; ++i) + dst->_sections[i] = to_ptrv((void*)src->_sections[i]); + dst->_sect = src->_sect; + dst->_rrnum = src->_rrnum; + dst->_msg_ptr = to_ptrv((void*)src->_msg_ptr); +} +void convert_ns_msg_to_64(void* d, void* s) +{ + if(!d || !s) return; + my_ns_msg_32_t* src = s; + ns_msg* dst = d; + dst->_msg_ptr = from_ptrv(src->_msg_ptr); + dst->_rrnum = src->_rrnum; + dst->_sect = src->_sect; + for(int i=3; i>=0; --i) + dst->_sections[i] = from_ptrv(src->_sections[i]); + for(int i=3; i>=0; --i) + dst->_counts[i] = src->_counts[i]; + dst->_flags = src->_flags; + dst->_id = src->_id; + dst->_eom = from_ptrv(src->_eom); + dst->_msg = from_ptrv(src->_msg); +} + + +EXPORT int my32_ns_initparse(x64emu_t* emu, void* msg, int len, my_ns_msg_32_t* handle) +{ + ns_msg handle_l = {0}; + int ret = ns_initparse(msg, len, &handle_l); + convert_ns_msg_to_32(handle, &handle_l); + return ret; +} + +void convert_ns_rr_to_32(void* d, void* s) +{ + if(!d || !s) return; + ns_rr* src = s; + my_ns_rr_32_t* dst = d; + memcpy(dst->name, src->name, sizeof(dst->name)); + dst->type = src->type; + dst->rr_class = src->rr_class; + dst->ttl = src->ttl; + dst->rdlength = src->rdlength; + dst->rdata = to_ptrv((void*)src->rdata); +} +void convert_ns_rr_to_64(void* d, void* s) +{ + if(!d || !s) return; + my_ns_rr_32_t* src = s; + ns_rr* dst = d; + dst->rdata = from_ptrv(src->rdata); + dst->rdlength = src->rdlength; + dst->ttl = src->ttl; + dst->rr_class = src->rr_class; + dst->type = src->type; + memcpy(dst->name, src->name, sizeof(dst->name)); +} + +EXPORT int my32_ns_parserr(x64emu_t* emu, my_ns_msg_32_t* handle, uint32_t section, int rrnum, my_ns_rr_32_t* rr) +{ + ns_msg handle_l = {0}; + ns_rr rr_l = {0}; + convert_ns_msg_to_64(&handle_l, handle); + convert_ns_rr_to_64(&rr_l, rr); + int ret = ns_parserr(&handle_l, section, rrnum, &rr_l); + convert_ns_rr_to_32(rr, &rr_l); + convert_ns_msg_to_32(handle, &handle_l); + return ret; +} + #include "wrappedlib_init32.h" diff --git a/src/wrapped32/wrappedlibresolv_private.h b/src/wrapped32/wrappedlibresolv_private.h index 0659ff35..00ef733d 100644 --- a/src/wrapped32/wrappedlibresolv_private.h +++ b/src/wrapped32/wrappedlibresolv_private.h @@ -30,7 +30,7 @@ GO(__dn_expand, iFppppi) //GOW(ns_get16, uFp) //GO(__ns_get32, LFp) //GOW(ns_get32, LFp) -GO(ns_initparse, iFpip) +GOM(ns_initparse, iFEpip) //GO(ns_makecanon, iFppL) //GO(ns_msg_getflag, //GO(ns_name_compress, iFppLpp) @@ -44,7 +44,7 @@ GO(ns_initparse, iFpip) GO(ns_name_uncompress, iFppppL) //GO(__ns_name_unpack, iFppppL) //GOW(ns_name_unpack, iFppppL) -GO(ns_parserr, iFpuip) +GOM(ns_parserr, iFEpuip) //GO(ns_parse_ttl, iFpp) //GO(ns_put16, vFup) //GO(ns_put32, vFLp) diff --git a/src/wrapped32/wrappedlibx11.c b/src/wrapped32/wrappedlibx11.c index 014aa35f..4018febc 100644 --- a/src/wrapped32/wrappedlibx11.c +++ b/src/wrapped32/wrappedlibx11.c @@ -1695,7 +1695,7 @@ EXPORT void* my32_XOpenDisplay(void* name) EXPORT int my32_XCloseDisplay(x64emu_t* emu, void* dpy) { int ret = my->XCloseDisplay(dpy); - if(ret) delDisplay(dpy); + if(!ret) delDisplay(dpy); return ret; } |