@@ -435,13 +435,13 @@ <h1>Source code for libdebug.architectures.amd64.amd64_stack_unwinder</h1><div c
435
435
< span class ="kn "> from</ span > < span class ="nn "> typing</ span > < span class ="kn "> import</ span > < span class ="n "> TYPE_CHECKING</ span >
436
436
437
437
< 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 >
439
439
440
440
< 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 >
441
442
< span class ="kn "> from</ span > < span class ="nn "> libdebug.state.thread_context</ span > < span class ="kn "> import</ span > < span class ="n "> ThreadContext</ span >
442
443
443
444
444
-
445
445
< div class ="viewcode-block " id ="Amd64StackUnwinder ">
446
446
< a class ="viewcode-back " href ="../../../../libdebug.architectures.amd64.html#libdebug.architectures.amd64.amd64_stack_unwinder.Amd64StackUnwinder "> [docs]</ a >
447
447
< 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
484
484
< span class ="c1 "> # If we are in the prolouge of a function, we need to get the return address from the stack</ span >
485
485
< span class ="c1 "> # using a slightly more complex method</ span >
486
486
< 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 >
488
488
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 >
491
494
< 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 >
494
497
< span class ="p "> )</ span >
495
498
496
499
< span class ="k "> return</ span > < span class ="n "> stack_trace</ span > </ div >
497
500
498
501
499
502
< div class ="viewcode-block " id ="Amd64StackUnwinder.get_return_address ">
500
503
< 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 >
502
505
< span class ="w "> </ span > < span class ="sd "> """Get the return address of the current function.</ span >
503
506
504
507
< span class ="sd "> Args:</ span >
505
508
< span class ="sd "> target (ThreadContext): The target ThreadContext.</ span >
509
+ < span class ="sd "> vmaps (list[MemoryMap]): The memory maps of the process.</ span >
506
510
507
511
< span class ="sd "> Returns:</ span >
508
512
< 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
519
523
< span class ="k "> else</ span > < span class ="p "> :</ span >
520
524
< 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 >
521
525
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 >
523
532
524
533
525
534
< 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