2017-01-12 7 views
0

アセンブリレベルで関数を検出するためにどのような関数プロパティを使用できるか尋ねます。私は既に静的解析から関数ブロックを持っています。例えば、ユーザーは関数を逆に開始し、アルゴリズム "A"の計算に使用され、保存することを決定します...そして、今からすべての関数を "A"同様のことが見つかった場合、比較的高い信頼度で、この関数はおそらくアルゴリズム「A」を計算していると言えるでしょう。例えばフローグラフ、システムコール、メモリ書き込みなどを使用できますか?答えをありがとう。アセンブリ関数の認識

+1

私は、あなたが実際に何回も実行されたことを認識することさえ困難であると思います。仮想マシンの中でそれを実行し、メモリアクセスのパターンとデータの変化の様子を観察すると、ソートなどの基本的なアルゴリズムが明らかになるかもしれませんが、IMOは醜い手書きのアセンブリを使用すると、 "それは機能の正確な評価されます。 :) IMOあなたは本当にどのパスが実行されるかを評価するのは難しい(NPの問題)でしょう。 – Ped7g

答えて

0

可能であれば、アセンブリコードを実行してエミュレータまたはシミュレータで実行し、ツールや独自のカスタムツールなどを使用して、機能やアルゴリズムを分析、認識、検出することができます。

アセンブリコードをお持ちの場合は、アセンブリコードからCコードを生成し、Cコードを解析することもできます。

これは、ご使用の環境と特定のアセンブリ言語によって異なる場合があります。

+0

私はそれを実行することはできません...しかし、デコンパイルソリューションは興味深いように聞こえますが、2つのC関数を比較すると、アセンブリレベルよりもはるかに簡単なことが想像できません。このアプローチの長所は何ですか? – Peter

+0

@Peterコードを実行できない場合、テストするのは難しいでしょう。 Cにはユニットテストフレームワークがあります。 [check](https://libcheck.github.io/check/)フレームワーク。同様の問題を解決しようとするなら、プログラムの仕様を検証する方法を調べると、プログラムが特定の仕様を満たしていることを証明する理論的な方法がある正式な検証も見ていきます。たぶん、いくつかのコードを投稿したり、環境や実際のコードに関する詳細や背景を記述したり、理論を学びたい場合は、仕様の検証を見ることができます。 –

1

手書きコードは大きな挑戦です。初期のスタンドアップアーケードゲームをリバースエンジニアリングしてみてください。

今日からコンパイルされたコードを取得すると、関数呼び出しを見るのがはるかに簡単になり、エントリポイントはすべて同じように見え、スタックフレームが前になり、関数の最後に戻り値(またはテール)最適化が難しいかもしれません)。

すべての関数が複数回呼び出されるわけではありませんが、関数を呼び出したとき(分岐/ジャンプと比較して)はコンパイルされたコードの場合はespです。スタックフレームがあり、スタックのクリーンアップとリターンの最後までのすべてのコードパスに従ってください(エントリポイントとリターンの1対1の一致が必要なわけではありません。いくつかの最適化は "function" )。

いくつかの関数は、スタックフレームが存在しないほど十分に小さいか、または最適化されています。アーキテクチャ、コンパイラ、コードなどによって異なります。したがって、アセンブリ呼び出しの宛先と戻りコードパスを確認する必要があります。残念ながら、すべての命令セットがクリーンであるとは限りません。たとえば、アームとサム命令のインターワークの仕方によっては、ARMを取ることができます。tell tell関数呼び出しである分岐リンクは、複数の命令で置き換えられる場合があります。 。またはgccが現在行っているように、リンク時にリンカーによって埋め込まれたコードへのリンクをブランチする可能性がありますが、それはbxを行いますが、トランポリンは本当に "関数"エントリーポイントではありません。同様に、もし親指と腕を相互に連動させるならば、腕の関数からの戻り値はスタックからgprへのポップではなく、lrへのポップではなくそのgprへのbxでもありません。 (いくつかのアーキテクチャのバージョンではlrがポップアップモードを変更するのをサポートしていますが、コンパイラを使ってそれを生成する必要があります)。

マシンコードレベルで唯一のことは、そのアーキテクチャの関数呼び出し命令と戻り命令です。逆コンパイルは楽しい言葉ですが、最適化が起こった場合、逆方向パスはそれが読めないほど最適化されていなくても、後退することはできません。あなたに多くのことを助けるつもりはありません。

関連する問題