gpt4 book ai didi

汇编——机器码中的跳转指令

转载 作者:行者123 更新时间:2023-12-02 16:36:39 29 4
gpt4 key购买 nike

ji

为什么第 1B 行的跳转指令(例如)变成了 EBBD?

我知道“jmp”= EB但是BD是怎么计算的呢?

最佳答案

短跳转使用一个带符号的偏移量添加到 JMP 之后的指令地址。

例如,第一个 JMP L2 的偏移量为 FE,等于 -2,并将其添加到JMP 之后的指令为您提供了该 JMP 的地址。

但是,不是第一个 JMP L 的情况,因为那里需要的偏移量是 E8(第二个 JMP L 也不正确,它应该有偏移 E6)。如果您跳转到在线 x86 汇编程序站点(例如 this one),您可以确认这一点。并输入:

    mov ecx,2
l: mov edx,0
inc edx
sub ecx,1
nop
nop
nop
setz al
shl al,1
mov byte [l1+1],al
l1: jmp l
jmp l
mov byte [l2+1],al
l2: jmp l
jmp l2
mov eax,edx
ret

你会注意到那些额外的三个 NOP 行,它们是因为汇编程序选择了一个较短的 SUB ECX,1 变体,而我只想保留地址与你所拥有的一致。汇编出来的代码如下:

0:  b9 02 00 00 00          mov    ecx,0x2
00000005 <l>:
5: ba 00 00 00 00 mov edx,0x0
a: 42 inc edx
b: 83 e9 01 sub ecx,0x1
e: 90 nop
f: 90 nop
10: 90 nop
11: 0f 94 c0 sete al
14: d0 e0 shl al,1
16: a2 1c 00 00 00 mov ds:0x1c,al
0000001b <l1>:
1b: eb e8 jmp 5 <l>
1d: eb e6 jmp 5 <l>
1f: a2 25 00 00 00 mov ds:0x25,al
00000024 <l2>:
24: eb fe jmp 24 <l2>
26: eb fc jmp 24 <l2>
28: 89 d0 mov eax,edx
2a: c3 ret

很明显,您发布的代码中前两次 跳转的编码不正确。它们应该是 EbE8/EbE6 而不是 EBBD/EBEB。事实上,如果它们转到某个其他标签,后一对甚至没有意义,因为如果它们跳转到相同,它们之间的差异应该正好是两个em> 标签。


但是有一点需要注意:如果您仔细检查代码,您会发现它实际上是自修改的,因为 JMP 指令被修改为如下语句:

MOV BYTE [L1 + 1],  AL

(更改 L1 处指令的偏移量)。自修改代码可用于混淆目的,或使逆向工程软件变得困难,并且代码可能已经进行了将要应用的更改。

随着 self 更改进行以查看它们如何影响代码,动态地观察代码会很有用,但是我的静态分析的粗略结果如下:

Address  Effect
------- ------
00 ecx = 2
05 edx = 0
0a edx = 1
0b ecx = 1, zflag=F
11 al = 0 (because zflag=F)
14 al stays 0
16 instruction at 1b becomes eb00, jmp 1d
1b jumps to 1d
1d jumps to 0a
0a edx = 2
0b ecx = 0, zflag=T
11 al = 1 (because zflag=T)
14 al = 2
16 instruction at 1b becomes eb02, jmp 1f
1b jumps to 1f
1f instruction at 24 becomes eb02, jmp 28
24 jumps to 28
28 eax = 2
2a returns

基于此,L1 处的指令永远不应变为 EBBD(它只会更改为 EB00EB02) 所以你所拥有的很可能是文本的简单打印错误(特别是考虑到第二个 JMP L 中的错误,从未 修改过)。我猜作者并不比我们其他人更完美 :-)

关于汇编——机器码中的跳转指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62597760/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com