- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最佳答案
短跳转使用一个带符号的偏移量添加到 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
(它只会更改为 EB00
或 EB02
) 所以你所拥有的很可能是文本的简单打印错误(特别是考虑到第二个 JMP L
中的错误,从未 修改过)。我猜作者并不比我们其他人更完美 :-)
关于汇编——机器码中的跳转指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62597760/
我们都知道在x86 arch中,数据和代码混合在内存或磁盘中。但是怎么告诉他们呢? paper需要这个方法,我不期望100%的准确率。 80% 还可以,即使是一些想法也可以:) 最佳答案 统计确定哪些
我在 Google 上进行了大量研究,寻找一种可以将机器代码直接包含在汇编源文件中的方法。我没有任何运气。 我所说的“内联机器代码”的意思可能不清楚,所以让我为您提供一个我正在寻找的示例: ; her
我们都知道在x86 arch中,数据和代码混合在内存或磁盘中。但是怎么告诉他们呢? paper需要这个方法,我不期望100%的准确率。 80% 还可以,即使是一些想法也可以:) 最佳答案 统计确定哪些
汇编、机器码、字节码和操作码之间的实际关系是什么? 我已经阅读了大部分关于汇编和机器代码的 SO 问题,例如 this ,但它们太高级了,没有显示实际汇编代码转换为机器代码的示例。结果,我仍然不明白它
让 objdump 反汇编原始 x64 代码的正确架构是什么?你会认为-m x86-64应该通过阅读帮助来工作,但事实并非如此。我尝试了 cygwin64 版本: $ objdump --versio
有没有办法将 .NET 程序集编译成 native 代码(即 x86)输出,也就是说,没有 MSIL。 据我了解,如果您仅将 x86 指定为体系结构,这只会更改 PE header 以将其指向 JIT
对于此 C 源代码: int add(int a, int b) { return a + b; } ,用于 8086 的 Watcom C 编译器 (wcc -s -ms -os -0 prog.c
我是一名优秀的程序员,十分优秀!