1f3176f5fSMed Ismail Bennanifrom abc import ABCMeta, abstractmethod 2f3176f5fSMed Ismail Bennaniimport six 3f3176f5fSMed Ismail Bennani 4f3176f5fSMed Ismail Bennaniimport lldb 5f3176f5fSMed Ismail Bennani 6f3176f5fSMed Ismail Bennani@six.add_metaclass(ABCMeta) 7f3176f5fSMed Ismail Bennaniclass ScriptedProcess: 8f3176f5fSMed Ismail Bennani 9f3176f5fSMed Ismail Bennani """ 10f3176f5fSMed Ismail Bennani The base class for a scripted process. 11f3176f5fSMed Ismail Bennani 12f3176f5fSMed Ismail Bennani Most of the base class methods are `@abstractmethod` that need to be 13f3176f5fSMed Ismail Bennani overwritten by the inheriting class. 14f3176f5fSMed Ismail Bennani 15f3176f5fSMed Ismail Bennani DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE. 16f3176f5fSMed Ismail Bennani THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE. 17f3176f5fSMed Ismail Bennani """ 18f3176f5fSMed Ismail Bennani 19f3176f5fSMed Ismail Bennani @abstractmethod 20f3176f5fSMed Ismail Bennani def __init__(self, target, args): 21f3176f5fSMed Ismail Bennani """ Construct a scripted process. 22f3176f5fSMed Ismail Bennani 23f3176f5fSMed Ismail Bennani Args: 24f3176f5fSMed Ismail Bennani target (lldb.SBTarget): The target launching the scripted process. 25f3176f5fSMed Ismail Bennani args (lldb.SBStructuredData): A Dictionary holding arbitrary 26f3176f5fSMed Ismail Bennani key/value pairs used by the scripted process. 27f3176f5fSMed Ismail Bennani """ 28f3176f5fSMed Ismail Bennani self.target = None 29f3176f5fSMed Ismail Bennani self.args = None 30f3176f5fSMed Ismail Bennani if isinstance(target, lldb.SBTarget) and target.IsValid(): 31f3176f5fSMed Ismail Bennani self.target = target 32f3176f5fSMed Ismail Bennani if isinstance(args, lldb.SBStructuredData) and args.IsValid(): 33f3176f5fSMed Ismail Bennani self.args = args 34f3176f5fSMed Ismail Bennani 35f3176f5fSMed Ismail Bennani @abstractmethod 36f3176f5fSMed Ismail Bennani def get_memory_region_containing_address(addr): 37f3176f5fSMed Ismail Bennani """ Get the memory region for the scripted process, containing a 38f3176f5fSMed Ismail Bennani specific address. 39f3176f5fSMed Ismail Bennani 40f3176f5fSMed Ismail Bennani Args: 41f3176f5fSMed Ismail Bennani addr (int): Address to look for in the scripted process memory 42f3176f5fSMed Ismail Bennani regions. 43f3176f5fSMed Ismail Bennani 44f3176f5fSMed Ismail Bennani Returns: 45f3176f5fSMed Ismail Bennani lldb.SBMemoryRegionInfo: The memory region containing the address. 46f3176f5fSMed Ismail Bennani None if out of bounds. 47f3176f5fSMed Ismail Bennani """ 48f3176f5fSMed Ismail Bennani pass 49f3176f5fSMed Ismail Bennani 50f3176f5fSMed Ismail Bennani @abstractmethod 51f3176f5fSMed Ismail Bennani def get_thread_with_id(tid): 52f3176f5fSMed Ismail Bennani """ Get the scripted process thread with a specific ID. 53f3176f5fSMed Ismail Bennani 54f3176f5fSMed Ismail Bennani Args: 55f3176f5fSMed Ismail Bennani tid (int): Thread ID to look for in the scripted process. 56f3176f5fSMed Ismail Bennani 57f3176f5fSMed Ismail Bennani Returns: 58f3176f5fSMed Ismail Bennani Dict: The thread represented as a dictionary, withr the 59f3176f5fSMed Ismail Bennani tid thread ID. None if tid doesn't match any of the scripted 60f3176f5fSMed Ismail Bennani process threads. 61f3176f5fSMed Ismail Bennani """ 62f3176f5fSMed Ismail Bennani pass 63f3176f5fSMed Ismail Bennani 64f3176f5fSMed Ismail Bennani @abstractmethod 65f3176f5fSMed Ismail Bennani def get_registers_for_thread(tid): 66f3176f5fSMed Ismail Bennani """ Get the register context dictionary for a certain thread of 67f3176f5fSMed Ismail Bennani the scripted process. 68f3176f5fSMed Ismail Bennani 69f3176f5fSMed Ismail Bennani Args: 70f3176f5fSMed Ismail Bennani tid (int): Thread ID for the thread's register context. 71f3176f5fSMed Ismail Bennani 72f3176f5fSMed Ismail Bennani Returns: 73f3176f5fSMed Ismail Bennani Dict: The register context represented as a dictionary, for the 74f3176f5fSMed Ismail Bennani tid thread. None if tid doesn't match any of the scripted 75f3176f5fSMed Ismail Bennani process threads. 76f3176f5fSMed Ismail Bennani """ 77f3176f5fSMed Ismail Bennani pass 78f3176f5fSMed Ismail Bennani 79f3176f5fSMed Ismail Bennani @abstractmethod 80f3176f5fSMed Ismail Bennani def read_memory_at_address(addr, size): 81f3176f5fSMed Ismail Bennani """ Get a memory buffer from the scripted process at a certain address, 82f3176f5fSMed Ismail Bennani of a certain size. 83f3176f5fSMed Ismail Bennani 84f3176f5fSMed Ismail Bennani Args: 85f3176f5fSMed Ismail Bennani addr (int): Address from which we should start reading. 86f3176f5fSMed Ismail Bennani size (int): Size of the memory to read. 87f3176f5fSMed Ismail Bennani 88f3176f5fSMed Ismail Bennani Returns: 89f3176f5fSMed Ismail Bennani lldb.SBData: An `lldb.SBData` buffer with the target byte size and 90f3176f5fSMed Ismail Bennani byte order storing the memory read. 91f3176f5fSMed Ismail Bennani """ 92f3176f5fSMed Ismail Bennani pass 93f3176f5fSMed Ismail Bennani 94f3176f5fSMed Ismail Bennani @abstractmethod 95f3176f5fSMed Ismail Bennani def get_loaded_images(self): 96f3176f5fSMed Ismail Bennani """ Get the list of loaded images for the scripted process. 97f3176f5fSMed Ismail Bennani 98f3176f5fSMed Ismail Bennani ``` 99f3176f5fSMed Ismail Bennani class ScriptedProcessImage: 100f3176f5fSMed Ismail Bennani def __init__(name, file_spec, uuid, load_address): 101f3176f5fSMed Ismail Bennani self.name = name 102f3176f5fSMed Ismail Bennani self.file_spec = file_spec 103f3176f5fSMed Ismail Bennani self.uuid = uuid 104f3176f5fSMed Ismail Bennani self.load_address = load_address 105f3176f5fSMed Ismail Bennani ``` 106f3176f5fSMed Ismail Bennani 107f3176f5fSMed Ismail Bennani Returns: 108f3176f5fSMed Ismail Bennani List[ScriptedProcessImage]: A list of `ScriptedProcessImage` 109f3176f5fSMed Ismail Bennani containing for each entry, the name of the library, a UUID, 110f3176f5fSMed Ismail Bennani an `lldb.SBFileSpec` and a load address. 111f3176f5fSMed Ismail Bennani None if the list is empty. 112f3176f5fSMed Ismail Bennani """ 113f3176f5fSMed Ismail Bennani pass 114f3176f5fSMed Ismail Bennani 115f3176f5fSMed Ismail Bennani def get_process_id(self): 116f3176f5fSMed Ismail Bennani """ Get the scripted process identifier. 117f3176f5fSMed Ismail Bennani 118f3176f5fSMed Ismail Bennani Returns: 119f3176f5fSMed Ismail Bennani int: The scripted process identifier. 120f3176f5fSMed Ismail Bennani """ 121f3176f5fSMed Ismail Bennani return 0 122f3176f5fSMed Ismail Bennani 123f3176f5fSMed Ismail Bennani 124f3176f5fSMed Ismail Bennani def launch(self): 125f3176f5fSMed Ismail Bennani """ Simulate the scripted process launch. 126f3176f5fSMed Ismail Bennani 127f3176f5fSMed Ismail Bennani Returns: 128f3176f5fSMed Ismail Bennani lldb.SBError: An `lldb.SBError` with error code 0. 129f3176f5fSMed Ismail Bennani """ 130f3176f5fSMed Ismail Bennani return lldb.SBError() 131f3176f5fSMed Ismail Bennani 132f3176f5fSMed Ismail Bennani def resume(self): 133f3176f5fSMed Ismail Bennani """ Simulate the scripted process resume. 134f3176f5fSMed Ismail Bennani 135f3176f5fSMed Ismail Bennani Returns: 136f3176f5fSMed Ismail Bennani lldb.SBError: An `lldb.SBError` with error code 0. 137f3176f5fSMed Ismail Bennani """ 138f3176f5fSMed Ismail Bennani return lldb.SBError() 139f3176f5fSMed Ismail Bennani 140f3176f5fSMed Ismail Bennani @abstractmethod 141*312b43daSMed Ismail Bennani def should_stop(self): 142*312b43daSMed Ismail Bennani """ Check if the scripted process plugin should produce the stop event. 143*312b43daSMed Ismail Bennani 144*312b43daSMed Ismail Bennani Returns: 145*312b43daSMed Ismail Bennani bool: True if scripted process should broadcast a stop event. 146*312b43daSMed Ismail Bennani False otherwise. 147*312b43daSMed Ismail Bennani """ 148*312b43daSMed Ismail Bennani pass 149*312b43daSMed Ismail Bennani 150*312b43daSMed Ismail Bennani def stop(self): 151*312b43daSMed Ismail Bennani """ Trigger the scripted process stop. 152*312b43daSMed Ismail Bennani 153*312b43daSMed Ismail Bennani Returns: 154*312b43daSMed Ismail Bennani lldb.SBError: An `lldb.SBError` with error code 0. 155*312b43daSMed Ismail Bennani """ 156*312b43daSMed Ismail Bennani return lldb.SBError() 157*312b43daSMed Ismail Bennani 158*312b43daSMed Ismail Bennani @abstractmethod 159f3176f5fSMed Ismail Bennani def is_alive(self): 160f3176f5fSMed Ismail Bennani """ Check if the scripted process is alive. 161f3176f5fSMed Ismail Bennani 162f3176f5fSMed Ismail Bennani Returns: 163f3176f5fSMed Ismail Bennani bool: True if scripted process is alive. False otherwise. 164f3176f5fSMed Ismail Bennani """ 165f3176f5fSMed Ismail Bennani pass 166