进入 GDB 中的下一个分支指令

Step to Next Branching Instruction in GDB

在GDB中有没有办法继续执行直到到达分支指令?很像 WinDbg 的“ph”命令。如果没有,可以在 Python 中编写脚本吗?

我终于遇到了这个问题:

我能够修改那里的代码来创建我自己的“ph”命令:

import gdb

mips_branches = ["beq", "beqz", "bne", "bnez", "bgtz", "bltz", "bgez", "blez", "j", "jr", "jal", "jalr"]
arm_branches = ["b", "bl", "blx", "bx", "beq"]

class StepToNextBranch (gdb.Command):
    def __init__ (self):
        super (StepToNextBranch, self).__init__ ("ph", gdb.COMMAND_OBSCURE)

    def invoke (self, arg, from_tty):
        arch = gdb.selected_frame().architecture()

        while True:
            SILENT=True
            gdb.execute("nexti", to_string=SILENT)
            current_pc = int(gdb.selected_frame().read_register("pc"))
            disa = arch.disassemble(current_pc)[0]
            opcode = disa["asm"].split("\t")[0]
            if opcode in mips_branches or opcode in arm_branches:
                break

        gdb.execute("context")

StepToNextBranch()

我不像 MIPS 那样熟悉 ARM,所以我不确定这涵盖了所有内容。最后,我将添加 x86 分支指令。

此外,gdb.execute("context") 行是因为我使用 GEF