📄 util.c
字号:
*s++ = str[i + j]; else *s++ = '.'; } else *s++ = ' '; } tprintf("%s |\n", outstr); }}#define PAGMASK (~(PAGSIZ - 1))/* * move `len' bytes of data from process `pid' * at address `addr' to our space at `laddr' */intumoven(tcp, addr, len, laddr)struct tcb *tcp;long addr;int len;char *laddr;{#ifdef LINUX int pid = tcp->pid; int n, m; int started = 0; union { long val; char x[sizeof(long)]; } u; if (addr & (sizeof(long) - 1)) { /* addr not a multiple of sizeof(long) */ n = addr - (addr & -sizeof(long)); /* residue */ addr &= -sizeof(long); /* residue */ errno = 0; u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0); if (errno) { if (started && (errno==EPERM || errno==EIO)) { /* Ran into 'end of memory' - stupid "printpath" */ return 0; } /* But if not started, we had a bogus address. */ perror("ptrace: umoven"); return -1; } started = 1; memcpy(laddr, &u.x[n], m = MIN(sizeof(long) - n, len)); addr += sizeof(long), laddr += m, len -= m; } while (len) { errno = 0; u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0); if (errno) { if (started && (errno==EPERM || errno==EIO)) { /* Ran into 'end of memory' - stupid "printpath" */ return 0; } perror("ptrace: umoven"); return -1; } started = 1; memcpy(laddr, u.x, m = MIN(sizeof(long), len)); addr += sizeof(long), laddr += m, len -= m; }#endif /* LINUX */#ifdef SUNOS4 int pid = tcp->pid;#if 0 int n, m; union { long val; char x[sizeof(long)]; } u; if (addr & (sizeof(long) - 1)) { /* addr not a multiple of sizeof(long) */ n = addr - (addr & -sizeof(long)); /* residue */ addr &= -sizeof(long); /* residue */ errno = 0; u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0); if (errno) { perror("umoven"); return -1; } memcpy(laddr, &u.x[n], m = MIN(sizeof(long) - n, len)); addr += sizeof(long), laddr += m, len -= m; } while (len) { errno = 0; u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0); if (errno) { perror("umoven"); return -1; } memcpy(laddr, u.x, m = MIN(sizeof(long), len)); addr += sizeof(long), laddr += m, len -= m; }#else /* !oldway */ int n; while (len) { n = MIN(len, PAGSIZ); n = MIN(n, ((addr + PAGSIZ) & PAGMASK) - addr); if (ptrace(PTRACE_READDATA, pid, (char *) addr, len, laddr) < 0) { perror("umoven: ptrace(PTRACE_READDATA, ...)"); abort(); return -1; } len -= n; addr += n; laddr += n; }#endif /* !oldway */#endif /* SUNOS4 */#ifdef USE_PROCFS#ifdef HAVE_MP_PROCFS if (pread(tcp->pfd_as, laddr, len, addr) == -1) return -1;#else/* * We would like to use pread preferentially for speed * but even though SGI has it in their library, it no longer works. */#ifdef MIPS#undef HAVE_PREAD#endif#ifdef HAVE_PREAD if (pread(tcp->pfd, laddr, len, addr) == -1) return -1;#else /* !HAVE_PREAD */ lseek(tcp->pfd, addr, SEEK_SET); if (read(tcp->pfd, laddr, len) == -1) return -1;#endif /* !HAVE_PREAD */#endif /* HAVE_MP_PROCFS */#endif /* USE_PROCFS */ return 0;}/* * like `umove' but make the additional effort of looking * for a terminating zero byte. */intumovestr(tcp, addr, len, laddr)struct tcb *tcp;long addr;int len;char *laddr;{#ifdef USE_PROCFS return umoven(tcp, addr, len, laddr);#else /* !USE_PROCFS */ int started = 0; int pid = tcp->pid; int i, n, m; union { long val; char x[sizeof(long)]; } u; if (addr & (sizeof(long) - 1)) { /* addr not a multiple of sizeof(long) */ n = addr - (addr & -sizeof(long)); /* residue */ addr &= -sizeof(long); /* residue */ errno = 0; u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0); if (errno) { if (started && (errno==EPERM || errno==EIO)) { /* Ran into 'end of memory' - stupid "printpath" */ return 0; } perror("umovestr"); return -1; } started = 1; memcpy(laddr, &u.x[n], m = MIN(sizeof(long)-n,len)); while (n & (sizeof(long) - 1)) if (u.x[n++] == '\0') return 0; addr += sizeof(long), laddr += m, len -= m; } while (len) { errno = 0; u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0); if (errno) { if (started && (errno==EPERM || errno==EIO)) { /* Ran into 'end of memory' - stupid "printpath" */ return 0; } perror("umovestr"); return -1; } started = 1; memcpy(laddr, u.x, m = MIN(sizeof(long), len)); for (i = 0; i < sizeof(long); i++) if (u.x[i] == '\0') return 0; addr += sizeof(long), laddr += m, len -= m; } return 0;#endif /* !USE_PROCFS */}#ifdef LINUX#ifndef SPARC#define PTRACE_WRITETEXT 101#define PTRACE_WRITEDATA 102#endif /* !SPARC */#endif /* LINUX */#ifdef SUNOS4static intuload(cmd, pid, addr, len, laddr)int cmd;int pid;long addr;int len;char *laddr;{#if 0 int n; while (len) { n = MIN(len, PAGSIZ); n = MIN(n, ((addr + PAGSIZ) & PAGMASK) - addr); if (ptrace(cmd, pid, (char *)addr, n, laddr) < 0) { perror("uload: ptrace(PTRACE_WRITE, ...)"); return -1; } len -= n; addr += n; laddr += n; }#else int peek, poke; int n, m; union { long val; char x[sizeof(long)]; } u; if (cmd == PTRACE_WRITETEXT) { peek = PTRACE_PEEKTEXT; poke = PTRACE_POKETEXT; } else { peek = PTRACE_PEEKDATA; poke = PTRACE_POKEDATA; } if (addr & (sizeof(long) - 1)) { /* addr not a multiple of sizeof(long) */ n = addr - (addr & -sizeof(long)); /* residue */ addr &= -sizeof(long); errno = 0; u.val = ptrace(peek, pid, (char *) addr, 0); if (errno) { perror("uload: POKE"); return -1; } memcpy(&u.x[n], laddr, m = MIN(sizeof(long) - n, len)); if (ptrace(poke, pid, (char *)addr, u.val) < 0) { perror("uload: POKE"); return -1; } addr += sizeof(long), laddr += m, len -= m; } while (len) { if (len < sizeof(long)) u.val = ptrace(peek, pid, (char *) addr, 0); memcpy(u.x, laddr, m = MIN(sizeof(long), len)); if (ptrace(poke, pid, (char *) addr, u.val) < 0) { perror("uload: POKE"); return -1; } addr += sizeof(long), laddr += m, len -= m; }#endif return 0;}inttload(pid, addr, len, laddr)int pid;int addr, len;char *laddr;{ return uload(PTRACE_WRITETEXT, pid, addr, len, laddr);}intdload(pid, addr, len, laddr)int pid;int addr;int len;char *laddr;{ return uload(PTRACE_WRITEDATA, pid, addr, len, laddr);}#endif /* SUNOS4 */#ifndef USE_PROCFSintupeek(pid, off, res)int pid;long off;long *res;{ long val;#ifdef SUNOS4_KERNEL_ARCH_KLUDGE { static int is_sun4m = -1; struct utsname name; /* Round up the usual suspects. */ if (is_sun4m == -1) { if (uname(&name) < 0) { perror("upeek: uname?"); exit(1); } is_sun4m = strcmp(name.machine, "sun4m") == 0; if (is_sun4m) { extern struct xlat struct_user_offsets[]; struct xlat *x; for (x = struct_user_offsets; x->str; x++) x->val += 1024; } } if (is_sun4m) off += 1024; }#endif /* SUNOS4_KERNEL_ARCH_KLUDGE */ errno = 0; val = ptrace(PTRACE_PEEKUSER, pid, (char *) off, 0); if (val == -1 && errno) { perror("upeek: ptrace(PTRACE_PEEKUSER, ... )"); return -1; } *res = val; return 0;}#endif /* !USE_PROCFS */longgetpc(tcp)struct tcb *tcp;{#ifdef LINUX long pc;#if defined(I386) if (upeek(tcp->pid, 4*EIP, &pc) < 0) return -1;#elif defined(IA64) if (upeek(tcp->pid, PT_B0, &pc) < 0) return -1;#elif defined(ARM) if (upeek(tcp->pid, 4*15, &pc) < 0) return -1;#elif defined(POWERPC) if (upeek(tcp->pid, 4*PT_NIP, &pc) < 0) return -1;#elif defined(M68k) if (upeek(tcp->pid, 4*PT_PC, &pc) < 0) return -1;#elif defined(ALPHA) if (upeek(tcp->pid, REG_PC, &pc) < 0) return -1;#elif defined(MIPS) if (upeek(tcp->pid, REG_EPC, &pc) < 0) return -1;#elif defined(SPARC) struct regs regs; if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0) return -1; pc = regs.r_pc;#elif defined(S390) if(upeek(tcp->pid,PT_PSWADDR,&pc) < 0)#elif defined(HPPA) if(upeek(tcp->pid,PT_IAOQ0,&pc) < 0) return -1;#endif return pc;#endif /* LINUX */#ifdef SUNOS4 /* * Return current program counter for `pid' * Assumes PC is never 0xffffffff */ struct regs regs; if (ptrace(PTRACE_GETREGS, tcp->pid, (char *) ®s, 0) < 0) { perror("getpc: ptrace(PTRACE_GETREGS, ...)"); return -1; } return regs.r_pc;#endif /* SUNOS4 */#ifdef SVR4 /* XXX */ return 0;#endif /* SVR4 */#ifdef FREEBSD struct reg regs; pread(tcp->pfd_reg, ®s, sizeof(regs), 0); return regs.r_eip;#endif /* FREEBSD */}voidprintcall(tcp)struct tcb *tcp;{#ifdef LINUX#ifdef I386 long eip; if (upeek(tcp->pid, 4*EIP, &eip) < 0) { tprintf("[????????] "); return; } tprintf("[%08lx] ", eip);#elif defined(IA62) long ip; if (upeek(tcp->pid, PT_B0, &ip) < 0) { tprintf("[????????] "); return; } tprintf("[%08lx] ", ip);#elif defined(POWERPC) long pc; if (upeek(tcp->pid, 4*PT_NIP, &pc) < 0) { tprintf ("[????????] "); return; } tprintf("[%08lx] ", pc);#elif defined(M68k) long pc; if (upeek(tcp->pid, 4*PT_PC, &pc) < 0) { tprintf ("[????????] "); return; } tprintf("[%08lx] ", pc);#elif defined(ALPHA) long pc; if (upeek(tcp->pid, REG_PC, &pc) < 0) { tprintf ("[????????] "); return; } tprintf("[%08lx] ", pc);#elif defined(SPARC) struct regs regs; if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0) { tprintf("[????????] "); return; } tprintf("[%08lx] ", regs.r_pc);#elif defined(HPPA) long pc; if(upeek(tcp->pid,PT_IAOQ0,&pc) < 0) { tprintf ("[????????] "); return; } tprintf("[%08lx] ", pc);#endif /* !architecture */#endif /* LINUX */#ifdef SUNOS4 struct regs regs; if (ptrace(PTRACE_GETREGS, tcp->pid, (char *) ®s, 0) < 0) { perror("printcall: ptrace(PTRACE_GETREGS, ...)"); tprintf("[????????] "); return; } tprintf("[%08x] ", regs.r_o7);#endif /* SUNOS4 */#ifdef SVR4 /* XXX */ tprintf("[????????] ");#endif#ifdef FREEBSD struct reg regs; pread(tcp->pfd_reg, ®s, sizeof(regs), 0); tprintf("[%08x] ", regs.r_eip);#endif /* FREEBSD */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -