【问题标题】:Assembly instruction which does not impact code execution不影响代码执行的汇编指令
【发布时间】:2022-01-23 03:16:41
【问题描述】:

我有一个名为“debugger”的小型命令行应用程序,它充当进程 A 的调试器。现在这个应用程序可以在 x86 和 x64 上正常工作。现在我必须将这个“调试器”迁移到 ARM64 架构。这个调试器非常简单地做的是附加断点,也就是将指令 int3(0xcc) 写入它在进程 A 的映射文件中找到的函数的开头。现在,每当我尝试通过这个“调试器”应用程序运行我的应用程序时,我都能够设置断点,但应用程序不断获得“access_violation”并剧烈崩溃。我的预感是,对于 ARM64 架构,我写到函数开头的指令“0xcc”会导致 access_violation。我尝试使用指令“0x150”、“0xF000”而不是“0xcc”。更多信息请参考我的earlier question

为了确保这是我想要添加一条不会以任何方式影响代码执行的指令的唯一问题,以便我可以确认唯一的问题是我在调试器代码中作为断点编写的指令。请帮助我缩小我的问题范围,并提供所有答案的链接。

【问题讨论】:

  • 0xCC 是 x86 指令。为什么你会期望它是work on ARM
  • @AlanBirtles 使用 armconverter.com/?code=NOP%0A 将 NOP 转换为十六进制,仍然获得相同的 access_violation。我如何确保十六进制转换完全正确,因为这样我将完全专注于其他事情。
  • @J... 正确,我知道这不是正确的指令,但其他指令也给了我同样的错误,所以我试图在这里隔离问题。
  • 如果你用一条什么都不做的指令覆盖了代码中的一条指令——它可能会做*某事*——,我只会崩溃。您必须使用导致陷阱的合法 arm64 指令进行覆盖,因此原始指令可以被陷阱处理程序替换以允许继续执行。

标签: assembly visual-studio-debugging access-violation arm64


【解决方案1】:

ARM64断点指令称为brk,通过引用Armv8 Architecture Reference Manualusing an ARM64 assembler,您可以看到它被编码为0xd4200000(一个4字节的字,小端,所以字节是0x00 0x00 0x20 0xd4)。

但是,如果您要成功移植调试器,您将需要更多关于 ARM64 架构的知识,而不仅仅是一条指令。

【讨论】:

  • 感谢您的回复 Nate,当我在调试器中遇到 brk 操作代码时,另一个快速的问题我想放回原始字节以便执行可以按预期运行,为此我想要将 Pc 寄存器(在函数开始处开始执行指令)减少到前一条指令。但是将 Pc 递减一次并不能完成这项工作,但将其递减 4 次就可以正常工作。是不是因为我写了 4 字节的操作码,Pc 必须减少 4 倍?
  • @arielBodyLotion:对,pc值是一个普通的地址,所以它的单位是字节,但是每条指令都是4字节长。所以是的,你必须减去 4 才能指向上一条指令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
相关资源
最近更新 更多