Beispiel #1
0
long int
ptrace (enum __ptrace_request request, ...)
{
  long int res, ret;
  va_list ap;
  pid_t pid;
  void *addr, *data;

  va_start (ap, request);
  pid = va_arg (ap, pid_t);
  addr = va_arg (ap, void *);
  data = va_arg (ap, void *);
  va_end (ap);

  if (request > 0 && request < 4)
    data = &ret;

  res = __ptrace(request, pid, addr, data);
  if (res >= 0 && request > 0 && request < 4) {
      __set_errno(0);
      return ret;
    }

  return res;
}
static int ptrace_write32(void *opaque, long addr, long val) {
    struct priv_data_ptrace *p = (struct priv_data_ptrace *) opaque;
    int rc;

    // the desired value
    rc = __ptrace(PTRACE_POKETEXT, p->pid, &p->val, (void *) val);
    if (rc < 0) {
        LOGE("__ptrace()");
        return rc;
    }
    // the desired value will be written
    rc = __ptrace(PTRACE_PEEKTEXT, p->pid, &p->val, (void *) addr);
    if (rc < 0) {
        LOGE("__ptrace()");
        return rc;
    }
    return 0;
}
Beispiel #3
0
long ptrace(int request, pid_t pid, void* addr, void* data) {
  switch (request) {
    case PTRACE_PEEKUSR:
    case PTRACE_PEEKTEXT:
    case PTRACE_PEEKDATA:
      {
      long word;
      long ret = __ptrace(request, pid, addr, &word);
      if (ret == 0) {
        return word;
      } else {
        // __ptrace already set errno for us.
        return -1;
      }
    }

    default:
      return __ptrace(request, pid, addr, data);
  }
}