gdb 显示错误指令

逆向工程 艾达 安卓 数据库
2021-06-15 08:07:25

我调试android jni使用gdb有一个jni功能A(),我需要在breakpoint那里设置并逐步完成。我用 计算了地址module_base+offset,也就是0x99B62C7A,然后我尝试使用以下gdb命令验证它是否是正确的地址

display /5i 0x99B62C7A

它打印了一些意想不到的指令,这不同于IDA在此处输入图片说明

如果我在breakpoint那里放置一个并单击 UI 以触发breakpoint,则该过程会因SIGSEGV.

那么为什么gdb显示不同的指令呢?崩溃与错误指令有关吗?

1个回答

Ida 显示的指令是 Thumb 模式指令。验证这一点的最简单方法是检查地址——每条指令有 2 个字节。然而,Gdb 不知道这一点,并假设 4 字节 arm 指令。当一个对象有一个符号表时,gdb 可以从中检测到指令模式,但当它不能时会回退到默认模式。您可以更改此回退模式;set arm fallback-mode thumb应该做的伎俩。

这解释了 SIGSEGV 以及断点在 arm 和 thumb 模式下使用不同的操作码。