Assembly 有没有办法在gdb中找到特定汇编指令的所有示例?

Assembly 有没有办法在gdb中找到特定汇编指令的所有示例?,assembly,gdb,Assembly,Gdb,例如,我想找到内存中的每个jmp实例。有一种简单的方法可以做到这一点吗?您可以通过扫描目标进程的可执行内存页,查找可能以jmp()开头的初始字节,然后进行一些实际检查(例如,可疑命令指向的地址是否实际存在等),找到可能的X86jmp实例 然而,即使是这种方法也不能保证你能抓住它们™: 如果作者够刻薄,所讨论的程序可以在堆栈上生成代码,执行它,并在返回后立即擦除它 所以是的,@PeterCordes是对的:没有通用的方法可以做到这一点。但是,如果您确定不需要反调试技巧(并且您已经在计算机上安装了)

例如,我想找到内存中的每个jmp实例。有一种简单的方法可以做到这一点吗?

您可以通过扫描目标进程的可执行内存页,查找可能以
jmp
()开头的初始字节,然后进行一些实际检查(例如,可疑命令指向的地址是否实际存在等),找到可能的X86
jmp
实例

然而,即使是这种方法也不能保证你能抓住它们™: 如果作者够刻薄,所讨论的程序可以在堆栈上生成代码,执行它,并在返回后立即擦除它

所以是的,@PeterCordes是对的:没有通用的方法可以做到这一点。但是,如果您确定不需要反调试技巧(并且您已经在计算机上安装了),则可以简单地运行:

objdump -D /insert/executable/file/name.here -j .text -j .plt | grep -P $'^ *[0-9a-f]+:\t+([0-9a-f]{2} )+ +\t+jmp'

此命令对文件而不是内存进行操作,但它仍然可以提供所需的内容。

使用objdump转储可执行文件的内容如何?然后grep可以为您找到它们。不,没有,因为没有找到x86指令开始的通用方法。任何混淆技术都会使反汇编程序难以与执行保持同步。我想你说的是x86;如果没有,则适当标记。像AArch64这样的固定宽度指令集要容易得多,而且我确信有一些固定宽度的ISA,其中跳转指令使用
jmp
助记符。魔鬼在细节中,所以要理解您想要完成什么以及为什么,要想得到好的答案,需要走很长的路。我并不是说你的需要是不合法的,但当有人想要黑客时,我们社区中的许多人倾向于怀疑的一面,但对任何细节都非常回避。如果你告诉我们你为什么特别寻找
JMP
说明,你可能会得到更有用的答案。如果是您寻找的控制权转移,程序也可以使用
CALL
,或者-如果试图欺骗您-将
JMP x
隐藏为
PUSH x
+
RET