Android用のSMSボットの分析。 パートI

はじめに
作業の原理と興味深い機能を特定するためのsmsBot(Android)の分析。
ボットはAndroidプラットフォーム用に実装されており、アプリケーションを開くためのアルゴリズムは次のとおりです。
- APKファイルをダウンロードします。
- マニフェストファイルを抽出します。
- アプリケーションを読み取り可能なソースコードまたはバイトコードに逆コンパイルします。
- マニフェストとコードを分析します。
ツールキット:- Apktool-マニフェストとリソースを引き出すために使用します。
- Dex2jar-APKファイルをバイトコードに逆コンパイルします。
- Jd-gui-バイトコードを読み取り可能なコードに変換します。
マニフェストを知る
マニフェストを開いた後、すぐにシステムのアクセス許可に注意を向けました。これは、私にとってより興味深いように思えました。
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
そのため、ボットは電話の状態を読み取り、通話を処理し、USBフラッシュドライブに書き込み、SMSの書き込み/読み取り/受信/送信、連絡先データベースの読み取り、音声の録音を行います。 面白い...
次に、マニフェストについて。 次のコードが表示されます。 … <service android:name="com.soft360.iService.AService" android:enabled="true" android:exported="false" /> <service android:name="com.soft360.iService.webService" android:enabled="true" android:exported="false" /> <receiver android:name="com.soft360.iService.Alarm" android:enabled="true" android:exported="false" /> <receiver android:name="com.soft360.iService.AutoStart" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <activity android:theme="@*android:style/Theme.Translucent" android:name="com.BioTechnology.iClientsService.IncomingCallActivity" /> <receiver android:name="com.soft360.Receiver.MyPhoneReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> </receiver> <receiver android:name="com.soft360.web.MyAdmin" android:permission="android.permission.BIND_DEVICE_ADMIN"> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> <meta-data android:name="android.app.device_admin" android:resource="@layout/policies" /> </receiver> …
発表されたことがわかります:- AServiceおよびwebServiceサービス、
- レシーバーアラーム、AutoStart、MyPhoneReceiver(電話の状態を監視し、ほとんどの場合通話)、MyAdmin(ボットがデバイスを管理したい)。
マニフェストの分析はここで終了します。 リソースファイルに目を通しましたが、興味深いものは何も見つかりませんでした。 次に、結果のJavaコードの分析に進みましょう。
コードの分析
ボットは少なくとも19の主要な労働者階級で構成されています。 分析の結果、ボットの破壊活動に関与する最も基本的で興味深いクラスを特定しました。
- -AutoStart.java;
- -aService.java;
- -smsParser.java;
- -smsReciever.java;
- -webServiceRobot.java;
MainActivity.java
上記のクラスの分析を開始する前に、MainActivityクラスを見てみましょう。 そこで何が面白いか見てみましょう。
Intent localIntent1 = new Intent("android.provider.Telephony.SMS_RECEIVED"); localIntent1.setClass(this, SmsReciever.class); sendBroadcast(localIntent1); Intent localIntent2 = new Intent(this, AService.class); startService(localIntent2); Intent localIntent3 = new Intent(this, webService.class); startService(localIntent3);
ロードするとすぐに、ボットは次のことを試みます。
- すべての着信SMSをSmsReciverに送信します。
- AServiceおよびwebServiceを開始します。
さらに、コードから別の興味深いことがわかります。 Intent localIntent4 = new Intent("android.app.action.ADD_DEVICE_ADMIN"); localIntent4.putExtra("android.app.extra.DEVICE_ADMIN", this.compName); localIntent4.putExtra("android.app.extra.ADD_EXPLANATION", "Additional text explaining why this needs to be added."); startActivityForResult(localIntent4, 1);
ボットが自分自身を別のデバイス管理者として追加しようとしていることがわかります。
注意! 偽りの策略。さらにMainActivity.javaでは、ユーザーの目をそらすためにさまざまなテンプレートを起動し、すべての種類のモバイルの脆弱性と、おそらくは自己更新を電話でスキャンするアプリケーションを装います。 そして、この美しさはすべてポルトガル語で表されており、オーストラリアの銀行のようなものを示しています。
実際、電話のスキャン、証明書のダウンロードなどはありません。 暴力的な活動をシミュレートするダミーテンプレートのみが起動されます。 このようなダミーの例を次に示します。
private class template4_task extends AsyncTask<Void, Void, Void> { private template4_task() {} protected Void doInBackground(Void... paramVarArgs) { try { TimeUnit.SECONDS.sleep(5L); return null; } catch (InterruptedException localInterruptedException) { for (;;) { localInterruptedException.printStackTrace(); }
Asintaskが起動し、起動するだけのタイマーがあります... ...何もしません!
AutoStartレシーバー
このレシーバーは、電話をロードした直後に作業を開始し、MainActivityと同じアクションを開始します。
Intent localIntent = new Intent("android.provider.Telephony.SMS_RECEIVED"); localIntent.setClass(paramContext, SmsReciever.class); paramContext.sendBroadcast(localIntent); paramContext.startService(new Intent(paramContext, AService.class)); paramContext.startService(new Intent(paramContext, webService.class));
AServiceサービス
このサービスは、イベントをフィルタリングし、smsRecieverレシーバーを登録して起動します。smsRecieverレシーバーは、受信したすべてのSMSを受信して処理します(ただし、後で詳しく説明します)。
証拠は次のとおりです。
… final IntentFilter smsFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); … this.smsFilter.setPriority(999); this.smsReceiver = new SmsReciever(); registerReceiver(this.smsReceiver, this.smsFilter);
smsReceiverおよびsmsParser
それでは、ボットコードのさらに興味深い部分に移りましょう。 これはsmsReceiverレシーバーであり、SMS-okおよびWeb管理パネルからコードを識別するための別のクラスです。
以下は、smsReceiverから非常に簡略化されたコードです。
public void onReceive(Context paramContext, Intent paramIntent) { … for (;;) { … { smsParser localsmsParser = smsParser.getInstance(); localsmsParser.setSMSMessage(localSmsMessage.getMessageBody()); if (localsmsParser.isStartSMS()) { localdbActions.setStartSMS(); } … if (localsmsParser.isStopSMS()) { localdbActions.setStopSMS(); } else if (localsmsParser.isStartCALL()) { try { localdbActions.setStartCALL(); } … else if (localsmsParser.isStopCALL()) { try { localdbActions.setStopCALL(); } … else if (localsmsParser.isSmsList()) { localdbActions.sent_smslist_to_server(); } else if (localsmsParser.isCallList()) { localdbActions.sent_Call_Details(); } else if (localsmsParser.isStartRecord()) { if (webServiceRobot.AR != null) { try { webServiceRobot.AR.stop(); webServiceRobot.AR = null; return; } … if (localsmsParser.isStopRecord()) { localdbActions.setStopRecord(); if (webServiceRobot.AR == null) { break; } try { webServiceRobot.AR.stop(); webServiceRobot.AR = null; } … } if (localsmsParser.isSmsSend()) { localdbActions.SendSMS(localSmsMessage.getMessageBody()); } else if (localsmsParser.isContactList()) { localdbActions.sent_call_list_details(); } else { if (!localsmsParser.isWipeData()) { break label592; } localdbActions.make_wipe_data(); ... paramContext.startService(new Intent(paramContext, AService.class)); paramContext.startService(new Intent(paramContext, webService.class)); …
詳細なコメントは必要ないと思います。 コードは次のことを示しています。
- チェックボックスは、通話の録音を開始/停止するように設定されています。
- SMS送信;
- sms-okのリストを送信します。
- 通話リストの送信。
- マッシング情報など
localsmsParserは重要な要素です。 次に、smsParserクラスを見てみましょう。
private static final String COMMAND_GET_CALL_LIST = "call list"; private static final String COMMAND_GET_CONTACT_LIST = "contact list"; private static final String COMMAND_GET_SMS_LIST = "sms list"; private static final String COMMAND_PING = "ping"; private static final String COMMAND_SEND_SMS = "sendSMS"; private static final String COMMAND_START_RECORD = "start record"; private static final String COMMAND_STOP_RECORD = "stop record"; private static final String COMMAND_WIPE_DATA = "wipe data"; private static final String startCALL = "call start"; private static final String startSMS = "sms start"; private static final String stopCALL = "call stop"; private static final String stopSMS = "sms stop"; private static final String changeNUM = "change num"; private static final int COM_CALL_LIST = 6; private static final int COM_CONTACT_LIST = 10; private static final int COM_NULL = -1; private static final int COM_PING = 12; private static final int COM_SEND_SMS = 9; private static final int COM_SMS_LIST = 5; private static final int COM_START_CALL = 3; private static final int COM_START_RECORD = 7; private static final int COM_START_SMS = 1; private static final int COM_STOP_CALL = 4; private static final int COM_STOP_RECORD = 8; private static final int COM_STOP_SMS = 2; private static final int COM_WIPE_DATA = 11; private static smsParser parser = null;
これらの定数により、ボットが実行できる機能を理解できます。 同じコマンドが文字列とデジタル形式で提供されます。 ほとんどの場合、コマンドの発信元(SMSまたはインターネット)を確認します。
webServiceRobot
このクラスは、https要求を処理するという違いを除いてsmsReceiverに似ています。 ほとんどすべての同じアクションが実行されます。
- SMS送信;
- sms-okのリストを送信します。
- 通話リストの送信。
- マッシング情報など
さらに、デバイスに関する完全な情報をサーバーに送信します。
結論
さて、私たちがレビューしたコードの主要部分。 結論を導きましょう。 ボットは適切に作成され、非常に広範な機能を実行します。 実際、このボットの販売に関するフォーラムの1つからの広告:
拝啓、モバイルデバイス用のボットを提供できることを嬉しく思います。 現時点では、ボットはAndroidオペレーティングシステム用に実装されています。また、Blackberryの開発が本格化しており、最初のベータバージョンが来月になり、Blackberry上のAndroidボットのすべてのお客様に大幅な割引が適用されることをお知らせします。
それがどのように動作するかを簡単に説明します。知らない人のために、モバイルデバイスにインストールした後、アプリケーションは3gまたはwi-fiの存在下ですぐに便利なWebパネルをタップし、SMS(私は(ICCID +モデル電話)。 ボットは、システムに入った後、ユーザーが静かに電話を使い続け、通常モードですべての機能を使用できるように実装されています。 有名なPerkeleとは異なり、特定の数を傍受するためのシャープ化はありません。ボットはコマンドシステムを介して動作します。 コマンドは、インターネットを備えたWebパネルから、または管理番号からのSMSのいずれかで、便利な方法で提供されます。
機能:
- 被害者に関するすべての情報(電話番号、ICCID、IMEI、IMSI、モデル、OS)を取得する
- すべての着信SMSを傍受し、それらをWebパネルおよび制御番号に送信します。
- 任意の番号へのコール転送
- すべての着信および発信SMSを取得する
- すべての着信および発信通話を取得する
- オーディオファイルを録音し、サーバーに送信します(周囲で何が起こっているかを知っています)
- 所有者の知らないうちにSMSを任意の番号に送信する
- 便利なWebパネル
したがって、このソフトウェアは販売されており、ボットの価格は4kです。キットでは、サーバーに設定された管理パネル+ Web管理番号+ニーズに合わせて設計された独自のインターフェイスを備えた.apkファイルと、継続的な製品サポートを取得します。 また、レンタルとコラボレーションのオプションを一定の割合で検討する準備ができています(注射がなく、適用方法がわからない場合はノックしないでください)。 詳細については、PMで連絡先のジャバーを書いてください。GPGとOTRは不可欠です。
拝啓 AndroidでUPDATEが出ました。 すべての顧客が更新をタップし、新しい顧客を待っています。
新機能
- 現在、アプリケーションを削除するのは非常に困難です。 アプリケーションをインストールする際、ソフトウェアはデバイスの管理者の権利を要求します。所有者がデバイスの管理者に提供すると、アプリケーションはそれを非常に退屈に削除し、サービスが再起動し、このボットを失うことはありません。 提供しない場合、アプリケーションは通常どおり機能し続けます。 便宜上、管理者に許可が与えられているかどうかを示すインジケーターが管理パネルに表示されています。
- 管理者権限を付与している場合、工場出荷時設定へのコマンドで電話を破壊することが可能です
ウイルス対策ベンダーのSMSボット名:Trojan-Spy.AndroidOS.Zbot.a / Android.Smssniffer / Android / SpySMS / AndroidOS_SMSREP.B
Nabiev Nurlan(カザフスタン) 、
サイバー犯罪調査局 、PentestIT