1111from qiling .const import QL_OS , QL_ARCH , QL_VERBOSE
1212from qiling .debugger import QlDebugger
1313
14- from .utils import setup_context_render , setup_branch_predictor , SnapshotManager , run_qdb_script
14+ from .utils import setup_context_render , setup_branch_predictor , setup_address_marker , SnapshotManager , run_qdb_script
1515from .memory import setup_memory_Manager
16- from .misc import parse_int , Breakpoint , TempBreakpoint
16+ from .misc import parse_int , Breakpoint , TempBreakpoint , try_read_int
1717from .const import color
1818
1919from .utils import QDB_MSG , qdb_print
@@ -34,7 +34,7 @@ def __init__(self, ql: Qiling, init_hook: str = "", rr: bool = False, script: st
3434 self ._saved_reg_dump = None
3535 self ._script = script
3636 self .bp_list = {}
37- self .mark_list = {}
37+ self .marker = setup_address_marker ()
3838
3939 self .rr = SnapshotManager (ql ) if rr else None
4040 self .mm = setup_memory_Manager (ql )
@@ -352,54 +352,60 @@ def do_context(self, *args) -> None:
352352 self .render .context_stack ()
353353 self .render .context_asm ()
354354
355- def do_jump (self , address , * args ) -> None :
355+ def do_jump (self , loc : str , * args ) -> None :
356356 """
357357 seek to where ever valid location you want
358358 """
359359
360- symbol , addr = None , None
361- try :
362- addr = int (address , 0 )
363- except :
364- symbol = address
365-
366- if symbol :
367- addr = self .mark_list .get (symbol , None )
360+ sym = self .marker .get_symbol (loc )
361+ addr = sym if sym is not None else try_read_int (loc )
368362
363+ # check validation of the address to be seeked
369364 if self .ql .mem .is_mapped (addr , 4 ):
370- qdb_print (QDB_MSG .INFO , f"seek to 0x{ addr :08x} ..." )
365+ if sym :
366+ qdb_print (QDB_MSG .INFO , f"seek to { loc } @ 0x{ addr :08x} ..." )
367+ else :
368+ qdb_print (QDB_MSG .INFO , f"seek to 0x{ addr :08x} ..." )
369+
371370 self .cur_addr = addr
372371 self .do_context ()
373372
374373 else :
375374 qdb_print (QDB_MSG .ERROR , f"the address to be seeked isn't mapped" )
376375
377- def do_mark (self , args ):
376+ def do_mark (self , args = "" ):
378377 """
379378 mark a user specified address as a symbol
380379 """
381380
382381 args = args .split ()
383- if len (args ) == 1 :
384- try :
385- tmp = int (args [0 ], 0 )
386- except :
387- tmp = args [0 ]
388-
389- if type (tmp ) is str :
390- symbol = tmp
391- else :
392- address = tmp
382+ if len (args ) == 0 :
383+ loc = self .cur_addr
384+ sym_name = self .marker .mark_only_loc (loc )
393385
394- else :
395- symbol , address = args
386+ elif len (args ) == 1 :
387+ if (loc := try_read_int (args [0 ])):
388+ sym_name = self .marker .mark_only_loc (loc )
396389
397- if symbol :
398- addr = self .cur_addr if address is None else int (address , 0 )
399- self .mark_list .update ({symbol : addr })
400- qdb_print (QDB_MSG .INFO , f"mark symbol '{ symbol } ' at address: 0x{ addr :08x} ..." )
390+ else :
391+ loc = self .cur_addr
392+ sym_name = args [0 ]
393+ if (err := self .marker .mark (sym_name , loc )):
394+ qdb_print (QDB_MSG .ERROR , err )
395+ return
396+
397+ elif len (args ) == 2 :
398+ sym_name , addr = args
399+ if (loc := try_read_int (addr )):
400+ self .marker .mark (sym_name , loc )
401+ else :
402+ qdb_print (QDB_MSG .ERROR , f"unable to mark symbol at address: '{ addr } '" )
403+ return
401404 else :
402405 qdb_print (QDB_MSG .ERROR , "symbol should not be empty ..." )
406+ return
407+
408+ qdb_print (QDB_MSG .INFO , f"mark symbol '{ sym_name } ' at address: 0x{ loc :08x} ..." )
403409
404410 def do_show (self , * args ) -> None :
405411 """
@@ -410,7 +416,7 @@ def do_show(self, *args) -> None:
410416 self .ql .log .info (info_line )
411417
412418 qdb_print (QDB_MSG .INFO , f"Breakpoints: { [hex (addr ) for addr in self .bp_list .keys ()]} " )
413- qdb_print (QDB_MSG .INFO , f"Marked symbol: { [{key :hex (val )} for key ,val in self .mark_list . items () ]} " )
419+ qdb_print (QDB_MSG .INFO , f"Marked symbol: { [{key :hex (val )} for key ,val in self .marker . mark_list ]} " )
414420 if self .rr :
415421 qdb_print (QDB_MSG .INFO , f"Snapshots: { len ([st for st in self .rr .layers if isinstance (st , self .rr .DiffedState )])} " )
416422
0 commit comments