Changeset 2785 for neercs/trunk
- Timestamp:
- Aug 27, 2008, 11:19:02 PM (13 years ago)
- Location:
- neercs/trunk/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
neercs/trunk/src/grab.c
r2516 r2785 54 54 55 55 child = mytrace_fork(parent); 56 mytrace_write(parent, 1, "\x1b]0;\x07", 5); 57 mytrace_write(parent, 1, "\x1b[1000l", 7); 58 mytrace_write(parent, 1, "\x1b[?12l\x1b[?25h", 12); 59 mytrace_write(parent, 1, "\n[Process stolen by neercs]\n", 28); 60 /* FIXME Reset the term */ 61 mytrace_close(parent, 1); 62 63 mytrace_exit(parent, 0); 64 mytrace_detach(parent); 56 65 pid = mytrace_getpid(child); 57 66 … … 76 85 continue; 77 86 78 debug("found pty %d", i); 79 80 if(i == 2) 81 { 82 mytrace_write(parent, i, "\x1b]0;\x07", 5); 83 mytrace_write(parent, i, "\x1b[1000l", 7); 84 mytrace_write(parent, i, "\x1b[?12l\x1b[?25h", 12); 85 mytrace_write(parent, i, "\n[Process stolen by neercs]\n", 28); 86 } 87 debug("found pty %d for pid %d", i, pid); 87 88 88 89 ret = mytrace_close(child, i); … … 122 123 debug("pid %ld has now sid %d", pid, getsid(pid)); 123 124 124 mytrace_exit(parent, 0);125 mytrace_detach(parent);126 127 125 /* Reopen PTY file descriptors */ 128 126 for(i = 0; i <= 2; i++) -
neercs/trunk/src/mytrace.c
r2612 r2785 127 127 #define STRINGIFY(x) X(x) 128 128 129 #define SYSCALL_X86 0x80cd /* CD 80 = int $0x80 */ 130 #define SYSCALL_AMD64 0x050fL /* 0F 05 = syscall */ 129 #define SYSCALL_X86 0x80cd /* CD 80 = int $0x80 */ 130 #define SYSCALL_X86_NEW 0xf3eb /* EB F3 = jmp <__kernel_vsyscall+0x3> */ 131 #define SYSENTER 0x340f /* 0F 34 = sysenter */ 132 #define SYSCALL_AMD64 0x050fL /* 0F 05 = syscall */ 131 133 132 134 #if defined __x86_64__ … … 481 483 long oinst; 482 484 int bits; 485 int offset = 2; 483 486 484 487 if(call < 0 || call >= (long)(sizeof(syscallnames)/sizeof(*syscallnames))) … … 508 511 509 512 oinst = ptrace(PTRACE_PEEKTEXT, t->pid, oldregs.RIP - 2, 0) & 0xffff; 513 fprintf(stderr, "%lx\n", oinst); 510 514 511 515 #if defined __x86_64__ 512 516 if(oinst == SYSCALL_AMD64) 513 517 break; 514 if(oinst == SYSCALL_X86 )518 if(oinst == SYSCALL_X86 || oinst == SYSCALL_X86_NEW) 515 519 { 516 520 bits = 32; … … 518 522 } 519 523 #else 520 if(oinst == SYSCALL_X86 )524 if(oinst == SYSCALL_X86 || oinst == SYSCALL_X86_NEW) 521 525 break; 522 526 #endif … … 528 532 } 529 533 waitpid(t->pid, NULL, 0); 530 531 534 if(ptrace(PTRACE_SYSCALL, t->pid, NULL, 0) < 0) 532 535 { … … 539 542 print_registers(t->pid); 540 543 544 if(oinst == SYSCALL_X86_NEW) 545 { 546 /* Get back to sysenter */ 547 while((ptrace(PTRACE_PEEKTEXT, t->pid, oldregs.RIP - offset, 0) & 0xffff) != 0x340f) 548 offset++; 549 oldregs.ebp = oldregs.esp; 550 } 551 541 552 regs = oldregs; 542 regs.RIP = regs.RIP - 2;553 regs.RIP = regs.RIP - offset; 543 554 #if defined __x86_64__ 544 555 if(bits == 64) … … 592 603 return -1; 593 604 } 605 debug("PTRACE_GETEVENTMSG %d", t->child); 594 606 continue; 595 607 case PTRACE_EVENT_EXIT: 608 debug("PTRACE_EVENT_EXIT"); 596 609 /* The process is about to exit, don't do anything else */ 597 610 return 0;
Note: See TracChangeset
for help on using the changeset viewer.