|
|
マルウェアの解析対策を無効にするAnti-Anti-Debuggingツールを開発
1. はじめに最近、業務でマルウェアを解析する機会が増えてきたのですが、最近のマルウェアはどれも様々な解析対策が施されており、数年前と比べて解析がやや面倒になっています。攻撃者はマルウェアの発見を困難にさせたり、セキュリティベンダーらによる解析を遅らせたりするため、エンコーディングやゴミコード挿入などによる難読化、コンポーネントや実態の多段化、デバッガ検出など、様々な解析対策を実装しています。 今回は、このデバッガ検出を無効にする方法を紹介します。
2. マルウェア解析とAnti-Debuggingマルウェアを解析する際は、デバッガを使って地道にアセンブリコードを追っていく事になります。デバッガでブレークやステップを繰り返し、フロー、API呼び出し、引数、データの流れなどを確認して行くのですが、その際、何度か先頭から再実行しなければならないという状況に遭遇します。たとえば、「この条件分岐で今度はこちらに飛ばしてみよう」といった場合や、ブレークする位置を間違えて遥か先まで実行させてしまった場合です。その際は、既に解析済みの所はスキップするため、適切な箇所でブレークポイントを設置して再度先頭から実行したりします。 しかし、マルウェアにデバッガ検出が実装されていると、解析者にとっては一手間発生します。デバッガ検出とは、自身がデバッガで解析されている場合、それを検知して本来とは異なる動作をさせるというものです。例えば、以下のような例が挙げられます。
このような処理は、Anti-Debuggingと呼ばれ、多くのマルウェアが実装しています。Anti-Debuggingのためのデバッガ検知は以下に示すように色々な方法があります。
(1)IsDebuggerPresent() Nicolas Falliere氏のテクニカルペーパー"Windows Anti-Debug Reference"に上記を含むさまざまな手法が紹介されていますので、興味のある方は参照してみてください。
"Windows Anti-Debug Reference" マルウェアが最も多く利用している手法は(1)、もしくは(2)の手法です。IsDebuggerPresent()は内部的に(2)と同じ動作をしているため、本質的には(2)の手法が最も利用されている事になります(IsDebuggerPresent() APIを利用せず、PEBのBeingDebuggedフラグを直接見に行くケースは最近かなり多くなっているようです)。このAnti-Debuggingを実装したマルウェアを解析する際は、マルウェアをデバッガで起動した直後にPEBのBegingDebuggedフラグをリセットする、あるいは、BegingDebuggedのチェックを行っている箇所で一旦ブレークして処理をスキップさせる必要があります。Anti-Debugging処理を発見できればどちらも技術的に難しくはありませんが、毎回の事になると少々面倒です。
>>3. Anti-Anti-Debugging
連載新着記事一覧へ >>
著者プロフィール鵜飼氏は,WinnyやMicrosoft製品,組込み機器などのセキュリティ・ホールを多数発見していることで知られるセキュリティの専門家。2003年から2007年7月まで米国に在住し,米eEye Digital SecurityのSenior Software Engineerを務める。2007年7月に帰国しフォティーンフォティ技術研究所を設立,取締役副社長最高技術責任者に就任。米国から執筆していたITpro Watcher「Security from USA」は,帰国にともない「Security from KAGURAZAKA」に改題した。 |