Changeset 3320
- Timestamp:
- Nov 8, 2008, 1:35:26 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
neercs/trunk/src/mytrace.c
r3044 r3320 330 330 #if defined USE_GRAB 331 331 struct user_regs_struct regs; 332 char *env; 332 char *env, *p; 333 long p2, envaddr, argvaddr, envptraddr; 333 334 char envpath[PATH_MAX+1]; 334 ssize_t envsize = 32*1024; 335 int ret, fd, l; 335 ssize_t envsize = 16*1024; 336 int ret, fd, l, l2; 337 char *newargv[] = { NULL }; 336 338 ssize_t r; 339 340 ptrace(PTRACE_SETOPTIONS, t->pid, NULL, PTRACE_O_TRACEEXEC); 337 341 338 342 if(ptrace(PTRACE_GETREGS, t->pid, NULL, ®s) < 0) … … 342 346 } 343 347 348 debug("PTRACE_GETREGS done"); 344 349 env = malloc(envsize); 345 350 if (!env) … … 367 372 return -1; 368 373 } 374 envsize = r; 369 375 l = strlen(command)+1; 370 memcpy_into_target(t, regs.RSP, command, l); 371 memcpy_into_target(t, regs.RSP+l, env, envsize); 376 l2 = sizeof(char *); 377 p2 = regs.RSP; 378 memcpy_into_target(t, p2, command, l); 379 p2 += l; 380 argvaddr = p2; 381 memcpy_into_target(t, p2, (char *)®s.RSP, l2); 382 p2 += l2; 383 memcpy_into_target(t, p2, (char *)&newargv, l2); 384 p2 += l2; 385 memcpy_into_target(t, p2, env, envsize); 386 envaddr = p2; 387 p2 += envsize; 388 envptraddr = p2; 389 p = env; 390 while (p < env+envsize) 391 { 392 long diffp = p - env + envaddr; 393 memcpy_into_target(t, p2, (char *)&diffp, l2); 394 p2 += l2; 395 p += strlen(p)+1; 396 } 397 memcpy_into_target(t, p2, (char *)&newargv, l2); 372 398 free(env); 373 ret = remote_syscall(t, MYCALL_EXECVE, regs.RSP, 0, regs.RSP+l);399 ret = remote_syscall(t, MYCALL_EXECVE, regs.RSP, argvaddr, envptraddr); 374 400 375 401 if(ret < 0) … … 479 505 } 480 506 481 debug("remote syscall %s( %lu, %lu, %lu)",507 debug("remote syscall %s(0x%lx, 0x%lx, 0x%lx)", 482 508 syscallnames[call], arg1, arg2, arg3); 483 484 print_registers(t->pid);485 509 486 510 #if defined __x86_64__ … … 499 523 500 524 oinst = ptrace(PTRACE_PEEKTEXT, t->pid, oldregs.RIP - 2, 0) & 0xffff; 501 fprintf(stderr, "%lx\n", oinst);502 525 503 526 #if defined __x86_64__ … … 597 620 /* The process is about to exit, don't do anything else */ 598 621 return 0; 622 case PTRACE_EVENT_EXEC: 623 debug("PTRACE_EVENT_EXEC"); 624 return 0; 599 625 } 600 626
Note: See TracChangeset
for help on using the changeset viewer.