如何在运行时确定ASM代码是在x86还是x64 CPU中运行?

时间:2016-08-28 21:15:17

标签: linux assembly elf

我想编写一些汇编代码,可以找出它是运行在x86还是x64二进制文件中(我之所以要做这么奇怪的事情是因为我会在任何给定的二进制文件中注入此代码,并且当代码时运行时,它将确定它应该执行哪种系统调用并运行代码的那一部分。没有任何恶意,只是一个" hello world"在作为练习传递到实际入口点之前)。

无论如何,一个解决方案'我想到的是:

  • 读取通用寄存器X的堆栈指针
  • 推0
  • 读取指向GP寄存器Y的堆栈指针
  • 从X中减去Y(将结果存储在X中)
  • 弹出到Y(以修复堆栈)
  • X具有寄存器大小,相应地表现

这是我能得到的最接近的:

0:  54                      push   rsp
1:  54                      push   rsp
2:  5b                      pop    rbx
3:  58                      pop    rax
4:  48 29 d8                sub    rax,rbx <---
7:  83 f8 08                cmp    eax,0x8
a:  74 ??                   je     64_bit_code_addr

这会为x86生成相同的字节,但地址0x4处的0x48除外。如何以独立于架构的方式编写该指令?或者我可以用什么其他解决方案来实现这种效果?

(请不要提供开箱即用的解决方案,例如&#34;您可以通过检查ELF文件的EI_CLASS偏移量来确定可执行文件的类别&#34;等等。)

1 个答案:

答案 0 :(得分:2)

它可以更简单,使用那个在32位代码中的REX.W是DEC:

48 90

在64位代码中是:

rex.w nop   ; still a nop

和32位代码:

dec eax
nop

当然,在它之前加上xor eax, eax之类的东西。