static char *__system(RIO *io, RIODesc *fd, const char *cmd) { if (!io || !fd || !cmd || !fd->data) { return NULL; } RIODescData *iodd = fd->data; if (iodd->magic != R_MACH_MAGIC) { return NULL; } task_t task = pid_to_task (fd, iodd->tid); /* XXX ugly hack for testing purposes */ if (!strncmp (cmd, "perm", 4)) { int perm = r_str_rwx (cmd + 4); if (perm) { int pagesize = tsk_pagesize (fd); tsk_setperm (io, task, io->off, pagesize, perm); } else { eprintf ("Usage: =!perm [rwx]\n"); } return NULL; } if (!strncmp (cmd, "pid", 3)) { RIODescData *iodd = fd->data; RIOMach *riom = iodd->data; const char *pidstr = cmd + 3; int pid = -1; if (*pidstr) { pid = __get_pid (fd); //return NULL; } else { eprintf ("%d\n", iodd->pid); return NULL; } if (!strcmp (pidstr, "0")) { pid = 0; } else { pid = atoi (pidstr); if (!pid) { pid = -1; } } if (pid != -1) { task_t task = pid_to_task (fd, pid); if (task != -1) { riom->task = task; iodd->pid = pid; iodd->tid = pid; return NULL; } } eprintf ("io_mach_system: Invalid pid %d\n", pid); } else { eprintf ("Try: '=!pid' or '=!perm'\n"); } return NULL; }
static int __system(RIO *io, RIODesc *fd, const char *cmd) { RIOMach *riom; if (!io || !fd || cmd || !fd->data) { return 0; } riom = (RIOMach*)fd->data; /* XXX ugly hack for testing purposes */ if (!strncmp (cmd, "perm", 4)) { int perm = r_str_rwx (cmd + 4); if (perm) { int pagesize = tsk_pagesize(riom); tsk_setperm (io, riom->task, io->off, pagesize, perm); } else { eprintf ("Usage: =!perm [rwx]\n"); } return 0; } if (!strncmp (cmd, "pid", 3)) { const char *pidstr = cmd + 3; int pid = -1; if (*pidstr) { int pid = RIOMACH_PID (fd->data); eprintf ("%d\n", pid); return 0; } if (!strcmp (pidstr, "0")) { pid = 0; } else { pid = atoi (pidstr); if (!pid) pid = -1; } if (pid != -1) { task_t task = pid_to_task (pid); if (task != -1) { eprintf ("PID=%d\n", pid); riom->pid = pid; riom->task = task; return 0; } } eprintf ("io_mach_system: Invalid pid %d\n", pid); } else { eprintf ("Try: '=!pid' or '=!perm'\n"); } return 1; }
static int mach_write_at(RIO *io, RIODesc *desc, const void *buf, int len, ut64 addr) { vm_address_t vaddr = addr; vm_address_t pageaddr; vm_size_t pagesize; vm_size_t total_size; int operms = 0; int pid = __get_pid (desc); if (!desc || pid < 0) { return 0; } task_t task = pid_to_task (desc, pid); if (len < 1 || task_is_dead (desc, task)) { return 0; } pageaddr = tsk_getpagebase (desc, addr); pagesize = tsk_pagesize (desc); total_size = (len > pagesize) ? pagesize * (1 + (len / pagesize)) : pagesize; if (tsk_write (task, vaddr, buf, len)) { return len; } operms = tsk_getperm (io, task, pageaddr); if (!tsk_setperm (io, task, pageaddr, total_size, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY)) { eprintf ("io.mach: Cannot set page perms for %d byte(s) at 0x%08" PFMT64x"\n", (int)pagesize, (ut64)pageaddr); return -1; } if (!tsk_write (task, vaddr, buf, len)) { eprintf ("io.mach: Cannot write on memory\n"); len = -1; } if (operms) { if (!tsk_setperm (io, task, pageaddr, total_size, operms)) { eprintf ("io.mach: Cannot restore page perms\n"); return -1; } } return len; }
static int mach_write_at(RIO *io, RIOMach *riom, const void *buf, int len, ut64 addr) { vm_address_t vaddr = addr; vm_address_t pageaddr; vm_size_t pagesize; vm_size_t total_size; int operms = 0; task_t task; if (!riom || len < 1) return 0; if (task_is_dead (riom->pid)) return 0; task = riom->task; pageaddr = tsk_getpagebase (riom, addr); pagesize = tsk_pagesize (riom); if (len > pagesize) total_size = pagesize * (1 + (len / pagesize)); else total_size = pagesize; if (tsk_write (task, vaddr, buf, len)) return len; operms = tsk_getperm (io, task, pageaddr); if (!tsk_setperm (io, task, pageaddr, total_size, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY)) { eprintf ("io.mach: Cannot set page perms for %d bytes at 0x%08" PFMT64x"\n", (int)pagesize, (ut64)pageaddr); return -1; } if (!tsk_write (task, vaddr, buf, len)) { eprintf ("io.mach: Cannot write on memory\n"); len = -1; } if (operms) { if (!tsk_setperm (io, task, pageaddr, total_size, operms)) { eprintf ("io.mach: Cannot restore page perms\n"); return -1; } } return len; }
static vm_address_t tsk_getpagebase(RIOMach *riom, ut64 addr) { vm_address_t pagesize = tsk_pagesize (riom); return (addr & ~(pagesize - 1)); }
static vm_address_t tsk_getpagebase(RIODesc *desc, ut64 addr) { vm_address_t pagesize = tsk_pagesize (desc); return (addr & ~(pagesize - 1)); }