アームで x86 バイナリ (.exe ファイルなど) を実行するにはどうすればよいですか?ウィキペディアにあるように、エミュレートされたプラットフォームのバイナリ データを、ターゲット プラットフォームでの実行に適したバイナリ データに変換する必要があります。 16進エディタでファイルを開いて変更する必要がありますか?それとも何か他のものですか?
3 に答える
これを成功させるには、2 つのことを行う必要があります.1 つは比較的簡単で、もう 1 つは非常に困難です。どちらも、16 進エディターで手動で行いたいものではありません。
マシン コードを x86 から ARM に変換します。各 x86 オペコードを 1 つ以上の ARM オペコードにマップできるはずなので、これは簡単です。これを行うにはさまざまな方法があり、他の方法よりも効率的な方法もありますが、非常に簡単なマッピングで行うことができます。
関数呼び出し (およびその他のジャンプ) を再マップします。オペコードをモンキーすると、ジャンプポイントとリターンポイントのすべてのオフセットが変更されるため、これは困難です。動的にリンクされたライブラリ (.so) があり、すべてのライブラリが両方の場所でまったく同じバージョンで利用可能であると想定している場合 (せいぜい大ざっぱな想定)、負荷を再マップする必要があります。
これは基本的にマシン -> マシン コンパイラおよびリンカーです。
それで、あなたはそれをすることができますか?もちろん。
易しいですか?いいえ。
そこに商用ツールがあるかもしれませんが、私はそれを認識していません。
バイナリでこれを行うことはできません。注1ここでのバイナリとはelfファイルのようにシンボル情報を持たないオブジェクトを意味します。elfファイルを使用しても、これは困難から不可能です。問題はdataからコードを決定することです。この問題を解決すれば、逆コンパイラやその他のツールを作成できます。
elfファイルがある場合でも、コンパイラはコードで使用される定数をtext
セグメントに挿入します。多くのオペコードを見て、基本ブロックを逆にして、関数の開始位置と終了位置を特定する必要があります。
より良いメカニズムは、ARMでx86をエミュレートすることです。ここでは、JITテクノロジを使用して変換を行うことができますが、コード スペースは約 2 倍になります。また、コードは恐ろしく実行されます。ARM には 16 個のレジスタがあり、x86 にはレジスタが不足しています (通常、隠しレジスタがあります)。コンパイラの大きな仕事は、これらのレジスタを割り当てることです。 これを実現するテクノロジーの 1 つです。x86からARMの方向に進むかどうかはわかりません。前述のように、それは大変な仕事をするでしょう。QEMU
注 1: x86 のオペコード サイズは非対称です。関数のプロローグとエピローグを認識するために 、画像を複数回スキャンする必要があります。これを行うには、画像のバイトがどこにあるのか、インライン アセンブラとアセンブラでコーディングされたライブラリ ルーチンで問題が発生する可能性があるような 問題になると思います。可能かもしれませんが、非常に難しいです。O(n!)
n
x86 バイナリ ファイルを utf-8 として読み取り、ELF から最後の文字までコピーします。次に、アーム バイナリに移動し、x86 でコピーするときに削除します。次に、クリップボードの x86 をヘッドにコピーします。