diff options
| author | ptitSeb <seebastien.chev@gmail.com> | 2023-10-20 17:33:34 +0200 |
|---|---|---|
| committer | ptitSeb <seebastien.chev@gmail.com> | 2023-10-20 17:33:34 +0200 |
| commit | 7372540fce848b69432e3201a0cac0c453f2eae8 (patch) | |
| tree | 4723c27660329b4b6874e9c2b52288bb46089914 /src | |
| parent | ceaa4bcac664f7cfc2651641bd453c803679ba3b (diff) | |
| download | box64-7372540fce848b69432e3201a0cac0c453f2eae8.tar.gz box64-7372540fce848b69432e3201a0cac0c453f2eae8.zip | |
Added some workaround for program that POKEUSER/PEEKUSER some drX value and expect the value to stick (for #930)
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/wrappedlibc.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 06e68715..e35145c5 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2981,12 +2981,24 @@ 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) +EXPORT const uint64_t userdata_sign = 0x1234598765ABCEF0; +EXPORT uint32_t userdata[1024]; + +EXPORT long my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, uint32_t* data) { if(request == PTRACE_POKEUSER) { + if(ptrace(PTRACE_PEEKDATA, pid, &userdata_sign, NULL)==userdata_sign && (uintptr_t)addr < sizeof(userdata)) { + ptrace(PTRACE_POKEDATA, pid, addr+(uintptr_t)userdata, data); + return 0; + } // lets just ignore this for now! return 0; } + if(request == PTRACE_PEEKUSER) { + if(ptrace(PTRACE_PEEKDATA, pid, &userdata_sign, NULL)==userdata_sign && (uintptr_t)addr < sizeof(userdata)) { + return ptrace(PTRACE_PEEKDATA, pid, addr+(uintptr_t)userdata, data); + } + } return ptrace(request, pid, addr, data); } |