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/wrapped32 | |
| 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/wrapped32')
| -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 |
9 files changed, 108 insertions, 10 deletions
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; } |