From 28f69afe9635a7a1313450aecfec8ae7332557a7 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Tue, 7 Nov 2023 15:33:23 +0100 Subject: Refined ptrace hacks around POKEUSER/PEEKUSER (should help Wine Unity3D games) --- src/wrapped/wrappedlibc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index cd68e7e0..ac600229 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -3004,7 +3004,7 @@ EXPORT int my_semctl(int semid, int semnum, int cmd, union semun b) return ret; } -EXPORT const uint64_t userdata_sign = 0x1234598765ABCEF0; +EXPORT 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) @@ -3014,6 +3014,9 @@ EXPORT long my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, uint32_ ptrace(PTRACE_POKEDATA, pid, addr+(uintptr_t)userdata, data); return 0; } + // fallback to a generic local faking + if((uintptr_t)addr < sizeof(userdata)) + *(uintptr_t*)(addr+(uintptr_t)userdata) = (uintptr_t)data; // lets just ignore this for now! return 0; } @@ -3021,6 +3024,9 @@ EXPORT long my_ptrace(x64emu_t* emu, int request, pid_t pid, void* addr, uint32_ 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); } + // fallback to a generic local faking + if((uintptr_t)addr < sizeof(userdata)) + return *(uintptr_t*)(addr+(uintptr_t)userdata); } return ptrace(request, pid, addr, data); } -- cgit 1.4.1