我如何在运行时确定 ASM 代码是 x86 中的 运行 还是 x64 中的 CPU?
How can I determine at runtime whether ASM code is running in x86 or x64 CPU?
我想写一些汇编代码,可以找出它 运行 是 x86 还是 x64 二进制文件(我想做这么奇怪的事情的原因是我会把这段代码注入任何给定二进制文件,当代码 运行s 时,它将确定它应该执行哪种系统调用以及 运行 那部分代码。没有恶意,只是在传递给之前的 "hello world"作为练习的实际入口点)。
反正我想到的一个'solution'是这样的:
- 读取通用寄存器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。我如何以独立于体系结构的方式编写该指令?或者我还有什么其他的解决方案可以达到这个效果?
(请不要提供开箱即用的解决方案,例如"you can determine the class of an executable by checking EI_CLASS offset of an ELF file"等)
可以简单很多,在32位代码中使用REX.W是一个DEC:
48 90
在 64 位代码中是:
rex.w nop ; still a nop
在 32 位代码中:
dec eax
nop
当然,在它前面加上 xor eax, eax
之类的东西。
我想写一些汇编代码,可以找出它 运行 是 x86 还是 x64 二进制文件(我想做这么奇怪的事情的原因是我会把这段代码注入任何给定二进制文件,当代码 运行s 时,它将确定它应该执行哪种系统调用以及 运行 那部分代码。没有恶意,只是在传递给之前的 "hello world"作为练习的实际入口点)。
反正我想到的一个'solution'是这样的:
- 读取通用寄存器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。我如何以独立于体系结构的方式编写该指令?或者我还有什么其他的解决方案可以达到这个效果?
(请不要提供开箱即用的解决方案,例如"you can determine the class of an executable by checking EI_CLASS offset of an ELF file"等)
可以简单很多,在32位代码中使用REX.W是一个DEC:
48 90
在 64 位代码中是:
rex.w nop ; still a nop
在 32 位代码中:
dec eax
nop
当然,在它前面加上 xor eax, eax
之类的东西。