如何在手臂上运行x86二进制文件(例如.exe文件)?正如我在维基百科上看到的,我需要将模拟平台的二进制数据转换为适合在目标平台上执行的二进制数据。但问题是:我怎么做?我需要在十六进制编辑器中打开文件并更改?或其他什么?
答案 0 :(得分:4)
要成功做到这一点,你必须做两件事......一件相对容易,一件非常难。您不想在十六进制编辑器中手动执行任何操作。
将机器代码从x86转换为ARM。这很简单,因为您应该能够将每个x86操作码映射到一个或多个ARM操作码。有不同的方法可以做到这一点,有些方法比其他方法更有效,但可以通过非常简单的映射来完成。
重新映射函数调用(和其他跳转)。这个很难,因为使用操作码进行修改会改变跳转和返回点的所有偏移。如果你有动态链接库(.so),并且我们假设所有库在两个地方都有完全相同的版本(最好是粗略的假设),你必须重新映射负载。
< / LI> 醇>它本质上是一台机器 - &gt;机器编译器和链接器。
那么,你能做到吗?肯定。
容易吗?否。
可能有一个商业工具,但我不知道。
答案 1 :(得分:2)
您不能使用二进制文件; note1 此处二进制表示没有符号信息的对象,如 elf < / em>文件。即使使用 elf 文件,也很难做到这一点。问题是从数据确定代码。如果您解决了这个问题,那么您可以制作反编译器和其他工具。
即使您没有 elf 文件,编译器也会插入text
段代码中使用的常量。您必须查看许多操作码并执行反向basic block以确定函数的开始和结束位置。
更好的机制是模拟 ARM 上的 x86 。在这里,您可以使用JIT技术进行所遇到的转换,但是您的代码空间大约是两倍。此外,代码将执行可怕。 ARM有16个寄存器,x86寄存器缺乏(通常它有隐藏的寄存器)。编译器的主要工作是分配这些寄存器。 QEMU
是一种可以做到这一点的技术。我不确定它是否进入 x86 到 ARM 方向;如上所述,这将是一项艰巨的工作。
注1: x86具有非对称操作码大小调整。为了识别function prologue和结尾,您必须多次扫描图像。要做到这一点,我认为问题将是类似 O(n!)
,其中n
是图像的字节,然后你可能遇到内嵌汇编程序和库的问题用汇编语言编写的例程。这可能是可能的,但是非常很难。
答案 2 :(得分:-1)
读取x86二进制文件为utf-8,然后从ELF复制到最后一个字符 。然后转到arm二进制并删除,当你用x86复制时。然后将x86复制到head.i试过,它正在工作