@@ -435,13 +435,13 @@ <h1>Source code for libdebug.architectures.amd64.amd64_stack_unwinder</h1><div c
435435< span class ="kn "> from</ span > < span class ="nn "> typing</ span > < span class ="kn "> import</ span > < span class ="n "> TYPE_CHECKING</ span >
436436
437437< span class ="kn "> from</ span > < span class ="nn "> libdebug.architectures.stack_unwinding_manager</ span > < span class ="kn "> import</ span > < span class ="n "> StackUnwindingManager</ span >
438- < span class ="kn "> from</ span > < span class ="nn "> libdebug.liblog</ span > < span class ="kn "> import</ span > < span class ="n "> logging </ span >
438+ < span class ="kn "> from</ span > < span class ="nn "> libdebug.liblog</ span > < span class ="kn "> import</ span > < span class ="n "> liblog </ span >
439439
440440< span class ="k "> if</ span > < span class ="n "> TYPE_CHECKING</ span > < span class ="p "> :</ span >
441+ < span class ="kn "> from</ span > < span class ="nn "> libdebug.data.memory_map</ span > < span class ="kn "> import</ span > < span class ="n "> MemoryMap</ span >
441442 < span class ="kn "> from</ span > < span class ="nn "> libdebug.state.thread_context</ span > < span class ="kn "> import</ span > < span class ="n "> ThreadContext</ span >
442443
443444
444-
445445< div class ="viewcode-block " id ="Amd64StackUnwinder ">
446446< a class ="viewcode-back " href ="../../../../libdebug.architectures.amd64.html#libdebug.architectures.amd64.amd64_stack_unwinder.Amd64StackUnwinder "> [docs]</ a >
447447< span class ="k "> class</ span > < span class ="nc "> Amd64StackUnwinder</ span > < span class ="p "> (</ span > < span class ="n "> StackUnwindingManager</ span > < span class ="p "> ):</ span >
@@ -484,25 +484,29 @@ <h1>Source code for libdebug.architectures.amd64.amd64_stack_unwinder</h1><div c
484484 < span class ="c1 "> # If we are in the prolouge of a function, we need to get the return address from the stack</ span >
485485 < span class ="c1 "> # using a slightly more complex method</ span >
486486 < span class ="k "> try</ span > < span class ="p "> :</ span >
487- < span class ="n "> first_return_address</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> get_return_address</ span > < span class ="p "> (</ span > < span class ="n "> target</ span > < span class ="p "> )</ span >
487+ < span class ="n "> first_return_address</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> get_return_address</ span > < span class ="p "> (</ span > < span class ="n "> target</ span > < span class ="p "> , </ span > < span class =" n " > vmaps </ span > < span class =" p " > )</ span >
488488
489- < span class ="k "> if</ span > < span class ="n "> first_return_address</ span > < span class ="o "> !=</ span > < span class ="n "> stack_trace</ span > < span class ="p "> [</ span > < span class ="mi "> 1</ span > < span class ="p "> ]:</ span >
490- < span class ="n "> stack_trace</ span > < span class ="o "> .</ span > < span class ="n "> insert</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> ,</ span > < span class ="n "> first_return_address</ span > < span class ="p "> )</ span >
489+ < span class ="k "> if</ span > < span class ="nb "> len</ span > < span class ="p "> (</ span > < span class ="n "> stack_trace</ span > < span class ="p "> )</ span > < span class ="o "> ></ span > < span class ="mi "> 1</ span > < span class ="p "> :</ span >
490+ < span class ="k "> if</ span > < span class ="n "> first_return_address</ span > < span class ="o "> !=</ span > < span class ="n "> stack_trace</ span > < span class ="p "> [</ span > < span class ="mi "> 1</ span > < span class ="p "> ]:</ span >
491+ < span class ="n "> stack_trace</ span > < span class ="o "> .</ span > < span class ="n "> insert</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> ,</ span > < span class ="n "> first_return_address</ span > < span class ="p "> )</ span >
492+ < span class ="k "> else</ span > < span class ="p "> :</ span >
493+ < span class ="n "> stack_trace</ span > < span class ="o "> .</ span > < span class ="n "> append</ span > < span class ="p "> (</ span > < span class ="n "> first_return_address</ span > < span class ="p "> )</ span >
491494 < span class ="k "> except</ span > < span class ="p "> (</ span > < span class ="ne "> OSError</ span > < span class ="p "> ,</ span > < span class ="ne "> ValueError</ span > < span class ="p "> ):</ span >
492- < span class ="n "> logging </ span > < span class ="o "> .</ span > < span class ="n "> WARNING </ span > < span class ="p "> (</ span >
493- < span class ="s2 "> "Failed to get the return address from the stack . Check stack frame registers (e.g., base pointer). The stack trace may be incomplete."</ span > < span class ="p "> ,</ span >
495+ < span class ="n "> liblog </ span > < span class ="o "> .</ span > < span class ="n "> warning </ span > < span class ="p "> (</ span >
496+ < span class ="s2 "> "Failed to get the return address. Check stack frame registers (e.g., base pointer). The stack trace may be incomplete."</ span > < span class ="p "> ,</ span >
494497 < span class ="p "> )</ span >
495498
496499 < span class ="k "> return</ span > < span class ="n "> stack_trace</ span > </ div >
497500
498501
499502< div class ="viewcode-block " id ="Amd64StackUnwinder.get_return_address ">
500503< a class ="viewcode-back " href ="../../../../libdebug.architectures.amd64.html#libdebug.architectures.amd64.amd64_stack_unwinder.Amd64StackUnwinder.get_return_address "> [docs]</ a >
501- < span class ="k "> def</ span > < span class ="nf "> get_return_address</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64StackUnwinder</ span > < span class ="p "> ,</ span > < span class ="n "> target</ span > < span class ="p "> :</ span > < span class ="n "> ThreadContext</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="nb "> int</ span > < span class ="p "> :</ span >
504+ < span class ="k "> def</ span > < span class ="nf "> get_return_address</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64StackUnwinder</ span > < span class ="p "> ,</ span > < span class ="n "> target</ span > < span class ="p "> :</ span > < span class ="n "> ThreadContext</ span > < span class ="p "> , </ span > < span class =" n " > vmaps </ span > < span class =" p " > : </ span > < span class =" nb " > list </ span > < span class =" p " > [ </ span > < span class =" n " > MemoryMap </ span > < span class =" p " > ] )</ span > < span class ="o "> -></ span > < span class ="nb "> int</ span > < span class ="p "> :</ span >
502505< span class ="w "> </ span > < span class ="sd "> """Get the return address of the current function.</ span >
503506
504507< span class ="sd "> Args:</ span >
505508< span class ="sd "> target (ThreadContext): The target ThreadContext.</ span >
509+ < span class ="sd "> vmaps (list[MemoryMap]): The memory maps of the process.</ span >
506510
507511< span class ="sd "> Returns:</ span >
508512< span class ="sd "> int: The return address.</ span >
@@ -519,7 +523,12 @@ <h1>Source code for libdebug.architectures.amd64.amd64_stack_unwinder</h1><div c
519523 < span class ="k "> else</ span > < span class ="p "> :</ span >
520524 < span class ="n "> return_address</ span > < span class ="o "> =</ span > < span class ="n "> target</ span > < span class ="o "> .</ span > < span class ="n "> memory</ span > < span class ="p "> [</ span > < span class ="n "> target</ span > < span class ="o "> .</ span > < span class ="n "> regs</ span > < span class ="o "> .</ span > < span class ="n "> rsp</ span > < span class ="o "> +</ span > < span class ="mi "> 8</ span > < span class ="p "> ,</ span > < span class ="mi "> 8</ span > < span class ="p "> ,</ span > < span class ="s2 "> "absolute"</ span > < span class ="p "> ]</ span >
521525
522- < span class ="k "> return</ span > < span class ="nb "> int</ span > < span class ="o "> .</ span > < span class ="n "> from_bytes</ span > < span class ="p "> (</ span > < span class ="n "> return_address</ span > < span class ="p "> ,</ span > < span class ="n "> byteorder</ span > < span class ="o "> =</ span > < span class ="s2 "> "little"</ span > < span class ="p "> )</ span > </ div >
526+ < span class ="n "> return_address</ span > < span class ="o "> =</ span > < span class ="nb "> int</ span > < span class ="o "> .</ span > < span class ="n "> from_bytes</ span > < span class ="p "> (</ span > < span class ="n "> return_address</ span > < span class ="p "> ,</ span > < span class ="n "> byteorder</ span > < span class ="o "> =</ span > < span class ="s2 "> "little"</ span > < span class ="p "> )</ span >
527+
528+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="nb "> any</ span > < span class ="p "> (</ span > < span class ="n "> vmap</ span > < span class ="o "> .</ span > < span class ="n "> start</ span > < span class ="o "> <=</ span > < span class ="n "> return_address</ span > < span class ="o "> <</ span > < span class ="n "> vmap</ span > < span class ="o "> .</ span > < span class ="n "> end</ span > < span class ="k "> for</ span > < span class ="n "> vmap</ span > < span class ="ow "> in</ span > < span class ="n "> vmaps</ span > < span class ="p "> ):</ span >
529+ < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Return address not in any valid memory map"</ span > < span class ="p "> )</ span >
530+
531+ < span class ="k "> return</ span > < span class ="n "> return_address</ span > </ div >
523532
524533
525534 < span class ="k "> def</ span > < span class ="nf "> _preamble_state</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> :</ span > < span class ="n "> Amd64StackUnwinder</ span > < span class ="p "> ,</ span > < span class ="n "> instruction_window</ span > < span class ="p "> :</ span > < span class ="nb "> bytes</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="nb "> int</ span > < span class ="p "> :</ span >
0 commit comments