| import os, struct, signal |
| |
| from typing import Any, Dict |
| |
| import lldb |
| from lldb.plugins.scripted_process import ScriptedProcess |
| from lldb.plugins.scripted_process import ScriptedThread |
| |
| |
| class InvalidScriptedProcess(ScriptedProcess): |
| def __init__(self, exe_ctx: lldb.SBExecutionContext, args: lldb.SBStructuredData): |
| super().__init__(exe_ctx, args) |
| self.threads[0] = InvalidScriptedThread(self, None) |
| |
| def read_memory_at_address( |
| self, addr: int, size: int, error: lldb.SBError |
| ) -> lldb.SBData: |
| error.SetErrorString("This is an invalid scripted process!") |
| return lldb.SBData() |
| |
| def get_loaded_images(self): |
| return self.loaded_images |
| |
| def get_process_id(self) -> int: |
| return 666 |
| |
| def should_stop(self) -> bool: |
| return True |
| |
| def is_alive(self) -> bool: |
| return True |
| |
| def get_scripted_thread_plugin(self): |
| return InvalidScriptedThread.__module__ + "." + InvalidScriptedThread.__name__ |
| |
| |
| class InvalidScriptedThread(ScriptedThread): |
| def __init__(self, process, args): |
| super().__init__(process, args) |
| |
| def get_thread_id(self) -> int: |
| return 0x19 |
| |
| def get_name(self) -> str: |
| return InvalidScriptedThread.__name__ + ".thread-1" |
| |
| def get_state(self) -> int: |
| return lldb.eStateInvalid |
| |
| def get_stop_reason(self) -> Dict[str, Any]: |
| return {"type": lldb.eStopReasonSignal, "data": {"signal": signal.SIGTRAP}} |
| |
| def get_register_context(self) -> str: |
| return None |
| |
| |
| def __lldb_init_module(debugger, dict): |
| if not "SKIP_SCRIPTED_PROCESS_LAUNCH" in os.environ: |
| debugger.HandleCommand( |
| "process launch -C %s.%s" % (__name__, InvalidScriptedProcess.__name__) |
| ) |
| else: |
| print( |
| "Name of the class that will manage the scripted process: '%s.%s'" |
| % (__name__, InvalidScriptedProcess.__name__) |
| ) |