about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-15 14:15:34 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-15 14:15:34 +0100
commit5ce3e2991360771bf5ed9b2b8c7228c742e5134b (patch)
treefe26d176af47ca77d3f2ef8aba021164b6056a5f /src
parent1a7cff559aa23e935a12cedb6ce84fd81e4548f2 (diff)
downloadbox64-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.c27
-rwxr-xr-xsrc/include/myalign32.h20
-rw-r--r--src/wrapped32/generated/functions_list.txt5
-rw-r--r--src/wrapped32/generated/wrappedlibresolvtypes32.h4
-rw-r--r--src/wrapped32/generated/wrapper32.c2
-rw-r--r--src/wrapped32/generated/wrapper32.h1
-rwxr-xr-xsrc/wrapped32/wrappedlibc.c15
-rwxr-xr-xsrc/wrapped32/wrappedlibc_private.h2
-rw-r--r--src/wrapped32/wrappedlibresolv.c83
-rw-r--r--src/wrapped32/wrappedlibresolv_private.h4
-rw-r--r--src/wrapped32/wrappedlibx11.c2
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;
 }