如果汇编代码跳转到包含错误指令的地址会怎样?
What happened if assembly code jump to a address contain bad instruction?
我想知道如果汇编代码跳转到包含错误指令的地址会发生什么情况?
我从 this blog 中读到,当 jmpq
跳转到包含错误指令的地址时。
机器通过根本不跳转并简单地执行下一条指令来响应(或者我误解了这个博客),例如:
jmpq abc
[ code ]
...
abc :
[ bad instruction ]
它会简单地执行 [ code ]
但是这个博客是关于 x86
指令集的。我想知道 arm
指令集发生了什么。
我问这个问题的原因是因为我最近在做一个基于 IL2CPP 的项目apk
,它被混淆了。
我反编译了一下,发现有很多bl
指令跳转到坏指令
我想知道如果他们跳转到错误指令或执行包含错误指令会发生什么。
ps : 我使用的反编译器是 Ghidra
比特就是比特。
处理器不可能知道某个地址指向错误指令。处理器非常愚蠢。他们做他们被告知的,他们被编程去做的。就像轨道上的火车,如果你碰巧在一个或两个轨道上留下一个空隙,或者轨道没有对齐,火车很可能会撞车。或者它可能会直立滚动,直到撞到房子或其他东西。
处理器(arm、intel 等是不相关的相同答案)将按照其规则(线性执行、分支等)获取它找到的下一个字节,并尝试将它们解码并作为指令执行。如果这些字节在无效指令中是“坏的”,那么 some/many/most 处理器将引发异常并执行每个 ISA 定义的解决方案(调用异常处理程序、挂起、重置等)。如果字节是坏的,而不是你想要的指令,但 bit/byte 模式恰好是一个有效的指令。它会执行它,因为处理器非常非常非常愚蠢,它们按照编程的方式执行,没有例外。
因此,如果...处理器将尝试执行发现的 bytes/bits,那么毫无疑问会发生什么,就像它对每个指令周期、分支或无分支所做的那样。如果编码的分支地址违反了 ISA,那么相同的答案将执行 ISA 为该错误定义的任何内容。
现在开始反汇编程序。任何可变长度指令集(肯定是 x86,带有 arm 和 thumb 的 ARM 以及 thumb2 也是一个问题)假设您无法反汇编并假设反汇编是错误的。非常非常少地相信看起来很糟糕或在杂草中消失的指令(bl 到不好的地方,bl 反汇编本身可能是问题而不是目的地)。处理可变长度指令集的唯一好方法是从已知的良好入口点反汇编,并在内存中以非线性的执行顺序进行反汇编。有了它,特别是对于 ARM,还有其他的,你最终会得到二进制文件的很大一部分,因为你不能静态地确定一些执行路径,你必须实际执行、模拟或作为一个人在视觉上被反汇编检查代码以找到一些执行路径。如果反汇编器和指令集导致无法使用的输出,则某些反汇编器比其他反汇编器和组合更差。使用 x86 代码很容易看到 gnu objdump 惨败。如果您知道自己在做什么,您可以使 objdump 输出绝对可怕(对于 x86),甚至远不接近正确。用拇指和拇指2 回答相同。 RISC-V等
我想知道如果汇编代码跳转到包含错误指令的地址会发生什么情况?
我从 this blog 中读到,当 jmpq
跳转到包含错误指令的地址时。
机器通过根本不跳转并简单地执行下一条指令来响应(或者我误解了这个博客),例如:
jmpq abc
[ code ]
...
abc :
[ bad instruction ]
它会简单地执行 [ code ]
但是这个博客是关于 x86
指令集的。我想知道 arm
指令集发生了什么。
我问这个问题的原因是因为我最近在做一个基于 IL2CPP 的项目apk
,它被混淆了。
我反编译了一下,发现有很多bl
指令跳转到坏指令
我想知道如果他们跳转到错误指令或执行包含错误指令会发生什么。
ps : 我使用的反编译器是 Ghidra
比特就是比特。
处理器不可能知道某个地址指向错误指令。处理器非常愚蠢。他们做他们被告知的,他们被编程去做的。就像轨道上的火车,如果你碰巧在一个或两个轨道上留下一个空隙,或者轨道没有对齐,火车很可能会撞车。或者它可能会直立滚动,直到撞到房子或其他东西。
处理器(arm、intel 等是不相关的相同答案)将按照其规则(线性执行、分支等)获取它找到的下一个字节,并尝试将它们解码并作为指令执行。如果这些字节在无效指令中是“坏的”,那么 some/many/most 处理器将引发异常并执行每个 ISA 定义的解决方案(调用异常处理程序、挂起、重置等)。如果字节是坏的,而不是你想要的指令,但 bit/byte 模式恰好是一个有效的指令。它会执行它,因为处理器非常非常非常愚蠢,它们按照编程的方式执行,没有例外。
因此,如果...处理器将尝试执行发现的 bytes/bits,那么毫无疑问会发生什么,就像它对每个指令周期、分支或无分支所做的那样。如果编码的分支地址违反了 ISA,那么相同的答案将执行 ISA 为该错误定义的任何内容。
现在开始反汇编程序。任何可变长度指令集(肯定是 x86,带有 arm 和 thumb 的 ARM 以及 thumb2 也是一个问题)假设您无法反汇编并假设反汇编是错误的。非常非常少地相信看起来很糟糕或在杂草中消失的指令(bl 到不好的地方,bl 反汇编本身可能是问题而不是目的地)。处理可变长度指令集的唯一好方法是从已知的良好入口点反汇编,并在内存中以非线性的执行顺序进行反汇编。有了它,特别是对于 ARM,还有其他的,你最终会得到二进制文件的很大一部分,因为你不能静态地确定一些执行路径,你必须实际执行、模拟或作为一个人在视觉上被反汇编检查代码以找到一些执行路径。如果反汇编器和指令集导致无法使用的输出,则某些反汇编器比其他反汇编器和组合更差。使用 x86 代码很容易看到 gnu objdump 惨败。如果您知道自己在做什么,您可以使 objdump 输出绝对可怕(对于 x86),甚至远不接近正确。用拇指和拇指2 回答相同。 RISC-V等