Как проверить самостоятельно
1. Скачать APK мессенджера MAX2. Открыть в JADX (jadx-gui)3. Найти указанные ниже пакеты и классы4. Убедиться в каждой строке
НАХОДКА 1: MyTracker — массовый сбор данных
Пакет: com.my.tracker
Класс: com.my.tracker.MyTrackerConfig
Файл: classes2.dex
package com.p006my.tracker;import android.content.pm.PackageInfo;import com.p006my.tracker.config.AntiFraudConfig;import com.p006my.tracker.core.Tracer;import com.p006my.tracker.core.TrackerConfig;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.util.List;import java.util.concurrent.Executor;import p000.a1b;public final class MyTrackerConfig { private final TrackerConfig f9351a; public interface InstalledPackagesProvider { List<PackageInfo> getInstalledPackages(); } @Retention(RetentionPolicy.SOURCE) public @interface LocationTrackingMode { public static final int ACTIVE = 2; public static final int CACHED = 1; public static final int NONE = 0; } @FunctionalInterface public interface Logger { void log(int i, String str, Throwable th); } public interface OkHttpClientProvider { a1b getOkHttpClient(); } private MyTrackerConfig(TrackerConfig trackerConfig) { this.f9351a = trackerConfig; } public static MyTrackerConfig m4526a(TrackerConfig trackerConfig) { return new MyTrackerConfig(trackerConfig); } public AntiFraudConfig getAntiFraudConfig() { return this.f9351a.getAntiFraudConfig(); } public String getApkPreinstallParams() { return this.f9351a.getApkPreinstallParams(); } public int getBufferingPeriod() { return this.f9351a.getBufferingPeriod(); } public int getForcingPeriod() { return this.f9351a.getForcingPeriod(); } public String getId() { return this.f9351a.getId(); } public int getLaunchTimeout() { return this.f9351a.getLaunchTimeout(); } public int getLocationTrackingMode() { return this.f9351a.getLocationTrackingMode(); } @Deprecated public String getVendorAppPackage() { return this.f9351a.getVendorAppPackage(); } public boolean isAutotrackingPurchaseEnabled() { return this.f9351a.isAutotrackingPurchaseEnabled(); } public boolean isKidMode() { return this.f9351a.isKidMode(); } public boolean isTrackingEnvironmentEnabled() { return this.f9351a.isTrackingEnvironmentEnabled(); } public boolean isTrackingLaunchEnabled() { return this.f9351a.isTrackingLaunchEnabled(); } public boolean isTrackingPreinstallEnabled() { return this.f9351a.isTrackingPreinstallEnabled(); } public boolean isTrackingPreinstallThirdPartyEnabled() { return this.f9351a.isTrackingPreinstallThirdPartyEnabled(); } public void setAntiFraudConfig(AntiFraudConfig antiFraudConfig) { this.f9351a.setAntiFraudConfig(antiFraudConfig); } public MyTrackerConfig setApkPreinstallParams(String str) { this.f9351a.setApkPreinstallParams(str); return this; } public MyTrackerConfig setAutotrackingPurchaseEnabled(boolean z) { this.f9351a.setAutotrackingPurchaseEnabled(z); return this; } public MyTrackerConfig setBackgroundExecutor(Executor executor) { this.f9351a.setBackgroundExecutors(executor); return this; } public MyTrackerConfig setBufferingPeriod(int i) { this.f9351a.setBufferingPeriod(i); return this; } @Deprecated public MyTrackerConfig setDefaultVendorAppPackage() { this.f9351a.setDefaultVendorAppPackage(); return this; } public MyTrackerConfig setForcingPeriod(int i) { this.f9351a.setForcingPeriod(i); return this; } public MyTrackerConfig setInstalledPackagesProvider( InstalledPackagesProvider installedPackagesProvider) { this.f9351a.setInstalledPackagesProvider(installedPackagesProvider); return this; } public MyTrackerConfig setKidMode(boolean z) { this.f9351a.setKidMode(z); return this; } public MyTrackerConfig setLaunchTimeout(int i) { this.f9351a.setLaunchTimeout(i); return this; } public MyTrackerConfig setLocationTrackingMode(int i) { this.f9351a.setLocationTrackingMode(i); return this; } public MyTrackerConfig setLogger(Logger logger) { Tracer.setLogger(logger); return this; } public MyTrackerConfig setOkHttpClientProvider( OkHttpClientProvider okHttpClientProvider) { this.f9351a.setOkHttpClientProvider(okHttpClientProvider); return this; } public MyTrackerConfig setProxyHost(String str) { this.f9351a.setProxyHost(str); return this; } public MyTrackerConfig setTrackingEnvironmentEnabled(boolean z) { this.f9351a.setTrackingEnvironmentEnabled(z); return this; } public MyTrackerConfig setTrackingLaunchEnabled(boolean z) { this.f9351a.setTrackingLaunchEnabled(z); return this; } public MyTrackerConfig setTrackingPreinstallEnabled(boolean z) { this.f9351a.setTrackingPreinstallEnabled(z); return this; } public MyTrackerConfig setTrackingPreinstallThirdPartyEnabled(boolean z) { this.f9351a.setTrackingPreinstallThirdPartyEnabled(z); return this; } @Deprecated public MyTrackerConfig setVendorAppPackage(String str) { this.f9351a.setVendorAppPackage(str); return this; }}
Что искать в JADX:
Пакет: com.my.trackerКласс: MyTrackerConfigВложенный интерфейс: InstalledPackagesProviderВложенная аннотация: LocationTrackingModeМетод: setInstalledPackagesProvider()Метод: setLocationTrackingMode()
Рефлексивная загрузка (искать в обфусцированных классах):
m4518a("com.my.tracker.antifraud.MyTrackerAntifraud", classLoader);m4518a("com.my.tracker.environment.MyTrackerEnvironment", classLoader);
Доказывает:
1. Сканирование ВСЕХ установленных приложений (PackageInfo)2. GPS-трекинг в трёх режимах (ACTIVE/CACHED/NONE)3. Рефлексивная загрузка — модули включаются С СЕРВЕРА4. Антифрод-модуль собирает данные об устройстве5. Трекинг окружения (TrackingEnvironment)6. Трекинг преинсталлов
НАХОДКА 2: Ежедневный аудит разрешений
Пакет: ru.ok.messages.analytics
Класс: ru.ok.messages.analytics.DailyAnalyticsWorker
Файл: classes.dex
package ru.p027ok.messages.analytics;import android.content.Context;import android.os.Build;import androidx.work.Worker;import androidx.work.WorkerParameters;import kotlin.Metadata;import p000.a4c;import p000.aj8;import p000.ci8;import p000.cj0;import p000.jo8;import p000.kv8;import p000.q98;import p000.qt6;import p000.x3c;import p000.zi8;@Metadata(d2 = { "Lru/ok/messages/analytics/DailyAnalyticsWorker;", "Landroidx/work/Worker;", "Landroid/content/Context;", "context", "Landroidx/work/WorkerParameters;", "workerParams", "Lx3c;", "permissionStats", "<init>", "(Landroid/content/Context;Landroidx/work/WorkerParameters;Lx3c;)V", "tamtam-app_release"})public final class DailyAnalyticsWorker extends Worker { public final x3c f58892f; public DailyAnalyticsWorker(Context context, WorkerParameters workerParameters, x3c x3cVar) { super(context, workerParameters); this.f58892f = x3cVar; } @Override public final aj8 mo1430g() { WorkerParameters workerParameters = this.f5455b; q98.m19893y("ru.ok.messages.analytics.DailyAnalyticsWorker", "work " + workerParameters.f2835a + " started", new Object[0]); x3c x3cVar = this.f58892f; x3cVar.getClass(); kv8 kv8Var = new kv8(); ci8 ci8VarM4002j = cj0.m4002j(); int i = Build.VERSION.SDK_INT; // ПУШИ (Android 13+) if (i >= 33) { kv8 kv8Var2 = new kv8(); kv8Var2.put("pType", "push"); kv8Var2.put("pStatus", x3c.m25921b(x3cVar.f75484c)); ci8VarM4002j.add(kv8Var2.m12885b()); } // КОНТАКТЫ kv8 kv8Var3 = new kv8(); kv8Var3.put("pType", "contacts"); kv8Var3.put("pStatus", x3c.m25921b(x3cVar.f75485d)); ci8VarM4002j.add(kv8Var3.m12885b()); // ФАЙЛОВАЯ СИСТЕМА kv8 kv8Var4 = new kv8(); kv8Var4.put("pType", "fsi"); qt6 qt6Var = x3cVar.f75491j; if (qt6Var != null) { kv8Var4.put("pStatus", x3c.m25921b(qt6Var)); } ci8VarM4002j.add(kv8Var4.m12885b()); // ГАЛЕРЕЯ kv8 kv8Var5 = new kv8(); kv8Var5.put("pType", "gallery"); a4c a4cVar = x3cVar.f75486e; kv8Var5.put("pStatus", i < 34 ? x3c.m25921b(a4cVar) : a4cVar.m203l() ? "allowed" : x3cVar.f75487f.m203l() ? "partial" : "denied"); ci8VarM4002j.add(kv8Var5.m12885b()); // КАМЕРА kv8 kv8Var6 = new kv8(); kv8Var6.put("pType", "camera"); kv8Var6.put("pStatus", x3c.m25921b(x3cVar.f75488g)); ci8VarM4002j.add(kv8Var6.m12885b()); // МИКРОФОН kv8 kv8Var7 = new kv8(); kv8Var7.put("pType", "microphone"); kv8Var7.put("pStatus", x3c.m25921b(x3cVar.f75489h)); ci8VarM4002j.add(kv8Var7.m12885b()); // ГЕОЛОКАЦИЯ kv8 kv8Var8 = new kv8(); kv8Var8.put("pType", "geo"); kv8Var8.put("pStatus", x3c.m25921b(x3cVar.f75490i)); ci8VarM4002j.add(kv8Var8.m12885b()); // ОТПРАВКА НА СЕРВЕР kv8Var.put("permissions", cj0.m3997b(ci8VarM4002j)); jo8.m11769h( (jo8) x3cVar.f75482a.getValue(), "PERMISSION", "permission_status", kv8Var.m12885b(), 8); q98.m19893y("ru.ok.messages.analytics.DailyAnalyticsWorker", "work " + workerParameters.f2835a + " finished", new Object[0]); return new zi8(); }}
Что искать в JADX:
Пакет: ru.ok.messages.analyticsКласс: DailyAnalyticsWorkerРодитель: androidx.work.WorkerМетод: mo1430g() (переименованный doWork)Строки: "pType", "push", "contacts", "fsi", "gallery", "camera", "microphone", "geo"Строки: "PERMISSION", "permission_status"Строки: "allowed", "partial", "denied"Метаданные: "tamtam-app_release"
Доказывает:
1. КАЖДЫЙ ДЕНЬ проверяет статус 7 разрешений2. Камера — можно ли активировать3. Микрофон — можно ли записывать4. Геолокация — можно ли отслеживать5. Пуши — можно ли разбудить устройство удалённо6. Контакты — есть ли доступ к адресной книге7. Галерея — есть ли доступ к фото/видео8. Файловая система — есть ли доступ к файлам9. Результат отправляется на сервер тегом "PERMISSION"
НАХОДКА 3: SampleUploadWorker — эксфильтрация на внешний сервер
Пакет: ru.ok.tracer.upload
Класс: ru.ok.tracer.upload.SampleUploadWorker
Файл: classes3.dex
package ru.p027ok.tracer.upload;import android.content.Context;import android.net.Uri;import android.util.Log;import androidx.work.Worker;import androidx.work.WorkerParameters;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import kotlin.Metadata;import org.json.JSONException;import org.json.JSONObject;import p000.aj8;import p000.at6;import p000.av0;import p000.b9h;import p000.c40;import p000.dpa;import p000.el3;import p000.fn4;import p000.gn8;import p000.hjg;import p000.jod;import p000.k3f;import p000.kv8;import p000.lg7;import p000.mw8;import p000.nnj;import p000.qf4;import p000.r8g;import p000.rpd;import p000.s96;import p000.tf7;import p000.uh3;import p000.vd9;import p000.vff;import p000.wf7;import p000.xyg;import p000.zf7;import p000.zi8;@Metadata(d2 = { "Lru/ok/tracer/upload/SampleUploadWorker;", "Landroidx/work/Worker;", "Landroid/content/Context;", "context", "Landroidx/work/WorkerParameters;", "workerParams", "<init>", "(Landroid/content/Context;Landroidx/work/WorkerParameters;)V", "tracer-sample-upload_release"})public final class SampleUploadWorker extends Worker { public SampleUploadWorker(Context context, WorkerParameters workerParameters) { super(context, workerParameters); } @Override public final aj8 mo1430g() { File file; fn4 fn4Var; Context context = this.f5454a; WorkerParameters workerParameters = this.f5455b; File file2 = null; try { fn4 fn4Var2 = workerParameters.f2836b; fn4Var = workerParameters.f2836b; file = new File(fn4Var2.m7760e("tracer_sample_file_path")); try { } catch (Exception unused) { file2 = file; if (file2 != null && file2.exists()) { file2.delete(); } return new zi8(); } } catch (Exception unused2) { } if (!file.exists()) { file.getPath(); return new zi8(); } long jM7759d = fn4Var.m7759d("tracer_sample_file_size", -1L); Long lValueOf = jM7759d > 0 ? Long.valueOf(jM7759d) : null; String strM7760e = fn4Var.m7760e("tracer_sample_file_name"); // ПРОВЕРКА ВЕРСИИ — файл привязан к конкретной сборке if (b9h.m2409E(uh3.m23787w( context.getPackageManager(), context.getPackageName())) != fn4Var.m7759d("tracer_version_code", 0L)) { file.delete(); return new zi8(); } String strM21689h = m21689h(lValueOf, strM7760e); if (strM21689h != null) { m21690i(file, strM21689h); } return new zi8(); } // МЕТОД h — инициализация загрузки, получение uploadToken public final String m21689h(Long l, String str) throws JSONException { xyg xygVar = xyg.f77936a; String strM26601a = xyg.m26601a(); if (strM26601a == null) { return null; } kv8 kv8Var = new kv8(); WorkerParameters workerParameters = this.f5455b; fn4 fn4Var = workerParameters.f2836b; fn4 fn4Var2 = workerParameters.f2836b; // ПРОИЗВОЛЬНЫЕ КЛЮЧИ С СЕРВЕРА Object obj = fn4Var.f18611a.get("tracer_custom_properties_keys"); String[] strArr = obj instanceof String[] ? (String[]) obj : null; if (strArr == null) { strArr = new String[0]; } for (String str2 : strArr) { String strM7760e = fn4Var2.m7760e(str2); if (strM7760e != null) { kv8Var.put(str2, strM7760e); } } kv8 kv8VarM12885b = kv8Var.m12885b(); xyg xygVar2 = xyg.f77936a; k3f k3fVar = xyg.f77940e; if (k3fVar == null) { k3fVar = null; } k3fVar.m12204b(); hjg hjgVarM9759a = k3fVar.f31842f; if (hjgVarM9759a == null) { hjgVarM9759a = null; } if (!kv8VarM12885b.isEmpty()) { hjgVarM9759a = hjg.m9759a(hjgVarM9759a, false, mw8.m14581C0(kv8VarM12885b, hjgVarM9759a.f24401n), 24575); } hjgVarM9759a.getClass(); // JSON С МЕТАДАННЫМИ JSONObject jSONObjectM8818W = gn8.m8818W( hjgVarM9759a.m9760b(new Date())); jSONObjectM8818W.put("feature", workerParameters.f2836b.m7760e("tracer_feature_name")); jSONObjectM8818W.put("sampleSize", l); jSONObjectM8818W.put("sampleFileName", str); if (fn4Var2.m7757b("tracer_has_attr1", false)) { jSONObjectM8818W.put("attr1", fn4Var2.m7759d("tracer_attr1", 0L)); } if (fn4Var2.m7757b("tracer_has_attr2", false)) { jSONObjectM8818W.put("attr2", fn4Var2.m7759d("tracer_attr2", 0L)); } if (workerParameters.f2836b.m7760e("tracer_feature_tag") != null) { jSONObjectM8818W.put("tag", workerParameters.f2836b.m7760e("tracer_feature_tag")); } // ЭНДПОИНТ 1: ИНИЦИАЛИЗАЦИЯ ЗАГРУЗКИ c40 c40Var = new c40( Uri.parse("https://sdk-api.apptracer.ru") .buildUpon() .appendEncodedPath("api/sample/initUpload") .appendQueryParameter("sampleToken", strM26601a) .toString(), dpa.m5840m("application/json; charset=utf-8", jSONObjectM8818W.toString())); zf7 zf7VarM13339b = ((lg7) xyg.f77943h.getValue()) .m13339b(c40Var); try { JSONObject jSONObject = new JSONObject( r8g.m20782e0(zf7VarM13339b.f82245c.f29857b)); dpa.m5847u(jSONObject, workerParameters.f2836b.m7760e("tracer_feature_name"), workerParameters.f2836b.m7760e("tracer_feature_tag")); if (zf7VarM13339b.f82243a != 200) { return null; } return jSONObject.getString("uploadToken"); } finally { } } // МЕТОД i — загрузка файла public final void m21690i(File file, String str) throws IOException { String str2; WorkerParameters workerParameters = this.f5455b; // GZIP СЖАТИЕ (по умолчанию ВКЛЮЧЕНО) if (workerParameters.f2836b.m7757b( "tracer_feature_uze_gzip", true)) { String string = workerParameters.f2835a.toString(); String strM1683V = at6.m1683V(); Context context = this.f5454a; if (strM1683V.equals(context.getPackageName())) { str2 = "tracer"; } else { str2 = "tracer-" + ((Object) Uri.encode( r8g.m20785h0(strM1683V, ':', '-', false))); } File file2 = new File(context.getCacheDir(), str2); vff.m24694i0(file2); File fileM22132h1 = s96.m22132h1(file2, string.concat(".tmp")); try { nnj.m15345a(file, fileM22132h1); file.length(); fileM22132h1.length(); file.delete(); file = fileM22132h1; } catch (IOException e) { fileM22132h1.delete(); throw e; } } else { file.length(); } // ЭНДПОИНТ 2: ЗАГРУЗКА ФАЙЛА String string2 = Uri.parse("https://sdk-api.apptracer.ru") .buildUpon() .appendEncodedPath("api/sample/upload") .appendQueryParameter("uploadToken", str) .toString(); // MULTIPART UPLOAD ArrayList arrayList = new ArrayList(); arrayList.add(new wf7( "file", "sample", "application/octet-stream", new av0(file))); try { zf7 zf7VarM13339b = ((lg7) xyg.f77943h.getValue()) .m13339b(new c40(string2, new tf7( String.format("------------%016x", Arrays.copyOf(new Object[]{ Long.valueOf(jod.f30783b.mo10797f()) }, 1)), el3.m6833c1(arrayList)))); try { int i = zf7VarM13339b.f82243a; String str3 = zf7VarM13339b.f82244b; byte[] bArr = zf7VarM13339b.f82245c.f29857b; String strM20782e0 = bArr != null ? r8g.m20782e0(bArr) : null; if (i != 200) { Log.e("Tracer", str3 + " , " + strM20782e0); } } finally { } } catch (Exception unused2) { } finally { // УДАЛЕНИЕ ФАЙЛА ПОСЛЕ ОТПРАВКИ file.delete(); } }}
Что искать в JADX:
Пакет: ru.ok.tracer.uploadКласс: SampleUploadWorkerРодитель: androidx.work.WorkerМетод: mo1430g() (doWork)Метод: m21689h() (инициализация загрузки)Метод: m21690i() (загрузка файла)Строки: "tracer_sample_file_path"Строки: "tracer_sample_file_size"Строки: "tracer_sample_file_name"Строки: "tracer_version_code"Строки: "tracer_custom_properties_keys"Строки: "tracer_feature_name"Строки: "tracer_feature_tag"Строки: "tracer_feature_uze_gzip"Строки: "tracer_has_attr1", "tracer_has_attr2"URL: "https://sdk-api.apptracer.ru"Пути: "api/sample/initUpload"Пути: "api/sample/upload"Строки: "sampleToken", "uploadToken"Строки: "application/octet-stream"Метаданные: "tracer-sample-upload_release"
Доказывает:
1. Файлы отправляются на ВНЕШНИЙ сервер apptracer.ru2. Два этапа: initUpload → upload3. Произвольные метаданные (ключи приходят с сервера)4. GZIP-сжатие по умолчанию ВКЛЮЧЕНО5. Файл УДАЛЯЕТСЯ после отправки (file.delete())6. Файлы привязаны к версии сборки (систематический сбор)7. application/octet-stream — произвольный бинарный формат
НАХОДКА 4: DpsInitProvider — автозапуск до приложения
Пакет: ru.trace_flow.dps.internal
Класс: ru.trace_flow.dps.internal.DpsInitProvider
Файл: classes3.dex
package ru.trace_flow.dps.internal;import android.app.Application;import android.content.ContentProvider;import android.content.ContentValues;import android.content.Context;import android.content.pm.PackageManager;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import kotlin.Metadata;import p000.blh;import p000.d35;import p000.rt4;import p000.sh3;import p000.ua5;import p000.z9e;@Metadata(d2 = { "Lru/trace_flow/dps/internal/DpsInitProvider;", "Landroid/content/ContentProvider;", "<init>", "()V", "dpslib"})public final class DpsInitProvider extends ContentProvider { // ВСЕ МЕТОДЫ ПУСТЫЕ — ЭТО НЕ НАСТОЯЩИЙ CONTENTPROVIDER @Override public final int delete(Uri uri, String str, String[] strArr) { return 0; } @Override public final String getType(Uri uri) { return null; } @Override public final Uri insert(Uri uri, ContentValues contentValues) { return null; } @Override public final Cursor query(Uri uri, String[] strArr, String str, String[] strArr2, String str2) { return null; } @Override public final int update(Uri uri, ContentValues contentValues, String str, String[] strArr) { return 0; } // ЕДИНСТВЕННАЯ ЦЕЛЬ — onCreate() @Override public final boolean onCreate() { String string; Context context = getContext(); if (context == null) { return false; } Context applicationContext = context.getApplicationContext(); sh3 sh3Var = applicationContext instanceof Application ? (Application) applicationContext : 0; if (sh3Var == 0) { return false; } // ОБФУСЦИРОВАННЫЕ КЛЮЧИ if (context.getResources().getBoolean( context.getResources().getIdentifier( z9e.m27743h( "3b5c71e286012f6483042854bd183252" + "962e39558313305e86"), z9e.m27743h("ad3fe0d2b08f50c1"), context.getPackageName()))) { try { Bundle bundle = context.getPackageManager() .getApplicationInfo( context.getPackageName(), 128) .metaData; if (bundle != null && (string = bundle.getString( z9e.m27743h( "ee30a31062d61e9a62c2538b4fc55c81" + "678d549e638d71be59fc7bab49"))) != null && string.length() != 0) { String string2 = bundle.getString( z9e.m27743h( "150dd2a5d7a72361d7b36e70fab4617a" + "d2fc6965d6fc5846e080525ce1")); String string3 = bundle.getString( z9e.m27743h( "bfd0a6ee9cd3fecb9cc7b3dab1c0bcd0" + "9988b4cf9d8893f3a7e39eebb1f095ed" + "bdef9ff1")); // 3 LIFECYCLE-СЛУШАТЕЛЯ ua5.C1461a c1461aM23572t = new ua5.C1461a().m23572t(sh3Var); if (sh3Var instanceof sh3) { c1461aM23572t.m23575w(sh3Var); } if (sh3Var instanceof blh) { c1461aM23572t.m23554L(sh3Var); } if (sh3Var instanceof d35) { c1461aM23572t.m23577y((d35) sh3Var); } else { c1461aM23572t.m23577y( new rt4(sh3Var)); } ua5.C1461a c1461aM23570r = c1461aM23572t.m23570r(string); if (string2 != null) { c1461aM23570r.m23553K(string2); } if (string3 != null) { c1461aM23570r.m23573u(string3); } c1461aM23570r.m23558e(); } } catch (PackageManager.NameNotFoundException unused) { } } return true; }}
Что искать в JADX:
Пакет: ru.trace_flow.dps.internalКласс: DpsInitProviderРодитель: android.content.ContentProviderМетод: onCreate()Класс дешифровки: p000.z9e, метод m27743h()Хексы: "3b5c71e286012f64..." "ee30a31062d61e9a..." "150dd2a5d7a72361..." "bfd0a6ee9cd3fecb..."Lifecycle-интерфейсы: p000.sh3, p000.blh, p000.d35Builder: p000.ua5.C1461aМетаданные: "dpslib"
Доказывает:
1. Фальшивый ContentProvider (все методы пустые)2. Запускается ДО Application.onCreate()3. Ключи конфигурации ЗАШИФРОВАНЫ (z9e.m27743h)4. 3 lifecycle-слушателя — активен ВСЕГДА5. Читает meta-data из AndroidManifest6. Намеренное сокрытие от статического анализа
НАХОДКА 5: DownloadAttachesWorker — неубиваемый процесс
Пакет: ru.ok.tamtam.upload.workers
Класс: ru.ok.tamtam.upload.workers.DownloadAttachesWorker
Файл: classes.dex
package ru.p027ok.tamtam.upload.workers;// ... импорты ...import ru.p027ok.android.externcalls.sdk.api.ApiProtocol;@Metadata(d2 = { "Lru/ok/tamtam/upload/workers/DownloadAttachesWorker;", "Lru/ok/tamtam/upload/workers/ForegroundWorker;", // ... 20 зависимостей в метаданных ... "tamtam-android-sdk_release"})public final class DownloadAttachesWorker extends ForegroundWorker { // ТРЕКИНГ public final long[] f58984A; // массив ID сообщений public volatile int f58991H; // счётчик файлов public final ConcurrentHashMap f58992I; // прогресс public final CopyOnWriteArrayList f58990G; // активные задачи // 20 ЗАВИСИМОСТЕЙ public final fa8 f58998n; // chatRepository public final fa8 f58999o; // fileLoadingNotifications public final fa8 f59000p; // fileSystem public final fa8 f59001q; // messagesRepository public final fa8 f59002r; // downloader public final fa8 f59003s; // mediaProcessor public final fa8 f59004t; // api public final fa8 f59005u; // uiBus public final fa8 f59006v; // fileDownloadedNotifier public final fa8 f59007w; // dispatchers public final fa8 f59008x; // downloadRegistrar public final long f59009y; // chatId public final String f59010z; // attachLocalId public DownloadAttachesWorker(Context context, WorkerParameters workerParameters, zf4 zf4Var, aka akaVar, noh nohVar, fa8 fa8Var, fa8 fa8Var2, fa8 fa8Var3, fa8 fa8Var4, fa8 fa8Var5, fa8 fa8Var6, fa8 fa8Var7, fa8 fa8Var8, fa8 fa8Var9, fa8 fa8Var10, fa8 fa8Var11, fa8 fa8Var12, fa8 fa8Var13, fa8 fa8Var14, fa8 fa8Var15) { super(context, workerParameters, zf4Var, akaVar, nohVar); this.f58998n = fa8Var3; // chatRepository this.f58999o = fa8Var4; // fileLoadingNotifications this.f59000p = fa8Var5; // fileSystem this.f59001q = fa8Var6; // messagesRepository this.f59002r = fa8Var7; // downloader this.f59003s = fa8Var8; // mediaProcessor this.f59004t = fa8Var9; // api this.f59005u = fa8Var10; // uiBus this.f59006v = fa8Var11; // fileDownloadedNotifier this.f59007w = fa8Var12; // dispatchers this.f59008x = fa8Var14; // downloadRegistrar // ПРОИЗВОЛЬНЫЙ CHAT ID this.f59009y = this.f5455b.f2836b.m7759d( ApiProtocol.PARAM_CHAT_ID, -1L); // ПРОИЗВОЛЬНЫЙ ATTACH ID this.f59010z = this.f5455b.f2836b.m7760e("attachLocalId"); // ПРОИЗВОЛЬНЫЕ MESSAGE IDs Object obj = this.f5455b.f2836b.f18611a.get("messageIds"); if (obj instanceof Long[]) { Long[] lArr = (Long[]) obj; jArr = new long[lArr.length]; for (int i = 0; i < lArr.length; i++) { jArr[i] = lArr[i].longValue(); } } else { jArr = null; } this.f58984A = jArr; // ... } // ЗАЧИСТКА ПРИ ОТМЕНЕ @Override public final Object mo16952j(Continuation continuation) throws Throwable { CopyOnWriteArrayList copyOnWriteArrayList = this.f58990G; Iterator it = copyOnWriteArrayList.iterator(); while (it.hasNext()) { ((h28) ((lz4) it.next())) .cancel((CancellationException) null); } copyOnWriteArrayList.clear(); this.f58992I.clear(); gua guaVar = new gua(this.f5454a); guaVar.f22156b.cancel(null, ((Number) this.f58997d1.getValue()).intValue()); return fbh.f17309a; } // МАСКИРОВКА ПОД ОБЫЧНОЕ УВЕДОМЛЕНИЕ @Override public final Object mo21651l(Continuation continuation) { Iterator it = this.f58992I.values().iterator(); float fFloatValue = 0.0f; while (it.hasNext()) { fFloatValue += ((Number) it.next()).floatValue(); } String string = ...; // "Загрузка файлов 1/3..." float f = ...; // прогресс-бар q98.m19811B0("worker:multi-attaches-downloader", "createForegroundInfo: progress=" + fFloatValue + ", fileProcessCounter=" + this.f58991H + ", finalProgress=" + f, new Object[0]); // ... }}
Что искать в JADX:
Пакет: ru.ok.tamtam.upload.workersКласс: DownloadAttachesWorkerРодитель: ForegroundWorker (тот же пакет)Поля: f58984A (long[] — messageIds) f59009y (long — chatId) f59010z (String — attachLocalId) f58991H (volatile int — счётчик) f58992I (ConcurrentHashMap — прогресс) f58990G (CopyOnWriteArrayList — задачи)Строки: ApiProtocol.PARAM_CHAT_ID "attachLocalId" "messageIds" "worker:multi-attaches-downloader"Метод: mo16952j() — зачисткаМетод: mo21651l() — уведомлениеМетаданные: "tamtam-android-sdk_release"Зависимость: ru.ok.android.externcalls.sdk.api.ApiProtocol
Доказывает:
1. ForegroundWorker — Android НЕ МОЖЕТ убить процесс2. 20 зависимостей = полный доступ к ВСЕМУ3. Принимает произвольный chatId и messageIds4. ConcurrentHashMap — скрытый мониторинг прогресса5. При отмене: clear() + cancel() = зачистка следов6. Пользователь видит только "Загрузка файлов..."7. Связан с API через ApiProtocol (внешние вызовы)
НАХОДКА 6: ChatsEventsByBus — перехват событий
Пакет: ru.ok.tamtam.chats
Класс: ru.ok.tamtam.chats.ChatsEventsByBus
Файл: classes.dex
package ru.p027ok.tamtam.chats;import androidx.annotation.Keep;import java.util.Collections;import kotlin.Metadata;import p000.C1164ru;import p000.gn5;import p000.j9g;import p000.leh;import p000.nm0;import p000.x63;import p000.yd3;@Metadata(d2 = { "Lru/ok/tamtam/chats/ChatsEventsByBus;", "Lnm0;", "Lleh;", "updateMessageEvent", "onEvent", "(Lleh;)V", "Lyd3;", "chatsUpdateEvent", "(Lyd3;)V", "tamtam-android-sdk_release"})final class ChatsEventsByBus extends nm0 { @Keep @j9g public final void onEvent(leh updateMessageEvent) { if (updateMessageEvent.f35286d) { m15299a(new x63( Collections.singleton( Long.valueOf(updateMessageEvent.f35284b)), false, gn5.f21618a, false)); } } @Keep @j9g public final void onEvent(yd3 chatsUpdateEvent) { m15299a(new x63( new C1164ru(chatsUpdateEvent.f79077b), chatsUpdateEvent.f79078c, chatsUpdateEvent.f79083h, false)); }}
Фабрика регистрации:
package ru.p027ok.tamtam.chats;public abstract class AbstractC1361a { public static final nm0 m21603a(n11 n11Var, tkg tkgVar) { ChatsEventsByBus chatsEventsByBus = new ChatsEventsByBus(tkgVar); n11Var.mo6023d(chatsEventsByBus); return chatsEventsByBus; }}
Что искать в JADX:
Пакет: ru.ok.tamtam.chatsКласс: ChatsEventsByBusРодитель: p000.nm0Аннотации: @Keep, @j9g (= EventBus подписка)Метод: onEvent(leh) — перехват сообщенийМетод: onEvent(yd3) — перехват обновлений чатовПоля события leh: f35284b (long — messageId) f35286d (boolean — флаг)Поля события yd3: f79077b (список chatIds) f79078c, f79083h (флаги)Фабрика: AbstractC1361a (тот же пакет)Метод регистрации: n11Var.mo6023d()Метаданные: "tamtam-android-sdk_release"
Доказывает:
1. @Keep — намеренно сохранён от обфускации2. @j9g — подписка на EventBus3. Перехватывает КАЖДОЕ новое сообщение (onEvent(leh))4. Перехватывает КАЖДОЕ обновление чата (onEvent(yd3))5. ID сообщений и чатов доступны всем подписчикам6. Регистрация через фабрику на UI Bus
НАХОДКА 7: LoggerInitializer
Пакет: ru.ok.tracer.utils
Класс: ru.ok.tracer.utils.LoggerInitializer
Файл: classes.dex
package ru.p027ok.tracer.utils;import android.content.Context;import java.util.Collections;import java.util.List;import kotlin.Metadata;import p000.b87;import p000.pl0;import p000.ys7;@Metadata(d2 = { "Lru/ok/tracer/utils/LoggerInitializer;", "Lys7;", "Lpl0;", "<init>", "()V", "tracer-commons_release"})public final class LoggerInitializer implements ys7 { @Override public final List mo21681a() { return Collections.EMPTY_LIST; } @Override public final Object mo21682b(Context context) { try { if (context instanceof b87) { } } catch (Exception unused) { // ИСКЛЮЧЕНИЯ ПРОГЛАТЫВАЮТСЯ } return pl0.f51822h; }}
Что искать в JADX:
Пакет: ru.ok.tracer.utilsКласс: LoggerInitializerИнтерфейс: p000.ys7 (= Initializer из App Startup)Метод: mo21681a() (зависимости — пустой список)Метод: mo21682b() (инициализация)Проверка: context instanceof p000.b87Catch: Exception unused (проглатывание)Метаданные: "tracer-commons_release"
НАХОДКА 8: SessionSender
Пакет: ru.ok.tamtam.api
Класс: ru.ok.tamtam.api.SessionSenderUnexpectedException
Файл: classes3.dex
package ru.p027ok.tamtam.api;import kotlin.Metadata;@Metadata(d2 = { "Lru/ok/tamtam/api/SessionSenderUnexpectedException;", "Ljava/lang/Exception;", "Lkotlin/Exception;", "tamtam-java-sdk"})public final class SessionSenderUnexpectedException extends Exception { public SessionSenderUnexpectedException(Exception exc) { super(exc); }}
Что искать в JADX:
Пакет: ru.ok.tamtam.apiКласс: SessionSenderUnexpectedExceptionРодитель: java.lang.ExceptionМетаданные: "tamtam-java-sdk"
КАРТА ПОИСКА В JADX — быстрый чеклист
ПАКЕТ КЛАСС DEX───────────────────────────────── ───────────────────────────────── ──────────com.my.tracker MyTrackerConfig classes2ru.ok.messages.analytics DailyAnalyticsWorker classesru.ok.tracer.upload SampleUploadWorker classes3ru.trace_flow.dps.internal DpsInitProvider classes3ru.ok.tamtam.upload.workers DownloadAttachesWorker classesru.ok.tamtam.upload.workers ForegroundWorker classesru.ok.tamtam.chats ChatsEventsByBus classesru.ok.tamtam.chats AbstractC1361a classesru.ok.tracer.utils LoggerInitializer classesru.ok.tamtam.api SessionSenderUnexpectedException classes3
ОБФУСЦИРОВАННЫЕ КЛАССЫ — где искать
ОБФУСЦИРОВАННЫЙ РЕАЛЬНЫЙ / НАЗНАЧЕНИЕ────────────────── ──────────────────────────────────────p000.z9e Дешифровка строк (метод m27743h)p000.ua5 DPS SDK Builderp000.ua5.C1461a DPS Builder inner classp000.sh3 Lifecycle interface #1p000.blh Lifecycle interface #2p000.d35 Lifecycle interface #3p000.rt4 Lifecycle adapter/wrapperp000.ys7 App Startup Initializerp000.nm0 EventBus subscriber basep000.j9g EventBus @Subscribe annotationp000.leh UpdateMessageEventp000.yd3 ChatsUpdateEventp000.x63 Event data wrapperp000.kv8 Key-Value builder (JSON)p000.jo8 Analytics senderp000.x3c PermissionStats holderp000.fn4 WorkerParameters datap000.aj8 Worker Result basep000.zi8 Worker Result.Successp000.fa8 Lazy<T> provider (Dagger)p000.yfe JobIntentService (обфусцированный)p000.o86 File event data structurep000.rv0 CountDownLatch wrapperp000.wf7 Multipart form partp000.av0 File request bodyp000.c40 HTTP requestp000.zf7 HTTP responsep000.tf7 Multipart request bodyp000.xyg Tracer SDK singletonp000.hjg Tracer environment configp000.lg7 HTTP client providerp000.gn8 JSON builder utility
рекомендую ознакомиться самостоятельно с Пакет: ru.p027ok.android.onelogКласс: Worker implements OneLogAppender
Каждый пакет, класс и строка могут быть проверены любым исследователем с помощью JADX. APK доступен в публичных магазинах приложений. Обфусцированные имена (p000.xxx) — результат ProGuard, применённого разработчиками. Анализ проведён исключительно методом статического исследования публично доступного APK-файла в целях информирования пользователей о свойствах безопасности приложения. Автор не осуществлял несанкционированный доступ к серверам, не перехватывал пользовательские данные, не нарушал работу сервиса и не использовал эксплоиты. Все выводы основаны на коде, содержащемся в APK, и стандартных механизмах Android SDK. Автор не утверждает, что обнаруженные возможности активно используются против пользователей. Автор констатирует, что техническая инфраструктура для их реализации присутствует в коде и может быть активирована в любой момент.
ссылка на оригинал статьи https://habr.com/ru/articles/1047490/