今月はじめに我々は有料課金型のSMSトロイの木馬に関する記事を掲載した。「Trojan:Android/FakeNotify.A」として検出したものだ。現在、同トロイの木馬がアップデートされ、分析と検出をより厄介にする変更が加えられていることが分かっている。
署名証明書から分かるように、新バージョンは同じ開発者が作成したものだ。トロイの木馬の全体的なふるまいに変更は無いが、コーディングアプローチはかなり変わっており、静的解析ツールなどを失敗させるのに十分だ。
例えば分析中、私はオリジナルと現行バージョン双方からのSMS送信ルーチンを比較したが、以前のよりシンプルなコーディングアプローチがよりダイナミックになっていることに気づいた。
「FakeNotify」のオリジナルバージョンでは、ルーチンはそれが何であるか、非常に簡単に「読む」ことができる単純な方法で実装されていた:
FakeNotify.A
しかし新バージョンは、アナリストがコードを「読む」ことをより難しくするとともに、同じ目標を達成するためにJava言語のReflection/Dynamic Invocation機能を利用している。
開発者たちは、自身のエンコーディング/デコーディングアルゴリズムを使用して、ストリング引数を混乱させることによりさらに歩を進めている(これはシンプルな換字式的な暗号に過ぎないが)。以下でコード化されたフォームを見ることができる:
FakeNotify.B, SHA1: df866cf4312cf9c929a9a7dc384eebb19d2b2c2d
コーディングアプローチの変更は、大部分の静的解析ツールを容易に無効化することができる。
覚書:分析中、私は突然、Windows LoadLibraryとGetProcAddress combo API関数およびJava Reflectionのいくつかの機能との類似点に気づいた。他のAPI関数アドレス(Windows)およびクラス、もしくはObject handleのメソッド(Java)に関しては、双方とも開発者が最近獲得した方法もしくは関数をコールするか、実行することを可能にする。
いずれにせよ、Androidの世界に戻ろう。新たなFakeNotifyバージョンの分析を容易にするため、私はシンプルなPythonスクリプトを作成し、難読化されたストリングのインスタンスを、悪意あるアプリケーションでデコンパイルされているJavaソース全ての平文ものと入れ替えた。
パッチングの後、SMS送信ルーチンはclass SmsManagerとそのgetDefault method/functionのハンドリングを獲得し、その後、SmsManager classのsendTextMessageファンクションを使用するため、起動/コールされるか、適切に初期化される必要がある:
確かに、私がAndroidマルウェアによりJava Reflection機能が使用されるのを見たのは、これが初めてではないし、ストリングの難読化は複雑ではない。しかしこれはAndroidマルウェアの開発者が自分達の「製品」を最新にし、検出されないようにするため、その技術を次々と適応させ、アップグレードする方法のかなり明快な例と言える。
Threat Solutions post by — Jessie
署名証明書から分かるように、新バージョンは同じ開発者が作成したものだ。トロイの木馬の全体的なふるまいに変更は無いが、コーディングアプローチはかなり変わっており、静的解析ツールなどを失敗させるのに十分だ。
例えば分析中、私はオリジナルと現行バージョン双方からのSMS送信ルーチンを比較したが、以前のよりシンプルなコーディングアプローチがよりダイナミックになっていることに気づいた。
「FakeNotify」のオリジナルバージョンでは、ルーチンはそれが何であるか、非常に簡単に「読む」ことができる単純な方法で実装されていた:
FakeNotify.A
しかし新バージョンは、アナリストがコードを「読む」ことをより難しくするとともに、同じ目標を達成するためにJava言語のReflection/Dynamic Invocation機能を利用している。
開発者たちは、自身のエンコーディング/デコーディングアルゴリズムを使用して、ストリング引数を混乱させることによりさらに歩を進めている(これはシンプルな換字式的な暗号に過ぎないが)。以下でコード化されたフォームを見ることができる:
FakeNotify.B, SHA1: df866cf4312cf9c929a9a7dc384eebb19d2b2c2d
コーディングアプローチの変更は、大部分の静的解析ツールを容易に無効化することができる。
覚書:分析中、私は突然、Windows LoadLibraryとGetProcAddress combo API関数およびJava Reflectionのいくつかの機能との類似点に気づいた。他のAPI関数アドレス(Windows)およびクラス、もしくはObject handleのメソッド(Java)に関しては、双方とも開発者が最近獲得した方法もしくは関数をコールするか、実行することを可能にする。
いずれにせよ、Androidの世界に戻ろう。新たなFakeNotifyバージョンの分析を容易にするため、私はシンプルなPythonスクリプトを作成し、難読化されたストリングのインスタンスを、悪意あるアプリケーションでデコンパイルされているJavaソース全ての平文ものと入れ替えた。
パッチングの後、SMS送信ルーチンはclass SmsManagerとそのgetDefault method/functionのハンドリングを獲得し、その後、SmsManager classのsendTextMessageファンクションを使用するため、起動/コールされるか、適切に初期化される必要がある:
確かに、私がAndroidマルウェアによりJava Reflection機能が使用されるのを見たのは、これが初めてではないし、ストリングの難読化は複雑ではない。しかしこれはAndroidマルウェアの開発者が自分達の「製品」を最新にし、検出されないようにするため、その技術を次々と適応させ、アップグレードする方法のかなり明快な例と言える。
Threat Solutions post by — Jessie