web-dev-qa-db-ja.com

ASMをCに変換(リバースエンジニアではない)

私はグーグルしました、そして基本的にそのような質問をするために要求者を笑いながら意外な量のばかげた応答を見ます。

Microchipはいくつかのソースコードを無料で提供しています(それがノーである場合に備えて、ここに投稿したくありません。基本的に、google AN937、最初のリンクをクリックすると、「ソースコード」へのリンクとそのzipファイルがあります)。 ASMにあり、私がそれを見ると、目を交差させ始めます。私はそれをCタイプ言語に似たものに変換して、後から理解できるようにしたいと考えています。次のような行のため:

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f

おそらく非常に単純ですが、私には何の意味もありません。

自動化されたASMからCへの変換プログラムがそこにあるかもしれませんが、私が見つけることができるのは、それを不可能だと言っている人々だけです。率直に言って、それが不可能であることは不可能です。どちらの言語にも構造があり、その構造は確実に翻訳できます。

23
Steven

アセンブラから絶対にCプログラムを作ることができます。問題は、それがあなたが考えているように見えないかもしれませんし、多分そうなるかもしれません。私のPICは錆びていますが、別のアセンブラを使用しています。

add r1,r2

Cでは、次のようになります

r1 = r1 + r2;

おそらくもっと読みやすいです。おそらく値がメモリからレジスタにジャンプして戻り、レジスタが再利用されているため、変数名の意味が失われます。 2つのレジスタがアキュムレータと別のレジスタを持っている古い写真について話している場合、変数はほとんどの部分がメモリ内にあるため、実際にはより簡単かもしれません。

q = mem[0x12];
e = q;
q = mem[0x13];
e = e + q;
mem[0x12] = e;

長く引き出されていますが、mem [0x12] = mem [0x12] + mem [0x13];であることは明らかです。

これらのメモリ位置は、レジスタの束を持つプロセッサのコンパイル済みCコードのようにジャンプしない変数である可能性があります。写真を使用すると、変数を把握しやすくなり、ファイル全体で変数に名前を付けるための検索と置換が容易になります。

探しているものは静的バイナリ変換と呼ばれ、必ずしも1つのバイナリから別のバイナリ(あるプロセッサから別のプロセッサ)への変換ではありませんが、この場合はpicバイナリからCへの変換です。理想的には、アプリノートを作成し、マイクロチップツールを使用してバイナリにアセンブルしてから、翻訳を行います。動的バイナリ変換も行うことができますが、それらの1つを見つける可能性はさらに低く、通常はCではなく、1つのバイナリから別のバイナリに変換されます。パックマンとガラガとのウォルマートでの$ 15ジョイスティックがどのように機能するのか不思議に思ったことはありませんか?アーケードからのromは、静的バイナリ変換を使用して変換され、最適化およびクリーンアップされ、Cまたはハンドヘルドボックスの新しいターゲットプロセッサ用にコンパイルされた中間言語です。私はそれらのすべてがこのように行われたわけではないと思いますが、いくつかはそうであったと確信しています。

百万ドルの質問、あなたは写真のための静的バイナリトランスレータを見つけることができますか?誰が知っているか、おそらく自分で作成する必要があります。つまり、逆アセンブラを記述し、add r0、r1のようなネイティブアセンブラ構文の命令に逆アセンブルする代わりに、逆アセンブラでr0 = r0 + r1を出力します。 picアセンブリ言語をよく知っているので、この逆アセンブラを終了する頃には、asmからCへのトランスレータは必要ありません。あなたは鶏と卵の問題を抱えています。

39
old_timer

コンパイルされたプログラムからまったく同じソースコードを取得することは、基本的に不可能です。しかし、逆コンパイラはコンピュータサイエンスの研究分野でした(例:PhDプロジェクトである dcc decompiler )。

アセンブリコードでパターンマッチングを実行して同等のCコードを生成するために使用できるさまざまなアルゴリズムがありますが、すべての入力に対して適切に機能する一般的な方法でこれを行うことは非常に困難です。

Boomerang をチェックして、汎用デコンパイラーでの最近のオープンソースの取り組みを確認することをお勧めします。

19
bobbymcr

できない決定論的にアセンブリコードをCに変換します。割り込み、自己変更コード、およびその他の低レベルのものは表現されませんCでのインラインアセンブリ以外。Cへのアセンブリプロセスが機能するのはある程度だけです。結果のCコードは言うまでもなく、実際にアセンブリコードを読み取るよりも理解するのはおそらく難しいでしょう。これをベースとして使用してCでのアセンブリコードの再実装を開始しない限り、多少便利です。 IDAのHex-Raysプラグインを確認してください。

私はかつて、知的財産の重要な部分がx86アセンブリコードでコード化されたいくつかの深刻なアルゴリズムであるプロジェクトで働いていました。コードを組み込みシステムに移植するために、そのコードの開発者(私ではありません)はMicroAPLと呼ばれる装置のツールを使用しました(私が正しく思い出せば)。

ツールがどれほどうまく機能しているかに、私は非常に驚きました。

一方、私はそれが「あなたが尋ねなければならないなら、あなたはそれを買う余裕がない」タイプのものの1つだと思います(プロジェクトの1回限りの変換の価格範囲は、処理されたアセンブリの約4行まで機能しますドル)。

しかし、多くの場合、ベンダーから入手したアセンブリルーチンは、Cから呼び出すことができる関数としてパッケージ化されています-ルーチンが(使用するプロセッサで)必要なことを実行している限り、アセンブルする必要があるだけです。多かれ少なかれそれらについては忘れてしまいます-それらはCから呼び出すライブラリ関数にすぎません。

7
Michael Burr

はい、アセンブラコードを高品質のCにリバースエンジニアリングすることは非常に可能です。

私は、アセンブラー・コードをCに変換するRelogixと呼ばれるツールを製造する会社であるMicroAPLで働いています。それは、他の投稿の1つで言及されました。

当社のWebサイトにある例をご覧ください。

http://www.microapl.co.uk/asm2c/index.html

7
Simon Marsden

自動化されたASMからCへのトランスレータがいくつかあるはずですが、私が見つけることができるのは、それを不可能だと言っている人々だけです。率直に言って、それが不可能であることは不可能です。

いいえ、ちがいます。コンパイルでは情報が失われます。最終的なオブジェクトコードには、Cソースコードよりも少ない情報があります。デコンパイラーは何もないところからその情報を魔法のように作成することはできないため、真の逆コンパイルは不可能です。

6
kquinn

それは不可能ではありません、非常に難しいです。熟練したアセンブリとCプログラマはおそらくそれを行うことができますが、 Decompiler を使用して調べることもできます。これらの一部は、asmをCに変換するのに非常に優れていますが、おそらくいくつかの変数とメソッドの名前を変更する必要があります。

X86アーキテクチャで利用可能な逆コンパイラのリストについては、 このサイト を確認してください。

4
a_m0d

99%の保証はありますが、このアセンブリ言語用のコンバーターは用意されていないので、作成する必要があります。 ASMコマンドをC関数に置き換えるだけで実装できます。

movf    BARGB2,w -> c_movf(BARGB2,w);
subwf   AARGB2,f -> c_subwf(AARGB2,f);

この部分は簡単です:)次に、各関数を実装する必要があります。レジスターをグローバルとして宣言して、物事を簡単にすることができます。また、関数ではなく、#definesを使用して、必要に応じて関数を呼び出すこともできます。これは、引数/結果の処理に役立ちます。

#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here

特殊なケースはASMディレクティブ/ラベルです。#definesでのみ変換できると思います。

楽しいのは、いくつかのCPU固有の機能に到達したときです。これは、スタック操作、特定のIO /メモリ操作を伴う単純な関数呼び出しの場合があります。より楽しいのは、計算に使用されるプログラムカウンターレジスターの操作、またはティック/レイテンシの使用/カウントです。

しかし、このハードコアが発生した場合、別の方法があります。それもハードコアです:) 動的再コンパイル というテクニックが存在します。多くの エミュレータ で使用されています。

ASMを再コンパイルする必要はありませんが、考え方はほとんど同じです。最初のステップからすべての#defineを使用できますが、必要な機能のサポートを追加します(PC/Ticksをインクリメントします)。また、メモリー/ IOマネージャーなど、コード用の仮想環境を追加する必要があります。

幸運を :)

3
zxcat

これをチェックしてください: decompiler

デコンパイラーは、コンパイラーの逆の操作を実行するコンピュータープログラムに付けられた名前です。つまり、比較的低いレベルの抽象化(通常、人間が読めるようにするのではなく、コンピュータが読めるように設計されている)の情報を含むファイルを、より高いレベルの抽象化(通常は人間が読めるように設計されている)の形式に変換します。

3

簡単にはできません。

読みやすさとは別に、ASMよりもCが優れている点の1つは、「巧妙な」プログラミングトリックを防止できることです。

Cに直接対応するものがない、またはCで複雑な構文を使用するアセンブラーで実行できることは多数あります。

他の問題は、ほとんどのアセンブラーが本質的に2つの交換可能なデータ型のみを持つデータ型です:バイトとワード。 intやfloatなどを定義するためのいくつかの言語構成要素があるかもしれませんが、メモリが定義どおりに使用されていることを確認する試みはありません。したがって、ASMストレージをCデータ型にマップすることは非常に困難です。

さらに、すべてのアセンブラストレージは基本的に「構造体」です。ストレージは、定義された順序でレイアウトされます(ランタイムの気まぐれにストレージが順序付けられるCとは異なります)。多くのASMプログラムは、正確なストレージレイアウトに依存しています。Cで同じ効果を得るには、すべてのストレージを単一の構造体の一部として定義する必要があります。

また、多くの乱用された命令があります(古くて世界的なIBMマンフレームでは、LA、ロードアドレス、命令は、高速でオーバーフローレジスタを必要としなかったため、単純な算術演算を実行するために定期的に使用されました)。

技術的にCに変換することは可能かもしれませんが、結果のCコードは、変換されたASMコードよりも読みにくくなります。

3
James Anderson

PIC Assemblyの本を手に取り、読むことを学ぶ方が簡単だと思います。アセンブラは、そのレベルが非常に低いため、一般に非常に簡単に習得できます。

1
jakobengblom2

関数をasmからCに変換することは困難ですが、手動で実行できます。デコンパイラーを使用してプログラム全体を変換すると、コンパイル中に構造の多くが失われるため、理解できないコードが生成されます。意味のある変数名と関数名がないと、結果のCコードを理解するのは非常に困難です。

0
Gerhard

チェックアウト asm2c

DOS/PMODEW 386 TASMアセンブリコードをCコードに変換するSwiftツール

0
franck