相关疑难解决方法(0)

x86-32/x86-64多语言机器码片段,在运行时检测64位模式?

是否可以使用相同字节的机器代码来确定它们是以32位还是64位模式运行,然后执行不同的操作?

即写多语言机器代码.

通常,您可以在构建时使用#ifdef宏检测.或者在C中,您可以编写一个if()以编译时常量作为条件,并让编译器优化它的另一面.

这仅适用于奇怪的情况,例如代码注入,或只是为了查看是否可能.


另请参见:多语言ARM/x86机器代码,用于分支到不同的地址,具体取决于解码字节的架构.

x86 assembly

10
推荐指数
1
解决办法
789
查看次数

x86 32位操作码,在x86-x64中有所不同或完全删除

我在x86-x64中查找了维基百科的x86向后兼容性,它说:

x86-64完全向后兼容16位和32位x86代码.因为完整的x86 16位和32位指令集仍然在硬件中实现而没有任何干预仿真,现有的x86可执行文件运行时没有兼容性或性能损失而重新编码以利用处理器设计的新功能的现有应用程序可以实现性能改进.

所以我测试了一些指令,看看有些指令实际上产生完全不同的操作码(而不仅仅是应用前缀),例如:INC/DEC.看(x86):

\ x40 inc eax
\x48 dec eax

在x86-x64中组装相同的产品时:

\ xff\xc0 inc eax

\ xff\xc8 dec eax

我试图弄清楚其他指令的原因和更多例子,这些指令具有产生不同操作码的相同症状.我熟悉x86-x64中的push,pop,call,ret,enter和leave不可用32位.

x86 assembly x86-64 cpu-architecture opcode

8
推荐指数
2
解决办法
2286
查看次数

指令长度

我正在查看汇编中的不同指令,我对如何决定不同操作数和操作码的长度感到困惑.

这是你应该从经验中得知的东西,还是有办法找出哪个操作数/运算符组合占用了多少字节?

例如:

push %ebp ; takes up one byte
mov %esp, %ebp ; takes up two bytes
Run Code Online (Sandbox Code Playgroud)

所以问题是:

在看到给定的指令后,如何推断出其操作码需要多少字节?

x86 assembly instruction-set machine-code code-size

5
推荐指数
2
解决办法
3790
查看次数

为什么编译器将数据放在PE和ELF文件的.text(code)部分中,并且CPU如何区分数据和代码?

所以我参考这篇论文:

二进制搅拌:旧版x86二进制代码的自随机指令地址

https://www.utdallas.edu/~hamlen/wartell12ccs.pdf

代码与数据交织:由于性能原因,现代编译器在PE和ELF二进制文件的代码段中积极插入静态数据。在编译的二进制文件中,通常没有办法将数据字节与代码区分开。不经意地将数据与代码随机化会破坏二进制文件,从而给指令级随机化器带来困难。可行的解决方案必须以某种方式保留数据,同时随机化所有可访问的代码。

在此处输入图片说明

但我有一些问题:

  1. 如何提高程序速度?我只能想象这只会使cpu的执行更加复杂吗?

  2. CPU如何区分代码和数据?因为据我所知,除非有跳转类型的指令,否则cpu将以线性方式依次执行每个指令,那么cpu怎么知道代码中的哪些指令是代码,哪些指令是数据?

  3. 考虑到代码部分是可执行的,并且CPU可能会错误地将恶意数据作为代码执行,这对安全性是否非常不利?(也许攻击者将程序重定向到该指令?)

cpu x86 reverse-engineering elf compiler-optimization

5
推荐指数
1
解决办法
171
查看次数