diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-07-22 20:45:16 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-07-22 20:45:16 +0200 |
| commit | 67c9378fb8568b6104979e158ed690e4c6d3bc04 (patch) | |
| tree | 883eb19b91fb4fa22ca01724ad0408cc8c72af1b /src | |
| parent | 7ab299b2465cda2b9fb0ce5c4014906cc7d20e31 (diff) | |
| download | box64-67c9378fb8568b6104979e158ed690e4c6d3bc04.tar.gz box64-67c9378fb8568b6104979e158ed690e4c6d3bc04.zip | |
Hacked wrapped ptrace to avoid crash when wine handle exception (and debug registers in general)
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibctypes.h | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 5 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 2 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc.c | 10 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc_private.h | 2 |
6 files changed, 19 insertions, 6 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index 9219270a..7d5370fd 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -1083,7 +1083,6 @@ #() lFipLL #() lFipLp #() lFippL -#() lFuipp #() lFpili #() lFpilp #() lFpuip @@ -1574,6 +1573,7 @@ #() uFppppL #() uFppppp #() UFuiiii +#() lFEuipp #() lFipili #() lFipLli #() lFipLlL @@ -3930,6 +3930,8 @@ wrappedlibc: - __vsprintf_chk - scandir - scandir64 +- lFuipp: + - ptrace - vFpLLpp: - qsort_r - iFiippi: diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h index ec55e5bb..508a16f6 100644 --- a/src/wrapped/generated/wrappedlibctypes.h +++ b/src/wrapped/generated/wrappedlibctypes.h @@ -73,6 +73,7 @@ typedef int32_t (*iFpLpA_t)(void*, uintptr_t, void*, va_list); typedef int32_t (*iFppii_t)(void*, void*, int32_t, int32_t); typedef int32_t (*iFppiV_t)(void*, void*, int32_t, ...); typedef int32_t (*iFpppp_t)(void*, void*, void*, void*); +typedef intptr_t (*lFuipp_t)(uint32_t, int32_t, void*, void*); typedef void (*vFpLLpp_t)(void*, uintptr_t, uintptr_t, void*, void*); typedef int32_t (*iFiippi_t)(int32_t, int32_t, void*, void*, int32_t); typedef int32_t (*iFiLLLL_t)(int32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); @@ -254,6 +255,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void* GO(__vsprintf_chk, iFpppp_t) \ GO(scandir, iFpppp_t) \ GO(scandir64, iFpppp_t) \ + GO(ptrace, lFuipp_t) \ GO(qsort_r, vFpLLpp_t) \ GO(__fxstatat, iFiippi_t) \ GO(__fxstatat64, iFiippi_t) \ diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index 8852b3cf..91d491ea 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -1119,7 +1119,6 @@ typedef intptr_t (*lFipLl_t)(int32_t, void*, uintptr_t, intptr_t); typedef intptr_t (*lFipLL_t)(int32_t, void*, uintptr_t, uintptr_t); typedef intptr_t (*lFipLp_t)(int32_t, void*, uintptr_t, void*); typedef intptr_t (*lFippL_t)(int32_t, void*, void*, uintptr_t); -typedef intptr_t (*lFuipp_t)(uint32_t, int32_t, void*, void*); typedef intptr_t (*lFpili_t)(void*, int32_t, intptr_t, int32_t); typedef intptr_t (*lFpilp_t)(void*, int32_t, intptr_t, void*); typedef intptr_t (*lFpuip_t)(void*, uint32_t, int32_t, void*); @@ -1610,6 +1609,7 @@ typedef uint32_t (*uFppppu_t)(void*, void*, void*, void*, uint32_t); typedef uint32_t (*uFppppL_t)(void*, void*, void*, void*, uintptr_t); typedef uint32_t (*uFppppp_t)(void*, void*, void*, void*, void*); typedef uint64_t (*UFuiiii_t)(uint32_t, int32_t, int32_t, int32_t, int32_t); +typedef intptr_t (*lFEuipp_t)(x64emu_t*, uint32_t, int32_t, void*, void*); typedef intptr_t (*lFipili_t)(int32_t, void*, int32_t, intptr_t, int32_t); typedef intptr_t (*lFipLli_t)(int32_t, void*, uintptr_t, intptr_t, int32_t); typedef intptr_t (*lFipLlL_t)(int32_t, void*, uintptr_t, intptr_t, uintptr_t); @@ -4016,7 +4016,6 @@ void lFipLl(x64emu_t *emu, uintptr_t fcn) { lFipLl_t fn = (lFipLl_t)fcn; R_RAX=( void lFipLL(x64emu_t *emu, uintptr_t fcn) { lFipLL_t fn = (lFipLL_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (uintptr_t)R_RCX); } void lFipLp(x64emu_t *emu, uintptr_t fcn) { lFipLp_t fn = (lFipLp_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (void*)R_RCX); } void lFippL(x64emu_t *emu, uintptr_t fcn) { lFippL_t fn = (lFippL_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (uintptr_t)R_RCX); } -void lFuipp(x64emu_t *emu, uintptr_t fcn) { lFuipp_t fn = (lFuipp_t)fcn; R_RAX=(intptr_t)fn((uint32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); } void lFpili(x64emu_t *emu, uintptr_t fcn) { lFpili_t fn = (lFpili_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (intptr_t)R_RDX, (int32_t)R_RCX); } void lFpilp(x64emu_t *emu, uintptr_t fcn) { lFpilp_t fn = (lFpilp_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (intptr_t)R_RDX, (void*)R_RCX); } void lFpuip(x64emu_t *emu, uintptr_t fcn) { lFpuip_t fn = (lFpuip_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (uint32_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX); } @@ -4507,6 +4506,7 @@ void uFppppu(x64emu_t *emu, uintptr_t fcn) { uFppppu_t fn = (uFppppu_t)fcn; R_RA void uFppppL(x64emu_t *emu, uintptr_t fcn) { uFppppL_t fn = (uFppppL_t)fcn; R_RAX=(uint32_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (uintptr_t)R_R8); } void uFppppp(x64emu_t *emu, uintptr_t fcn) { uFppppp_t fn = (uFppppp_t)fcn; R_RAX=(uint32_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8); } void UFuiiii(x64emu_t *emu, uintptr_t fcn) { UFuiiii_t fn = (UFuiiii_t)fcn; R_RAX=fn((uint32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8); } +void lFEuipp(x64emu_t *emu, uintptr_t fcn) { lFEuipp_t fn = (lFEuipp_t)fcn; R_RAX=(intptr_t)fn(emu, (uint32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); } void lFipili(x64emu_t *emu, uintptr_t fcn) { lFipili_t fn = (lFipili_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (intptr_t)R_RCX, (int32_t)R_R8); } void lFipLli(x64emu_t *emu, uintptr_t fcn) { lFipLli_t fn = (lFipLli_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (intptr_t)R_RCX, (int32_t)R_R8); } void lFipLlL(x64emu_t *emu, uintptr_t fcn) { lFipLlL_t fn = (lFipLlL_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (intptr_t)R_RCX, (uintptr_t)R_R8); } @@ -6758,7 +6758,6 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &lFipLL) return 1; if (fun == &lFipLp) return 1; if (fun == &lFippL) return 1; - if (fun == &lFuipp) return 1; if (fun == &lFpili) return 1; if (fun == &lFpilp) return 1; if (fun == &lFpuip) return 1; diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index 5ca6d94a..7d79fd63 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -1120,7 +1120,6 @@ void lFipLl(x64emu_t *emu, uintptr_t fnc); void lFipLL(x64emu_t *emu, uintptr_t fnc); void lFipLp(x64emu_t *emu, uintptr_t fnc); void lFippL(x64emu_t *emu, uintptr_t fnc); -void lFuipp(x64emu_t *emu, uintptr_t fnc); void lFpili(x64emu_t *emu, uintptr_t fnc); void lFpilp(x64emu_t *emu, uintptr_t fnc); void lFpuip(x64emu_t *emu, uintptr_t fnc); @@ -1611,6 +1610,7 @@ void uFppppu(x64emu_t *emu, uintptr_t fnc); void uFppppL(x64emu_t *emu, uintptr_t fnc); void uFppppp(x64emu_t *emu, uintptr_t fnc); void UFuiiii(x64emu_t *emu, uintptr_t fnc); +void lFEuipp(x64emu_t *emu, uintptr_t fnc); void lFipili(x64emu_t *emu, uintptr_t fnc); void lFipLli(x64emu_t *emu, uintptr_t fnc); void lFipLlL(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index ff20404e..59953d9c 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -39,6 +39,7 @@ #include <malloc.h> #include <getopt.h> #include <sys/prctl.h> +#include <sys/ptrace.h> #undef LOG_INFO #undef LOG_DEBUG @@ -2981,6 +2982,15 @@ EXPORT int my_semctl(int semid, int semnum, int cmd, union semun b) return ret; } +EXPORT int my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, void* data) +{ + if(request == PTRACE_POKEUSER) { + // lets just ignore this for now! + return 0; + } + return ptrace(request, pid, addr, data); +} + // Backtrace stuff #include "elfs/elfdwarf_private.h" diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index bcef070d..933178e5 100644 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -1420,7 +1420,7 @@ GO(psignal, vFip) //GO(pthread_setcancelstate, //GO(pthread_setcanceltype, //GO(pthread_setschedparam, -GO(ptrace, lFuipp) +GOM(ptrace, lFEuipp) GO(ptsname, pFi) GOW(ptsname_r, iFipL) //GO(__ptsname_r_chk, |