进入 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。
在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。