def attach(self): if self.eport is None: task_port_struct = mach_port_t(self.port) print "[*] Getting exception port on task %d..." % self.port eport_struct = mach_port_t() mask = exception_mask_t(EXC_MASK_ALL) # mask = EXC_MASK_BAD_ACCESS; me = ls_kernel.mach_task_self() ls_kernel.mach_port_allocate(me, MACH_PORT_RIGHT_RECEIVE, byref(eport_struct)) ls_kernel.mach_port_insert_right(me, eport_struct, eport_struct, MACH_MSG_TYPE_MAKE_SEND) old_ports = old_exc_ports_t() # hackity hack hack count = c_uint() count_p = pointer(count) ls_kernel.task_swap_exception_ports(task_port_struct, mask, eport_struct, EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES, x86_THREAD_STATE, old_ports.masks, count_p, old_ports.ports, old_ports.behaviors, old_ports.flavors) old_ports.count = count_p.contents print "[++] Exception port: %d" % eport_struct.value self.old_exc_port = old_ports self.eport = eport_struct.value else: print ("[--] Task %d already has an exception port (%d)!" % (self.port, self.eport))
def task(self): if self._task is None: task_port_struct = mach_port_t() print "[*] Getting task port on process %d..." % self.pid ls_kernel.task_for_pid(ls_kernel.mach_task_self(), self.pid, byref(task_port_struct)) if task_port_struct.value is not None: print "[++] Task port: %d" % task_port_struct.value self._task = Task(task_port_struct.value, self) else: raise TaskForPidException(self.pid) return self._task
def detach(self): if self.eport is not None: me = ls_kernel.mach_task_self() task_port_struct = mach_port_t(self.port) ls_kernel.mach_port_deallocate(me, self.eport)