diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/wrappedlibc.c | 8 |
1 files changed, 7 insertions, 1 deletions
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); } |