5

如何在 arm 上运行 x86 二进制文件(例如 .exe 文件)?正如我在 Wikipedia 上看到的,我需要将模拟平台的二进制数据转换为适合在目标平台上执行的二进制数据。但问题是:我怎么能做吗?我需要在十六进制编辑器中打开文件并更改?还是别的什么?

4

3 回答 3

5

要成功做到这一点,您必须做两件事.. 一件相对容易,一件非常困难。您不想在十六进制编辑器中手动执行这两个操作。

  1. 将机器代码从 x86 转换为 ARM。这很简单,因为您应该能够将每个 x86 操作码映射到一个或多个 ARM 操作码。有不同的方法可以做到这一点,有些方法比其他方法更有效,但可以通过非常简单的映射来完成。

  2. 重新映射函数调用(和其他跳转)。这很难,因为使用操作码会改变跳转和返回点的所有偏移量。如果您有动态链接库 (.so),并且我们假设所有库在两个地方都以完全相同的版本提供(充其量是粗略的假设),则您必须重新映射负载。

它本质上是一个机器->机器编译器和链接器。

那么,你能做到吗?当然。

这简单吗?不。

那里可能有一个商业工具,但我不知道。

于 2013-04-02T05:16:27.310 回答
2

你不能用二进制来做到这一点;note1这里的二进制是指没有符号信息的对象,如elf文件。即使有一个elf文件,这也很难甚至不可能。问题是从数据中确定代码。如果你解决了这个问题,那么你可以制作反编译器和其他工具。

即使您有一个elf文件,编译器也会在段中插入代码中使用的常量text。您必须查看许多操作码并执行反向基本块来确定函数的开始和结束位置。

更好的机制是在ARM上模拟x86。在这里,您可以使用JIT技术来做遇到的翻译,但您大约双倍的代码空间。此外,代码将执行得很糟糕。ARM 有 16 个寄存器,而 x86 寄存器匮乏(通常它有隐藏寄存器)。编译器的一项重要工作是分配这些寄存器。 是一种可以做到这一点的技术。我不确定它是否在x86ARM方向;如前所述,这将是一项艰巨的工作。QEMU

注 1: x86 具有不对称的操作码大小。为了识别功能序言 和结语,您必须多次扫描图像。要做到这一点,我认为问题可能是图像 O(n!)的字节在哪里n,然后你可能会遇到用汇编程序编码的内联汇编程序和库例程的问题。这也许是可能的,但这是非常困难的。

于 2013-04-02T13:48:09.180 回答
-1

将 x86 二进制文件读取为 utf-8,然后从 ELF 复制到最后一个字符。然后转到 arm 二进制文件并在使用 x86 复制时删除。然后将剪贴板中的 x86 复制到 head。我试过了,它正在工作。

于 2016-08-30T15:29:39.850 回答