如何获取间接调用地址?如何获取rcx中调用地址与返回地址?
嘿,针对你提到的逆向分析相关问题,我整理了具体的操作方法,结合x64架构(因为你提到了RCX寄存器)来讲解:
获取间接调用/分支的地址
间接调用通常有两种常见形式,对应的获取方法也不同:
- 内存间接调用:比如指令是
call qword ptr [rcx+0x18]或者jmp [rax]- 在调试器(比如x64dbg、GDB)里给这条指令下断点
- 运行到断点处时,先计算括号里的内存地址(比如RCX的值加上0x18)
- 查看该内存地址处的8字节(x64下是QWORD)数据,这个值就是间接调用/分支的目标地址
- 寄存器间接调用:比如指令是
call rcx或者jmp rdx
这种更直接,此时寄存器(RCX/RDX)里的值就是调用/分支的目标地址,直接查看寄存器的值即可
提取RCX寄存器中的调用目标地址
分两种场景:
- 如果是
call rcx这类指令:直接在调试器里查看RCX寄存器的当前值,这个值就是调用的目标地址。比如在x64dbg里用命令r rcx,或者在GDB里用p $rcx就能看到。 - 如果是
call qword ptr [rcx+0x20]这类内存间接调用:- 先获取RCX的当前值,比如RCX=0x00007FF6A1234567
- 计算偏移后的地址:0x00007FF6A1234567 + 0x20 = 0x00007FF6A1234587
- 查看这个内存地址处的QWORD数据,比如在x64dbg里用
d q 0x00007FF6A1234587,输出的第一个值就是调用目标地址
获取返回地址
返回地址是函数调用完成后要回到的指令地址,有两种常用查看方式:
- 调用指令执行后立即查看:当
call指令执行完毕的瞬间,栈顶(RSP寄存器指向的位置)存储的就是返回地址。比如在x64dbg里执行完call后,查看栈窗口的第一个QWORD,或者用命令d q [rsp];在GDB里用x/gx $rsp。 - 函数内部查看:大多数x64函数开头会有
push rbp; mov rbp, rsp的栈帧建立指令,此时返回地址存储在rbp+8的位置(因为push rbp把rbp压栈,占了8字节,所以返回地址在rbp的上方)。可以用命令d q [rbp+8](x64dbg)或者x/gx $rbp+8(GDB)来查看。
内容的提问来源于stack exchange,提问作者sarah123
相关产品推荐
相关产品推荐

