166 lines
4.7 KiB
Python
166 lines
4.7 KiB
Python
from abc import ABCMeta, abstractmethod
|
|
import six
|
|
|
|
import lldb
|
|
|
|
@six.add_metaclass(ABCMeta)
|
|
class ScriptedProcess:
|
|
|
|
"""
|
|
The base class for a scripted process.
|
|
|
|
Most of the base class methods are `@abstractmethod` that need to be
|
|
overwritten by the inheriting class.
|
|
|
|
DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE.
|
|
THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def __init__(self, target, args):
|
|
""" Construct a scripted process.
|
|
|
|
Args:
|
|
target (lldb.SBTarget): The target launching the scripted process.
|
|
args (lldb.SBStructuredData): A Dictionary holding arbitrary
|
|
key/value pairs used by the scripted process.
|
|
"""
|
|
self.target = None
|
|
self.args = None
|
|
if isinstance(target, lldb.SBTarget) and target.IsValid():
|
|
self.target = target
|
|
if isinstance(args, lldb.SBStructuredData) and args.IsValid():
|
|
self.args = args
|
|
|
|
@abstractmethod
|
|
def get_memory_region_containing_address(addr):
|
|
""" Get the memory region for the scripted process, containing a
|
|
specific address.
|
|
|
|
Args:
|
|
addr (int): Address to look for in the scripted process memory
|
|
regions.
|
|
|
|
Returns:
|
|
lldb.SBMemoryRegionInfo: The memory region containing the address.
|
|
None if out of bounds.
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_thread_with_id(tid):
|
|
""" Get the scripted process thread with a specific ID.
|
|
|
|
Args:
|
|
tid (int): Thread ID to look for in the scripted process.
|
|
|
|
Returns:
|
|
Dict: The thread represented as a dictionary, withr the
|
|
tid thread ID. None if tid doesn't match any of the scripted
|
|
process threads.
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_registers_for_thread(tid):
|
|
""" Get the register context dictionary for a certain thread of
|
|
the scripted process.
|
|
|
|
Args:
|
|
tid (int): Thread ID for the thread's register context.
|
|
|
|
Returns:
|
|
Dict: The register context represented as a dictionary, for the
|
|
tid thread. None if tid doesn't match any of the scripted
|
|
process threads.
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def read_memory_at_address(addr, size):
|
|
""" Get a memory buffer from the scripted process at a certain address,
|
|
of a certain size.
|
|
|
|
Args:
|
|
addr (int): Address from which we should start reading.
|
|
size (int): Size of the memory to read.
|
|
|
|
Returns:
|
|
lldb.SBData: An `lldb.SBData` buffer with the target byte size and
|
|
byte order storing the memory read.
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_loaded_images(self):
|
|
""" Get the list of loaded images for the scripted process.
|
|
|
|
```
|
|
class ScriptedProcessImage:
|
|
def __init__(name, file_spec, uuid, load_address):
|
|
self.name = name
|
|
self.file_spec = file_spec
|
|
self.uuid = uuid
|
|
self.load_address = load_address
|
|
```
|
|
|
|
Returns:
|
|
List[ScriptedProcessImage]: A list of `ScriptedProcessImage`
|
|
containing for each entry, the name of the library, a UUID,
|
|
an `lldb.SBFileSpec` and a load address.
|
|
None if the list is empty.
|
|
"""
|
|
pass
|
|
|
|
def get_process_id(self):
|
|
""" Get the scripted process identifier.
|
|
|
|
Returns:
|
|
int: The scripted process identifier.
|
|
"""
|
|
return 0
|
|
|
|
|
|
def launch(self):
|
|
""" Simulate the scripted process launch.
|
|
|
|
Returns:
|
|
lldb.SBError: An `lldb.SBError` with error code 0.
|
|
"""
|
|
return lldb.SBError()
|
|
|
|
def resume(self):
|
|
""" Simulate the scripted process resume.
|
|
|
|
Returns:
|
|
lldb.SBError: An `lldb.SBError` with error code 0.
|
|
"""
|
|
return lldb.SBError()
|
|
|
|
@abstractmethod
|
|
def should_stop(self):
|
|
""" Check if the scripted process plugin should produce the stop event.
|
|
|
|
Returns:
|
|
bool: True if scripted process should broadcast a stop event.
|
|
False otherwise.
|
|
"""
|
|
pass
|
|
|
|
def stop(self):
|
|
""" Trigger the scripted process stop.
|
|
|
|
Returns:
|
|
lldb.SBError: An `lldb.SBError` with error code 0.
|
|
"""
|
|
return lldb.SBError()
|
|
|
|
@abstractmethod
|
|
def is_alive(self):
|
|
""" Check if the scripted process is alive.
|
|
|
|
Returns:
|
|
bool: True if scripted process is alive. False otherwise.
|
|
"""
|
|
pass
|