def add_breakpoint(self, address, breakpoint):
        assert not self.running

        breakpoint.old_value = debug.vm_read_wrapper(self.task, address, 1)
        if breakpoint.old_value != '\xCC':
            self.breakpoints[address] = breakpoint
            debug.vm_write_wrapper(self.task, address, '\xCC')
    def search_memory(self, values):
        assert not self.running

        # find all allocated memory
        regions = []
        address = 1
        while 1:
            try:
                region = debug.vm_region(self.task, address)
            except OSError as e:
                break
            regions.append(region)
            address = regions[-1].address + regions[-1].size

        for region in regions:
            address = region.address
            size = region.size
            try:
                data = debug.vm_read_wrapper(self.task, address, size)
            except OSError as e:
                continue
            if values in data:
                return address + data.index(values)
        return None
 def read_memory(self, address, length):
     return debug.vm_read_wrapper(self.task, address, length)