Changeset 2508 for neercs/trunk/src/grab.c
- Timestamp:
- Jul 1, 2008, 1:26:46 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
neercs/trunk/src/grab.c
r2507 r2508 112 112 } 113 113 114 /* FIXME: this function and the following have alignment issues */ 115 static int memcpy_from_target(pid_t pid, void* dest, long src, size_t n) 116 { 117 long *d = (long*)dest; 118 unsigned int i; 119 120 for(i = 0; i < n / sizeof(long); i++) 121 { 122 d[i] = ptrace(PTRACE_PEEKTEXT, pid, src + i * sizeof(long), 0); 114 static int memcpy_from_target(pid_t pid, char* dest, long src, size_t n) 115 { 116 while(n) 117 { 118 long data; 119 int align = sizeof(long) - 1; 120 size_t todo = sizeof(long) - (src & align); 121 122 if(n < todo) 123 todo = n; 124 125 data = ptrace(PTRACE_PEEKTEXT, pid, src - (src & align), 0); 123 126 if(errno) 124 127 { … … 126 129 return -1; 127 130 } 128 } 131 memcpy(dest, (char *)&data + (src & align), todo); 132 133 dest += todo; 134 src += todo; 135 n -= todo; 136 } 137 129 138 return 0; 130 139 } 131 140 132 static int memcpy_into_target(pid_t pid, long dest, void* src, size_t n) 133 { 134 long *s = (long*) src; 135 unsigned int i; 136 137 for(i = 0; i < n / sizeof(long); i++) 138 { 139 if(ptrace(PTRACE_POKETEXT, pid, dest + i * sizeof(long), s[i]) == -1) 141 static int memcpy_into_target(pid_t pid, long dest, char* src, size_t n) 142 { 143 while(n) 144 { 145 long data; 146 int align = sizeof(long) - 1; 147 size_t todo = sizeof(long) - (dest & align); 148 149 if(n < todo) 150 todo = n; 151 if(todo != sizeof(long)) 152 { 153 data = ptrace(PTRACE_PEEKTEXT, pid, dest - (dest & align), 0); 154 if(errno) 155 { 156 perror("ptrace_peektext"); 157 return -1; 158 } 159 } 160 161 memcpy((char *)&data + (dest & align), src, todo); 162 ptrace(PTRACE_POKETEXT, pid, dest - (dest & align), data); 163 if(errno) 140 164 { 141 165 perror("ptrace_poketext"); 142 166 return -1; 143 167 } 144 } 168 169 src += todo; 170 dest += todo; 171 n -= todo; 172 } 173 145 174 return 0; 146 175 } … … 247 276 static int do_open(pid_t pid, char *path, int mode) 248 277 { 249 char path_data[4096],backup_data[4096];278 char backup_data[4096]; 250 279 struct user_regs_struct regs; 251 long target_data; 252 size_t size = (strlen(path) + sizeof(long)) & ~(sizeof(long) - 1L); 280 size_t size = strlen(path) + 1; 253 281 int ret; 254 282 … … 259 287 } 260 288 261 target_data = (regs.RSP - size) & ~(sizeof(long) - 1L);262 263 289 /* Backup the data that we will use */ 264 if(memcpy_from_target(pid, backup_data, target_data, size) < 0)290 if(memcpy_from_target(pid, backup_data, regs.RSP, size) < 0) 265 291 return -1; 266 292 267 293 /* +4 (or 8) because it's truncated on a multiple of 4 (or 8) 268 294 * and we need 1 */ 269 sprintf(path _data, "%s", path);270 memcpy_into_target(pid, target_data, path_data, size);271 272 ret = do_syscall(pid, SYS_open, target_data, O_RDWR, 0755);295 sprintf(path, "%s", path); 296 memcpy_into_target(pid, regs.RSP, path, size); 297 298 ret = do_syscall(pid, SYS_open, regs.RSP, O_RDWR, 0755); 273 299 274 300 /* Restore the datas */ 275 memcpy_into_target(pid, target_data, backup_data, size);301 memcpy_into_target(pid, regs.RSP, backup_data, size); 276 302 277 303 if(ret < 0)
Note: See TracChangeset
for help on using the changeset viewer.