def start(self): #TODO: Handle timeout log.info("Trying to connect to target avatar server at %s:%d", self._sockaddress[0], self._sockaddress[1]) self._socket = socket.create_connection(self._sockaddress, 10) self._avatar_connection = AvatarProtocol( self._socket, self._handle_asynchronous_message)
def start(self): #TODO: Handle timeout log.info("Trying to connect to target avatar server at %s:%d", self._sockaddress[0], self._sockaddress[1]) self._socket = socket.create_connection(self._sockaddress, 10) self._avatar_connection = AvatarProtocol(self._socket, self._handle_asynchronous_message)
class AvatarstubTarget(Target): def __init__(self, system): self._system = system self._breakpoints = {} def init(self): conf = self._system.get_configuration() assert("avatar_configuration" in conf) assert("target_gdb_address" in conf["avatar_configuration"]) assert(conf["avatar_configuration"]["target_gdb_address"].startswith("tcp:")) sockaddr_str = conf["avatar_configuration"]["target_gdb_address"][4:] sockaddr = (sockaddr_str[:sockaddr_str.rfind(":")], int(sockaddr_str[sockaddr_str.rfind(":") + 1:])) self._sockaddress = sockaddr def start(self): #TODO: Handle timeout log.info("Trying to connect to target avatar server at %s:%d", self._sockaddress[0], self._sockaddress[1]) self._socket = socket.create_connection(self._sockaddress, 10) self._avatar_connection = AvatarProtocol(self._socket, self._handle_asynchronous_message) def read_typed_memory(self, address, size): print("Wrong call ...") return self._avatar_connection.read_memory(address, size) def read_untyped_memory(self, address, length): print("Wrong call ...") return self._avatar_connection.read_memory_untyped(address, length) def write_typed_memory(self, address, size, value): self._avatar_connection.write_memory(address, size, value) def write_untyped_memory(self, address, data): chunk_address = address remaining_size = len(data) while remaining_size > 0: self._avatar_connection.write_memory_untyped(address, data[address:address + 255]) chunk_address += 255 remaining_size -= 255 def get_register(self, name): if isinstance(name, str): name = ARM_REGISTER_NAMES[name.lower()] return self._avatar_connection.get_register(name) def set_register(self, name, value): if isinstance(name, str): name = ARM_REGISTER_NAMES[name.lower()] self._avatar_connection.set_register(name, value) def install_codelet(self, address, codelet): self.write_untyped_memory(address, codelet) def execute_codelet(self, address): self._avatar_connection.execute_codelet(address) def set_breakpoint(self, address, **properties): if address in self._breakpoints: raise Exception("Breakpoint at 0x%x already set, not setting a new one" % address) bkpt = {"instruction_set": "arm"} if "thumb" in properties and properties['thumb']: bkpt["instruction_set"] = "thumb" self._breakpoints[address] = bkpt return AvatarBreakpoint(self._system, address) def clear_breakpoint(self, address): del self._breakpoints[address] def cont(self): pc = self.get_register("pc") for (bkpt_address, bkpt_data) in self._breakpoints.items(): if bkpt_address == pc: continue if bkpt_data["instruction_set"] == "arm": self.write_typed_memory(bkpt_address, 4, 0xe1200071) elif bkpt_data["instruction_set"] == "thumb": self.write_typed_memory(bkpt_address, 2, 0xbe01) self._avatar_connection.cont() def _handle_asynchronous_message(self, msg): print("Received event") if msg.name == "AVATAR_RPC_DTH_STATE": #TODO: Look at state and act accordingly (Breakpoint, page fault, etc) self._system.post_event({"tags": [EVENT_STOPPED, EVENT_BREAKPOINT], "channel": "avatar", "source": "target", "properties": { "address": self.get_register("pc")}})
class AvatarstubTarget(Target): def __init__(self, system): self._system = system self._breakpoints = {} def init(self): conf = self._system.get_configuration() assert ("avatar_configuration" in conf) assert ("target_gdb_address" in conf["avatar_configuration"]) assert (conf["avatar_configuration"]["target_gdb_address"].startswith( "tcp:")) sockaddr_str = conf["avatar_configuration"]["target_gdb_address"][4:] sockaddr = (sockaddr_str[:sockaddr_str.rfind(":")], int(sockaddr_str[sockaddr_str.rfind(":") + 1:])) self._sockaddress = sockaddr def start(self): #TODO: Handle timeout log.info("Trying to connect to target avatar server at %s:%d", self._sockaddress[0], self._sockaddress[1]) self._socket = socket.create_connection(self._sockaddress, 10) self._avatar_connection = AvatarProtocol( self._socket, self._handle_asynchronous_message) def read_typed_memory(self, address, size): return self._avatar_connection.read_memory(address, size) def read_untyped_memory(self, address, length): return self._avatar_connection.read_memory_untyped(address, length) def write_typed_memory(self, address, size, value): self._avatar_connection.write_memory(address, size, value) def write_untyped_memory(self, address, data): chunk_address = address remaining_size = len(data) while remaining_size > 0: self._avatar_connection.write_memory_untyped( address, data[address:address + 255]) chunk_address += 255 remaining_size -= 255 def get_register(self, name): if isinstance(name, str): name = ARM_REGISTER_NAMES[name.lower()] return self._avatar_connection.get_register(name) def set_register(self, name, value): if isinstance(name, str): name = ARM_REGISTER_NAMES[name.lower()] self._avatar_connection.set_register(name, value) def install_codelet(self, address, codelet): self.write_untyped_memory(address, codelet) def execute_codelet(self, address): self._avatar_connection.execute_codelet(address) def set_breakpoint(self, address, **properties): if address in self._breakpoints: raise Exception( "Breakpoint at 0x%x already set, not setting a new one" % address) bkpt = {"instruction_set": "arm"} if "thumb" in properties and properties['thumb']: bkpt["instruction_set"] = "thumb" self._breakpoints[address] = bkpt return AvatarBreakpoint(self._system, address) def clear_breakpoint(self, address): del self._breakpoints[address] def cont(self): pc = self.get_register("pc") for (bkpt_address, bkpt_data) in self._breakpoints.items(): if bkpt_address == pc: continue if bkpt_data["instruction_set"] == "arm": self.write_typed_memory(bkpt_address, 4, 0xe1200071) elif bkpt_data["instruction_set"] == "thumb": self.write_typed_memory(bkpt_address, 2, 0xbe01) self._avatar_connection.cont() def _handle_asynchronous_message(self, msg): print("Received event") if msg.name == "AVATAR_RPC_DTH_STATE": #TODO: Look at state and act accordingly (Breakpoint, page fault, etc) self._system.post_event({ "tags": [EVENT_STOPPED, EVENT_BREAKPOINT], "channel": "avatar", "source": "target", "properties": { "address": self.get_register("pc") } })