AV対FakeAV

こんにちは、Habr。 LCのシニアウイルスアナリスト、Vyacheslav Zakorzhevskyにご連絡ください。 編集者は定期的な発表やその他の詩を書いていますが、ちょっとした技術資料であなたを驚かせる機会があります。

おそらく、ヘルパーが子孫を保護するチップがたくさんあることを誰もが知っているでしょう。 通常、彼らはアプリケーションが仮想マシンの下で実行されているかどうかを判断しようとし、ヒューリスティックまたはプロアクティブな保護などをバイパスします。 数日前に受信した最新のFakeAVで、ウイルス作成者がAV製品やサンドボックスなどをバイパスしようとする方法の簡単な例を作成することにしました。 私が調べたファイルで、奇妙な名前のエクスポートされた関数の呼び出しを見つけました:



画像

Hiewマルウェアのスクリーンショット



関数「antiemu33」の名前は、ANTiEMUlation-アンチエミュレーションを表しています。 スクリーンショットは、関数の結果が確認されることを示しています。 「0」に等しくない場合、マルウェアはさらに機能し続けます。 結果が「0」の場合、制御はプロセスを完了するコードに移されます。 IDAを使用して関数の内部を見てください。



画像

画面にはIDAのantiemu33が搭載されています



この手順では、かなりまれなAPI関数「ldap_count_references」がライブラリ「WLDAP32.dll」から呼び出されます。 そして、2つの可能なシナリオがあります。

1)何も起こらず、関数は制御を返し、antiemu33は「0」を返します。

2)例外がスローされ、アドレス0x401025で例外ハンドラが呼び出され、目的の「1」が返されます。



画像

IDA例外スロー



例外ハンドラーはC ++ try / catchを使用して設定され、IDAは画面上に構造全体を表示することでこれを静的に決定することさえできました。 したがって、攻撃者の計算は、一部のエミュレーターまたはヒューリスティックアナライザーがこのAPI関数の呼び出しまたは例外処理を誤って処理し、「0」が返されてファイルが完成することになります。

そして、別の反エミュレーションの別の例ですが、非常に新鮮なFakeAV。 以下にHiewのスクリーンショットを添付しましたが、カーソルは直接エントリポイントを指しています。



画像

エントリポイントからのFakeAVのスクリーンショット



順番に-EnumResourceTypesA関数が呼び出され、戻り値がゼロかどうかがチェックされます。 関数がゼロを返す場合、プログラムは無限ループに入ります。これは、明らかに、通常のシステムでは発生しません。 したがって、これは最初のアンチエミュレーションであり、非常に単純ですが、おそらく何かを回避できる可能性があります。 次に、GetLastError関数が呼び出され、戻り値が7ビット右にシフトされ、アドレス0x1003C9に追加されます。 次に、呼び出しを使用して、受信した値に従って遷移が実行されます。 GetLastError後のeaxの通常のマシンでは、シフト後は0x714、追加後は0xE、追加後は0x1003D7になります。 したがって、生きているシステムでは、このアドレスに移行されます。 また、ヒューリスティックアナライザーまたはエミュレーターがGetLastError呼び出しを適切に処理できなかった場合、アプリケーションは終了またはクラッシュします。



画像

IDAの同じFakeAVのスクリーンショット



しかし、これで終わりではありません。コードを見ると、EnumSystemLocalesA関数がさらに呼び出され、その後ExitProcessへの移行が実行されていることがわかります。 そして全体の秘trickは、最初のパラメーターがこの関数に渡されて、システムによって呼び出されるCALLBACK(LOCALE_ENUMPROC)を指すことです。 このコールバックでは、マルウェアの「ペイロード」全体が検出されます。 ここでも、マルウェア開発者は、API関数を処理するウイルス対策の不完全さに依存しています。



All Articles