0

Apple 組み込みの「otool」コマンドと「-Vvtd」スイッチを使用して、Mach-O i386 バイナリをダンプし、.s ファイルにリダイレクトしました。nasm および GAS アセンブラを使用して PPC マシンでコードを再コンパイルしようとしましたが失敗しました (gcc/darwin の i386 ディレクトリに "as"-binary があり、ppc ディレクトリにも "as"-binary があります)。出力は次のようになります。

some_topmost_label:
(__TEXT,__text) section
_default_pager:
00112000    pushl   %ebp
00112001    movl    %esp,%ebp
00112003    pushl   %edi
00112004    pushl   %esi
00112005    pushl   %ebx
00112006    subl    $0x3c,%esp
00112009    movl    _default_pager_internal_count,%ebx
0011200f    addl    _default_pager_external_count,%ebx
00112015    leal    0x00000004(,%ebx,4),%ebx

次のようなデータセクションもあります。

...

(__DATA,__data) section
00421000    02 00 00 00 04 00 00 00 00 40 00 00 28 64 65 66

...

00449bc0    50 00 3d 00 00 00 00 00 00 00 00 00 00 00 00 00 
00449bd0    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

...

私は PPC 上の Mac でバイナリを実行するつもりであるため、再コンパイルの作業が必要です。構文をより「AT&T」スタイルにするために、左端の列のアドレスを削除したり、残したりしようとしました。既存のコード構造を編集したくありません (これは厳密にはリバース エンジニアリングの取り組みではありません。それ自体は、ほんの一部のカスタマイズです)。ただし、編集を行う必要がある場合は、i386 用の既存の純粋なコードをそのまま PPC で実行するためだけに厳密に編集することを強く望んでいます。

私はあなたの助けに感謝します。

よろしく

4

2 に答える 2

4

アセンブリ言語では、すべての「ステートメント」は、プロセッサが実行できる命令です。命令は人間が読めるテキスト形式で表されますが (あなたが適切な種類の人間であれば)、アセンブリに存在するすべての命令名 (例: movl)、レジスタ (例: %esp)、およびメモリ参照 (例: 0x00000004(,%ebx,4)) は、アセンブリに直接対応します。プロセッサの実装の詳細。

したがって、すべてのプロセッサには独自のアセンブリ言語があります。ダンプして再組み立てしても、どこにも行きません。関連するプロセッサのセット内でさえありません-SSE3最適化を有効にしてコンパイルされた32ビットx86コードを取得してダンプすると、SSE3命令を含むアセンブリコードが得られます. 再アセンブルしても、少し古い x86-32 プロセッサで実行できるプログラムにはなりません。

実行可能ファイルが十分に古い場合、「ファット バイナリ」である可能性があります。PPC と x86 Mac の両方が Apple によってサポートされていた期間中、コンパイルされた PPC と x86 コードを 1 つのファイルにまとめていました。この回答から判断すると、コマンドでファットバイナリを検出できますfile

しかし、予想以上に多くの仕事をしなければならない可能性があります。

PPCには命令がありませんmovl(または他の種類の命令はありませんmov-ロードとストアを別々に処理します)。安全な賭けですが、 の%espような専用のスタック レジスタはありません。r1アドレッシングモードのようなものはありません0x00000004(,%ebx,4)-これは、レジスタを4倍してから定数4を追加するものです.PPCでは、1つの命令で定数を別のレジスタにロードしてから、シフト( *4= <<2)する必要があります。別の命令で登録し、それらの中間結果を 3 番目の命令で一緒に追加します。これは、命令が「ソース形式」または「バイナリ形式」で記述されているかどうかの問題ではありません。これは、元のコードの命令がPPCにまったく存在しないという問題です。

于 2015-04-22T01:02:41.890 に答える
1

逆コンパイラは、別のアーキテクチャ (私も試しました) でソースからコンパイルするために使用できる C ファイルを生成できます (私が試したように)。経験はせいぜい危険でした。私はまだそれに取り組んでおり、おそらくまだしばらく続くでしょう。

別の方法として、エミュレーションを実装して、ppc で i386 のバイナリ/実行可能ファイルを実行することができます。これは手っ取り早い方法ですが、効果が低い可能性があります。

さらに、(i386 バイナリを C に逆コンパイルし、ターゲット アーキテクチャで C を再コンパイルすることによって) C プログラミング言語を中間として使用するのではなく、アセンブリからアセンブリへのルートが最も困難なルートであることが確認されたように感じます。

逆コンパイルの場合: 25 万行のコードが生成される場合はどうなるでしょうか? チームが必要かもしれません:)

于 2015-04-22T01:52:21.403 に答える