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