Primer paso de la investigacion. Se aportan el .apk, las carpetas con el apk extraido y el apk descompilado. El archivo API_DOCUMENTATION.md es un archivo donde se anotaran los descubrimientos del funcionamiento de la API, y los .py son scripts para probar la funcionalidad de la API con los métodos que vayamos encontrando. Finalmente, los archivos .js son scripts de Frida para extraer informacion de la APP durante la ejecucion.
This commit is contained in:
@@ -0,0 +1,327 @@
|
||||
package com.google.firebase.messaging;
|
||||
|
||||
import C.t;
|
||||
import C.u;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.media.RingtoneManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.SystemClock;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.google.android.gms.cloudmessaging.CloudMessagingReceiver;
|
||||
import com.google.firebase.messaging.Constants;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public final class CommonNotificationBuilder {
|
||||
private static final String ACTION_RECEIVER = "com.google.android.c2dm.intent.RECEIVE";
|
||||
public static final String FCM_FALLBACK_NOTIFICATION_CHANNEL = "fcm_fallback_notification_channel";
|
||||
public static final String FCM_FALLBACK_NOTIFICATION_CHANNEL_LABEL = "fcm_fallback_notification_channel_label";
|
||||
private static final String FCM_FALLBACK_NOTIFICATION_CHANNEL_NAME_NO_RESOURCE = "Misc";
|
||||
private static final int ILLEGAL_RESOURCE_ID = 0;
|
||||
public static final String METADATA_DEFAULT_CHANNEL_ID = "com.google.firebase.messaging.default_notification_channel_id";
|
||||
public static final String METADATA_DEFAULT_COLOR = "com.google.firebase.messaging.default_notification_color";
|
||||
public static final String METADATA_DEFAULT_ICON = "com.google.firebase.messaging.default_notification_icon";
|
||||
private static final AtomicInteger requestCodeProvider = new AtomicInteger((int) SystemClock.elapsedRealtime());
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public static class DisplayNotificationInfo {
|
||||
public final int id;
|
||||
public final u notificationBuilder;
|
||||
public final String tag;
|
||||
|
||||
public DisplayNotificationInfo(u uVar, String str, int i) {
|
||||
this.notificationBuilder = uVar;
|
||||
this.tag = str;
|
||||
this.id = i;
|
||||
}
|
||||
}
|
||||
|
||||
private CommonNotificationBuilder() {
|
||||
}
|
||||
|
||||
private static PendingIntent createContentIntent(Context context, NotificationParams notificationParams, String str, PackageManager packageManager) {
|
||||
Intent createTargetIntent = createTargetIntent(str, notificationParams, packageManager);
|
||||
if (createTargetIntent == null) {
|
||||
return null;
|
||||
}
|
||||
createTargetIntent.addFlags(67108864);
|
||||
createTargetIntent.putExtras(notificationParams.paramsWithReservedKeysRemoved());
|
||||
if (shouldUploadMetrics(notificationParams)) {
|
||||
createTargetIntent.putExtra(Constants.MessageNotificationKeys.ANALYTICS_DATA, notificationParams.paramsForAnalyticsIntent());
|
||||
}
|
||||
return PendingIntent.getActivity(context, generatePendingIntentRequestCode(), createTargetIntent, getPendingIntentFlags(1073741824));
|
||||
}
|
||||
|
||||
private static PendingIntent createDeleteIntent(Context context, Context context2, NotificationParams notificationParams) {
|
||||
if (shouldUploadMetrics(notificationParams)) {
|
||||
return createMessagingPendingIntent(context, context2, new Intent(CloudMessagingReceiver.IntentActionKeys.NOTIFICATION_DISMISS).putExtras(notificationParams.paramsForAnalyticsIntent()));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static PendingIntent createMessagingPendingIntent(Context context, Context context2, Intent intent) {
|
||||
return PendingIntent.getBroadcast(context, generatePendingIntentRequestCode(), new Intent(ACTION_RECEIVER).setPackage(context2.getPackageName()).putExtra(CloudMessagingReceiver.IntentKeys.WRAPPED_INTENT, intent), getPendingIntentFlags(1073741824));
|
||||
}
|
||||
|
||||
public static DisplayNotificationInfo createNotificationInfo(Context context, NotificationParams notificationParams) {
|
||||
Bundle manifestMetadata = getManifestMetadata(context.getPackageManager(), context.getPackageName());
|
||||
return createNotificationInfo(context, context, notificationParams, getOrCreateChannel(context, notificationParams.getNotificationChannelId(), manifestMetadata), manifestMetadata);
|
||||
}
|
||||
|
||||
private static Intent createTargetIntent(String str, NotificationParams notificationParams, PackageManager packageManager) {
|
||||
String string = notificationParams.getString(Constants.MessageNotificationKeys.CLICK_ACTION);
|
||||
if (!TextUtils.isEmpty(string)) {
|
||||
Intent intent = new Intent(string);
|
||||
intent.setPackage(str);
|
||||
intent.setFlags(268435456);
|
||||
return intent;
|
||||
}
|
||||
Uri link = notificationParams.getLink();
|
||||
if (link != null) {
|
||||
Intent intent2 = new Intent("android.intent.action.VIEW");
|
||||
intent2.setPackage(str);
|
||||
intent2.setData(link);
|
||||
return intent2;
|
||||
}
|
||||
Intent launchIntentForPackage = packageManager.getLaunchIntentForPackage(str);
|
||||
if (launchIntentForPackage == null) {
|
||||
Log.w(Constants.TAG, "No activity found to launch app");
|
||||
}
|
||||
return launchIntentForPackage;
|
||||
}
|
||||
|
||||
private static int generatePendingIntentRequestCode() {
|
||||
return requestCodeProvider.incrementAndGet();
|
||||
}
|
||||
|
||||
private static Integer getColor(Context context, String str, Bundle bundle) {
|
||||
if (!TextUtils.isEmpty(str)) {
|
||||
try {
|
||||
return Integer.valueOf(Color.parseColor(str));
|
||||
} catch (IllegalArgumentException unused) {
|
||||
Log.w(Constants.TAG, "Color is invalid: " + str + ". Notification will use default color.");
|
||||
}
|
||||
}
|
||||
int i = bundle.getInt(METADATA_DEFAULT_COLOR, 0);
|
||||
if (i == 0) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return Integer.valueOf(D.h.getColor(context, i));
|
||||
} catch (Resources.NotFoundException unused2) {
|
||||
Log.w(Constants.TAG, "Cannot find the color resource referenced in AndroidManifest.");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/* JADX WARN: Multi-variable type inference failed */
|
||||
/* JADX WARN: Type inference failed for: r0v2, types: [int] */
|
||||
/* JADX WARN: Type inference failed for: r0v5 */
|
||||
/* JADX WARN: Type inference failed for: r0v6 */
|
||||
private static int getConsolidatedDefaults(NotificationParams notificationParams) {
|
||||
boolean z3 = notificationParams.getBoolean(Constants.MessageNotificationKeys.DEFAULT_SOUND);
|
||||
?? r02 = z3;
|
||||
if (notificationParams.getBoolean(Constants.MessageNotificationKeys.DEFAULT_VIBRATE_TIMINGS)) {
|
||||
r02 = (z3 ? 1 : 0) | 2;
|
||||
}
|
||||
return notificationParams.getBoolean(Constants.MessageNotificationKeys.DEFAULT_LIGHT_SETTINGS) ? r02 | 4 : r02;
|
||||
}
|
||||
|
||||
private static Bundle getManifestMetadata(PackageManager packageManager, String str) {
|
||||
try {
|
||||
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(str, 128);
|
||||
if (applicationInfo != null) {
|
||||
Bundle bundle = applicationInfo.metaData;
|
||||
if (bundle != null) {
|
||||
return bundle;
|
||||
}
|
||||
}
|
||||
} catch (PackageManager.NameNotFoundException e4) {
|
||||
Log.w(Constants.TAG, "Couldn't get own application info: " + e4);
|
||||
}
|
||||
return Bundle.EMPTY;
|
||||
}
|
||||
|
||||
@TargetApi(26)
|
||||
public static String getOrCreateChannel(Context context, String str, Bundle bundle) {
|
||||
String string;
|
||||
try {
|
||||
if (context.getPackageManager().getApplicationInfo(context.getPackageName(), 0).targetSdkVersion < 26) {
|
||||
return null;
|
||||
}
|
||||
NotificationManager notificationManager = (NotificationManager) context.getSystemService(NotificationManager.class);
|
||||
if (!TextUtils.isEmpty(str)) {
|
||||
if (notificationManager.getNotificationChannel(str) != null) {
|
||||
return str;
|
||||
}
|
||||
Log.w(Constants.TAG, "Notification Channel requested (" + str + ") has not been created by the app. Manifest configuration, or default, value will be used.");
|
||||
}
|
||||
String string2 = bundle.getString(METADATA_DEFAULT_CHANNEL_ID);
|
||||
if (TextUtils.isEmpty(string2)) {
|
||||
Log.w(Constants.TAG, "Missing Default Notification Channel metadata in AndroidManifest. Default value will be used.");
|
||||
} else {
|
||||
if (notificationManager.getNotificationChannel(string2) != null) {
|
||||
return string2;
|
||||
}
|
||||
Log.w(Constants.TAG, "Notification Channel set in AndroidManifest.xml has not been created by the app. Default value will be used.");
|
||||
}
|
||||
if (notificationManager.getNotificationChannel(FCM_FALLBACK_NOTIFICATION_CHANNEL) == null) {
|
||||
int identifier = context.getResources().getIdentifier(FCM_FALLBACK_NOTIFICATION_CHANNEL_LABEL, "string", context.getPackageName());
|
||||
if (identifier == 0) {
|
||||
Log.e(Constants.TAG, "String resource \"fcm_fallback_notification_channel_label\" is not found. Using default string channel name.");
|
||||
string = FCM_FALLBACK_NOTIFICATION_CHANNEL_NAME_NO_RESOURCE;
|
||||
} else {
|
||||
string = context.getString(identifier);
|
||||
}
|
||||
notificationManager.createNotificationChannel(new NotificationChannel(FCM_FALLBACK_NOTIFICATION_CHANNEL, string, 3));
|
||||
}
|
||||
return FCM_FALLBACK_NOTIFICATION_CHANNEL;
|
||||
} catch (PackageManager.NameNotFoundException unused) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static int getPendingIntentFlags(int i) {
|
||||
return i | 67108864;
|
||||
}
|
||||
|
||||
private static int getSmallIcon(PackageManager packageManager, Resources resources, String str, String str2, Bundle bundle) {
|
||||
if (!TextUtils.isEmpty(str2)) {
|
||||
int identifier = resources.getIdentifier(str2, "drawable", str);
|
||||
if (identifier != 0 && isValidIcon(resources, identifier)) {
|
||||
return identifier;
|
||||
}
|
||||
int identifier2 = resources.getIdentifier(str2, "mipmap", str);
|
||||
if (identifier2 != 0 && isValidIcon(resources, identifier2)) {
|
||||
return identifier2;
|
||||
}
|
||||
Log.w(Constants.TAG, "Icon resource " + str2 + " not found. Notification will use default icon.");
|
||||
}
|
||||
int i = bundle.getInt(METADATA_DEFAULT_ICON, 0);
|
||||
if (i == 0 || !isValidIcon(resources, i)) {
|
||||
try {
|
||||
i = packageManager.getApplicationInfo(str, 0).icon;
|
||||
} catch (PackageManager.NameNotFoundException e4) {
|
||||
Log.w(Constants.TAG, "Couldn't get own application info: " + e4);
|
||||
}
|
||||
}
|
||||
return (i == 0 || !isValidIcon(resources, i)) ? android.R.drawable.sym_def_app_icon : i;
|
||||
}
|
||||
|
||||
private static Uri getSound(String str, NotificationParams notificationParams, Resources resources) {
|
||||
String soundResourceName = notificationParams.getSoundResourceName();
|
||||
if (TextUtils.isEmpty(soundResourceName)) {
|
||||
return null;
|
||||
}
|
||||
if ("default".equals(soundResourceName) || resources.getIdentifier(soundResourceName, "raw", str) == 0) {
|
||||
return RingtoneManager.getDefaultUri(2);
|
||||
}
|
||||
return Uri.parse("android.resource://" + str + "/raw/" + soundResourceName);
|
||||
}
|
||||
|
||||
private static String getTag(NotificationParams notificationParams) {
|
||||
String string = notificationParams.getString(Constants.MessageNotificationKeys.TAG);
|
||||
if (!TextUtils.isEmpty(string)) {
|
||||
return string;
|
||||
}
|
||||
return "FCM-Notification:" + SystemClock.uptimeMillis();
|
||||
}
|
||||
|
||||
@TargetApi(26)
|
||||
private static boolean isValidIcon(Resources resources, int i) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean shouldUploadMetrics(NotificationParams notificationParams) {
|
||||
return notificationParams.getBoolean(Constants.AnalyticsKeys.ENABLED);
|
||||
}
|
||||
|
||||
/* JADX WARN: Multi-variable type inference failed */
|
||||
/* JADX WARN: Type inference failed for: r4v6, types: [C.s, java.lang.Object, C.v] */
|
||||
public static DisplayNotificationInfo createNotificationInfo(Context context, Context context2, NotificationParams notificationParams, String str, Bundle bundle) {
|
||||
String packageName = context2.getPackageName();
|
||||
Resources resources = context2.getResources();
|
||||
PackageManager packageManager = context2.getPackageManager();
|
||||
u uVar = new u(context2, str);
|
||||
String possiblyLocalizedString = notificationParams.getPossiblyLocalizedString(resources, packageName, Constants.MessageNotificationKeys.TITLE);
|
||||
if (!TextUtils.isEmpty(possiblyLocalizedString)) {
|
||||
uVar.f252e = u.b(possiblyLocalizedString);
|
||||
}
|
||||
String possiblyLocalizedString2 = notificationParams.getPossiblyLocalizedString(resources, packageName, Constants.MessageNotificationKeys.BODY);
|
||||
if (!TextUtils.isEmpty(possiblyLocalizedString2)) {
|
||||
uVar.f253f = u.b(possiblyLocalizedString2);
|
||||
?? obj = new Object();
|
||||
obj.f247b = u.b(possiblyLocalizedString2);
|
||||
uVar.e(obj);
|
||||
}
|
||||
uVar.f265u.icon = getSmallIcon(packageManager, resources, packageName, notificationParams.getString(Constants.MessageNotificationKeys.ICON), bundle);
|
||||
Uri sound = getSound(packageName, notificationParams, resources);
|
||||
if (sound != null) {
|
||||
Notification notification = uVar.f265u;
|
||||
notification.sound = sound;
|
||||
notification.audioStreamType = -1;
|
||||
notification.audioAttributes = t.a(t.e(t.c(t.b(), 4), 5));
|
||||
}
|
||||
uVar.f254g = createContentIntent(context, notificationParams, packageName, packageManager);
|
||||
PendingIntent createDeleteIntent = createDeleteIntent(context, context2, notificationParams);
|
||||
if (createDeleteIntent != null) {
|
||||
uVar.f265u.deleteIntent = createDeleteIntent;
|
||||
}
|
||||
Integer color = getColor(context2, notificationParams.getString(Constants.MessageNotificationKeys.COLOR), bundle);
|
||||
if (color != null) {
|
||||
uVar.f261q = color.intValue();
|
||||
}
|
||||
uVar.c(!notificationParams.getBoolean(Constants.MessageNotificationKeys.STICKY));
|
||||
uVar.f260o = notificationParams.getBoolean(Constants.MessageNotificationKeys.LOCAL_ONLY);
|
||||
String string = notificationParams.getString(Constants.MessageNotificationKeys.TICKER);
|
||||
if (string != null) {
|
||||
uVar.f265u.tickerText = u.b(string);
|
||||
}
|
||||
Integer notificationPriority = notificationParams.getNotificationPriority();
|
||||
if (notificationPriority != null) {
|
||||
uVar.f255j = notificationPriority.intValue();
|
||||
}
|
||||
Integer visibility = notificationParams.getVisibility();
|
||||
if (visibility != null) {
|
||||
uVar.f262r = visibility.intValue();
|
||||
}
|
||||
Integer notificationCount = notificationParams.getNotificationCount();
|
||||
if (notificationCount != null) {
|
||||
uVar.i = notificationCount.intValue();
|
||||
}
|
||||
Long l4 = notificationParams.getLong(Constants.MessageNotificationKeys.EVENT_TIME);
|
||||
if (l4 != null) {
|
||||
uVar.f256k = true;
|
||||
uVar.f265u.when = l4.longValue();
|
||||
}
|
||||
long[] vibrateTimings = notificationParams.getVibrateTimings();
|
||||
if (vibrateTimings != null) {
|
||||
uVar.f265u.vibrate = vibrateTimings;
|
||||
}
|
||||
int[] lightSettings = notificationParams.getLightSettings();
|
||||
if (lightSettings != null) {
|
||||
int i = lightSettings[0];
|
||||
int i4 = lightSettings[1];
|
||||
int i5 = lightSettings[2];
|
||||
Notification notification2 = uVar.f265u;
|
||||
notification2.ledARGB = i;
|
||||
notification2.ledOnMS = i4;
|
||||
notification2.ledOffMS = i5;
|
||||
notification2.flags = (notification2.flags & (-2)) | ((i4 == 0 || i5 == 0) ? 0 : 1);
|
||||
}
|
||||
uVar.d(getConsolidatedDefaults(notificationParams));
|
||||
return new DisplayNotificationInfo(uVar, getTag(notificationParams), 0);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user