私は技術的な観点からリバースエンジニアリング手法に精通していますが、マルウェアやシェルコードにアプローチして分析するための優れた方法論を見つけたことはありません。マルウェアの分析の技術的な側面については何百ものチュートリアルを見つけましたが、実際のアプローチ方法についてはほとんど知りません。
私が探しているものを理解するのに役立ついくつかの質問:
main
から始めてそこから広がるのですか、それとももっと良い方法がありますか?どのように分析を開始しますか?あなたはメインから始めてそこから広がるのですか、それとももっと良い方法がありますか?
基本的な分析(動的および静的の両方)を使い始める-エクスポート、インポート、関数の使用、syscalls、winapi、mutex、dllの依存関係、文字列、およびそのいくつかのgreppingを列挙します。基本的なサンドボックスで動的分析を実行すると、部分的になり、多少間違っている可能性がありますが、executable/dllの主な機能のいくつかについていくつかの理論を思い付くことができます。
そうは言っても、Java/.netなどを話している場合はもちろん、それらを逆コンパイルしますが、そのような環境でマルウェアを使用する一般的な方法はありません。
疑わしい何かへの関数呼び出しを見つけた場合-execが重要なシステムファイル/レジストリ値に書き込もうとしたり、奇妙な名前のファイルをデプロイしたりするとします-心配する必要があります(または帽子の色に応じて幸せです:))
重要な機能、または興味のある特定の機能をどのように見つけて特定しますか?
文字列は役立つ場合があります-疑わしいものをcmd.exeで始まる文字列として見つけることができます...または、ホスト名、ユーザーとパスワードの組み合わせ、さらにはリソースハッカーとディペンデンシーウォーカーは、含まれているエクスポート、インポート、リソースを列挙するための基本的なツールです。最も重要な機能は、ほとんどの場合、IDAまたは同様の静的分析ツールでリバースエンジニアリングする必要があります。
高レベルの制御フローをどのように計画しますか?
上記のすべてが失敗した場合、IDAのグラフ作成機能は優れており、それに使用できます。
特定したヘルパールーチンをどのように管理しますか?ブックマークが不十分で、メモ帳が原始的すぎると私は思います。
IDAには、コメントシステム、色付けオプション、名前の変更などがあります。必要に応じて全体をグラフ化するプロセス全体については、Visioであっても、それが最も明確な方法です。
アセンブリコードの雪崩で迷子にならないようにするにはどうすればよいですか?
使用可能なコードのすべてをasmレベルでリエンジニアリングすることはほとんどありません。動的分析を行う方が効率的なものもあります(OllyとImmunityは素晴らしいです-Immunityは多くのひねりを加えたOllyフォークです)。それを理解するためにすべてのコードを逆にする必要はありません。 IDAで色分けしていて、既に反転したパーツの名前を常に「loc_402BBD」よりもわかりやすい名前に変更している
これらの種類のタスクに取り組むためのその他のトリック/ヒントはありますか?
私が気に入っている方法の1つは、APIモニタリングソフトウェアを使用することです。私のお気に入りは、Rohitab(google it)によるものです。問題のマルウェアをデバッグし、ソフトウェアで行われたAPI呼び出しを監視しながらステップスルーします。これにより、マルウェアの動作に関する多くの情報が提供されます。例:FileReadおよびFileWrite呼び出しを監視すると、マルウェアが作成または読み取るファイルがわかります。これはいくぶんグレーボックスの手法であり、純粋にリバースエンジニアリングではないことに注意してください。ただし、APIモニターで興味深いものを見つけた場合は、アセンブリのどの部分に興味深い部分があるかがわかります。
乾杯。
広告1:どのように始めればよいかは関係ありません。ほとんどの場合好みです。実際にコードをステップ実行することを検討する場合、他のオプションがないため、通常はmain()
から開始します。また、分析で何を意味するかが重要です。これがこの場合ステップしている場合、main()
が適切な選択です。
広告2:広告4を参照してください。
広告3:アセンブリで記述されている場合、ほとんどの場合、すべての関数に1つずつジャンプするメインブロックがあります。マルウェアは非常に多くの場合小さなソフトウェアであるため、Cで記述されている場合は、同様に使用されるメインブロックもあります。
広告4:すべてのアドレスを関数名にラベル付けする
広告5:広告4を参照
広告6:次のものを使用できます。
一般に、最も難しい部分は開始することですが、主要な部分が分析されると、コードの2番目の部分がより簡単になります。さまざまなコンパイラと言語、およびそれらがマシンコードを生成する方法を理解することで、実行がはるかに簡単になります。
また、コードフラグメントとコンパイラマシンコード出力のナレッジデータベースがあると、非常に役立ちます。これは長い道のりであり、frameworksを使用せずにこれを行うのは非常に困難です。特に、今日(新しいバージョン)のコンパイラは非常に多いため、これまでになく困難です。