为什么jmp语句之间可以有汇编代码?

Why can there be assembly code between a jmp statement?

有时我会看到由于 jmp 语句而永远无法到达的代码。

示例:

0004036F call program.48391
00040374 jmp program.40440
00040376 lea rdx,qword ptr ds:[stringaddress]
....
....
.... //code that does something else
....
....
00040440 mov ebx,0

这是怎么回事,为什么会有代码,它是如何到达的?

我的 x86 超级生锈,但作为一个可变长度的指令集,反汇编非常困难,并且应该期望一定比例的反汇编输出永远(完全)错误或在一段时间内(数字线性顺序的指令)。唯一正确的反汇编方法是按照执行顺序而不是线性内存顺序进行反汇编,但这会留下可能是真实代码的空白。无论如何,除非我的代码在功能上有问题,否则它仍然演示了如何使用跳转。

mov 0x4,%eax
jmp over
under:
  dec %eax
over:
  test %eax,%eax
  jne under

Disassembly of section .text:

0000000000000000 <.text>:
   0:   8b 04 25 04 00 00 00    mov    0x4,%eax
   7:   eb 02                   jmp    0xb
   9:   ff c8                   dec    %eax
   b:   85 c0                   test   %eax,%eax
   d:   75 fa                   jne    0x9

但是因为它是可变长度的,所以您可以拥有完美工作的代码,反汇编程序完全搞砸了。

mov 0x4,%eax
jmp over
.byte 0x22
under:
  dec %eax
over:
  test %eax,%eax
  jne under

0000000000000000 <.text>:
   0:   8b 04 25 04 00 00 00    mov    0x4,%eax
   7:   eb 03                   jmp    0xc
   9:   22 ff                   and    %bh,%bh
   b:   c8 85 c0 75             enterq [=11=]xc085,[=11=]x75
   f:   fa                      cli 

连0xc的着陆点都没有;因为他们向我展示了一个单字节指令,所以我将使用它:

mov 0x4,%eax
jmp over
.byte 0xfa
under:
  dec %eax
over:
  test %eax,%eax
  jne under

0000000000000000 <.text>:
   0:   8b 04 25 04 00 00 00    mov    0x4,%eax
   7:   eb 03                   jmp    0xc
   9:   fa                      cli    
   a:   ff c8                   dec    %eax
   c:   85 c0                   test   %eax,%eax
   e:   75 fa                   jne    0xa

实际指令的机器代码是相同的,所以反汇编错误的是正确生成的机器代码,只是反汇编程序搞砸了,因为它是按内存顺序而不是执行顺序反汇编的,这是一种非常常见的反汇编程序方法(有 semi-valid 个原因)。

在这种情况下,我不得不使用一些技巧来扰乱 gnu 反汇编程序,他们在二进制文件中的机器代码之外留下了面包屑,以使其更成功一些,但是如果您将反汇编程序放在更多的工作(我停止尝试这样一个简单的例子)。

mov 0x4,%eax
jmp over
.byte 0x22
under:
  dec %eax
over:
  test %eax,%eax
  jne under

0000000000000000 <under-0xa>:
   0:   8b 04 25 04 00 00 00    mov    0x4,%eax
   7:   eb 03                   jmp    c <over>
   9:   22                      .byte 0x22

000000000000000a <under>:
   a:   ff c8                   dec    %eax

000000000000000c <over>:
   c:   85 c0                   test   %eax,%eax
   e:   75 fa                   jne    a <under>

看来他们正在使用标签来重置反汇编程序。

mov 0x4,%eax
jmp over
.byte 0x22
/*under:*/
  dec %eax
over:
  test %eax,%eax
  .byte 0x75,0xFA /* jne under*/

0000000000000000 <over-0xc>:
   0:   8b 04 25 04 00 00 00    mov    0x4,%eax
   7:   eb 03                   jmp    c <over>
   9:   22 ff                   and    %bh,%bh
   b:   c8                      .byte 0xc8

000000000000000c <over>:
   c:   85 c0                   test   %eax,%eax
   e:   75 fa                   jne    a <over-0x2>

无论如何,希望玛格丽特的评论更有意义。