1a758c9f7SMed Ismail Bennaniimport os, struct, signal 2a758c9f7SMed Ismail Bennani 3a758c9f7SMed Ismail Bennanifrom typing import Any, Dict 4a758c9f7SMed Ismail Bennani 5a758c9f7SMed Ismail Bennaniimport lldb 6a758c9f7SMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedProcess 7a758c9f7SMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedThread 8a758c9f7SMed Ismail Bennani 92238dcc3SJonas Devlieghere 10b3a835e1SMed Ismail Bennaniclass DummyStopHook: 11*f732157aSMed Ismail Bennani def __init__(self, target, args): 12b3a835e1SMed Ismail Bennani self.target = target 13b3a835e1SMed Ismail Bennani self.args = args 14b3a835e1SMed Ismail Bennani 15b3a835e1SMed Ismail Bennani def handle_stop(self, exe_ctx, stream): 16b3a835e1SMed Ismail Bennani print("My DummyStopHook triggered. Printing args: \n%s" % self.args) 17b3a835e1SMed Ismail Bennani sp = exe_ctx.process.GetScriptedImplementation() 18b3a835e1SMed Ismail Bennani sp.handled_stop = True 19b3a835e1SMed Ismail Bennani 20a758c9f7SMed Ismail Bennaniclass DummyScriptedProcess(ScriptedProcess): 21f190ec68SMed Ismail Bennani memory = None 22f190ec68SMed Ismail Bennani 23bb4ccc66SMed Ismail Bennani def __init__(self, exe_ctx: lldb.SBExecutionContext, args: lldb.SBStructuredData): 24bb4ccc66SMed Ismail Bennani super().__init__(exe_ctx, args) 25c3ca2c6bSMed Ismail Bennani self.threads[0] = DummyScriptedThread(self, None) 26f190ec68SMed Ismail Bennani self.memory = {} 27f190ec68SMed Ismail Bennani addr = 0x500000000 28a3d4f739SMed Ismail Bennani debugger = self.target.GetDebugger() 29a3d4f739SMed Ismail Bennani index = debugger.GetIndexOfTarget(self.target) 30f190ec68SMed Ismail Bennani self.memory[addr] = "Hello, target " + str(index) 31b3a835e1SMed Ismail Bennani self.handled_stop = False 32f190ec68SMed Ismail Bennani 332238dcc3SJonas Devlieghere def read_memory_at_address( 342238dcc3SJonas Devlieghere self, addr: int, size: int, error: lldb.SBError 352238dcc3SJonas Devlieghere ) -> lldb.SBData: 36a758c9f7SMed Ismail Bennani data = lldb.SBData().CreateDataFromCString( 372238dcc3SJonas Devlieghere self.target.GetByteOrder(), self.target.GetCodeByteSize(), self.memory[addr] 382238dcc3SJonas Devlieghere ) 397e01924eSMed Ismail Bennani 40a758c9f7SMed Ismail Bennani return data 41a758c9f7SMed Ismail Bennani 42f190ec68SMed Ismail Bennani def write_memory_at_address(self, addr, data, error): 43f190ec68SMed Ismail Bennani self.memory[addr] = data.GetString(error, 0) 44f190ec68SMed Ismail Bennani return len(self.memory[addr]) + 1 45f190ec68SMed Ismail Bennani 46a758c9f7SMed Ismail Bennani def get_loaded_images(self): 47a758c9f7SMed Ismail Bennani return self.loaded_images 48a758c9f7SMed Ismail Bennani 49a758c9f7SMed Ismail Bennani def get_process_id(self) -> int: 50a758c9f7SMed Ismail Bennani return 42 51a758c9f7SMed Ismail Bennani 52a758c9f7SMed Ismail Bennani def should_stop(self) -> bool: 53a758c9f7SMed Ismail Bennani return True 54a758c9f7SMed Ismail Bennani 55a758c9f7SMed Ismail Bennani def is_alive(self) -> bool: 56a758c9f7SMed Ismail Bennani return True 57a758c9f7SMed Ismail Bennani 58a758c9f7SMed Ismail Bennani def get_scripted_thread_plugin(self): 59a758c9f7SMed Ismail Bennani return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__ 60a758c9f7SMed Ismail Bennani 61c1928033SMed Ismail Bennani def my_super_secret_method(self): 622238dcc3SJonas Devlieghere if hasattr(self, "my_super_secret_member"): 63c1928033SMed Ismail Bennani return self.my_super_secret_member 64c1928033SMed Ismail Bennani else: 65c1928033SMed Ismail Bennani return None 66c1928033SMed Ismail Bennani 67a758c9f7SMed Ismail Bennani 68a758c9f7SMed Ismail Bennaniclass DummyScriptedThread(ScriptedThread): 69738621d0SMed Ismail Bennani def __init__(self, process, args): 70738621d0SMed Ismail Bennani super().__init__(process, args) 712238dcc3SJonas Devlieghere self.frames.append({"pc": 0x0100001B00}) 72a758c9f7SMed Ismail Bennani 73a758c9f7SMed Ismail Bennani def get_thread_id(self) -> int: 74a758c9f7SMed Ismail Bennani return 0x19 75a758c9f7SMed Ismail Bennani 76a758c9f7SMed Ismail Bennani def get_name(self) -> str: 77a758c9f7SMed Ismail Bennani return DummyScriptedThread.__name__ + ".thread-1" 78a758c9f7SMed Ismail Bennani 79a758c9f7SMed Ismail Bennani def get_state(self) -> int: 80a758c9f7SMed Ismail Bennani return lldb.eStateStopped 81a758c9f7SMed Ismail Bennani 82a758c9f7SMed Ismail Bennani def get_stop_reason(self) -> Dict[str, Any]: 838f407b8eSMed Ismail Bennani return {"type": lldb.eStopReasonTrace, "data": {}} 84a758c9f7SMed Ismail Bennani 85a758c9f7SMed Ismail Bennani def get_register_context(self) -> str: 86a758c9f7SMed Ismail Bennani return struct.pack( 872238dcc3SJonas Devlieghere "21Q", 882238dcc3SJonas Devlieghere 1, 892238dcc3SJonas Devlieghere 2, 902238dcc3SJonas Devlieghere 3, 912238dcc3SJonas Devlieghere 4, 922238dcc3SJonas Devlieghere 5, 932238dcc3SJonas Devlieghere 6, 942238dcc3SJonas Devlieghere 7, 952238dcc3SJonas Devlieghere 8, 962238dcc3SJonas Devlieghere 9, 972238dcc3SJonas Devlieghere 10, 982238dcc3SJonas Devlieghere 11, 992238dcc3SJonas Devlieghere 12, 1002238dcc3SJonas Devlieghere 13, 1012238dcc3SJonas Devlieghere 14, 1022238dcc3SJonas Devlieghere 15, 1032238dcc3SJonas Devlieghere 16, 1042238dcc3SJonas Devlieghere 17, 1052238dcc3SJonas Devlieghere 18, 1062238dcc3SJonas Devlieghere 19, 1072238dcc3SJonas Devlieghere 20, 1082238dcc3SJonas Devlieghere 21, 1092238dcc3SJonas Devlieghere ) 110a758c9f7SMed Ismail Bennani 111a758c9f7SMed Ismail Bennani 112a758c9f7SMed Ismail Bennanidef __lldb_init_module(debugger, dict): 113b3a835e1SMed Ismail Bennani # This is used when loading the script in an interactive debug session to 114b3a835e1SMed Ismail Bennani # automatically, register the stop-hook and launch the scripted process. 1152238dcc3SJonas Devlieghere if not "SKIP_SCRIPTED_PROCESS_LAUNCH" in os.environ: 116a758c9f7SMed Ismail Bennani debugger.HandleCommand( 117b3a835e1SMed Ismail Bennani "target stop-hook add -k first -v 1 -k second -v 2 -P %s.%s" 118b3a835e1SMed Ismail Bennani % (__name__, DummyStopHook.__name__) 119b3a835e1SMed Ismail Bennani ) 120b3a835e1SMed Ismail Bennani debugger.HandleCommand( 1212238dcc3SJonas Devlieghere "process launch -C %s.%s" % (__name__, DummyScriptedProcess.__name__) 1222238dcc3SJonas Devlieghere ) 123a758c9f7SMed Ismail Bennani else: 1242238dcc3SJonas Devlieghere print( 1252238dcc3SJonas Devlieghere "Name of the class that will manage the scripted process: '%s.%s'" 1262238dcc3SJonas Devlieghere % (__name__, DummyScriptedProcess.__name__) 1272238dcc3SJonas Devlieghere ) 128b3a835e1SMed Ismail Bennani print( 129b3a835e1SMed Ismail Bennani "Name of the class that will manage the stop-hook: '%s.%s'" 130b3a835e1SMed Ismail Bennani % (__name__, DummyStopHook.__name__) 131b3a835e1SMed Ismail Bennani ) 132