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:
2025-12-04 13:59:54 +01:00
parent f2fd1c3bf5
commit e0133d2ca2
10432 changed files with 1019085 additions and 1 deletions

View File

@@ -0,0 +1,180 @@
package com.google.firebase.messaging;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import com.google.android.gms.cloudmessaging.CloudMessage;
import com.google.android.gms.cloudmessaging.Rpc;
import com.google.firebase.messaging.Constants;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.concurrent.ExecutorService;
/* loaded from: classes3.dex */
public class FirebaseMessagingService extends EnhancedIntentService {
public static final String ACTION_DIRECT_BOOT_REMOTE_INTENT = "com.google.firebase.messaging.RECEIVE_DIRECT_BOOT";
static final String ACTION_NEW_TOKEN = "com.google.firebase.messaging.NEW_TOKEN";
static final String ACTION_REMOTE_INTENT = "com.google.android.c2dm.intent.RECEIVE";
static final String EXTRA_TOKEN = "token";
private static final int RECENTLY_RECEIVED_MESSAGE_IDS_MAX_SIZE = 10;
private static final Queue<String> recentlyReceivedMessageIds = new ArrayDeque(10);
private Rpc rpc;
private boolean alreadyReceivedMessage(String str) {
if (TextUtils.isEmpty(str)) {
return false;
}
Queue<String> queue = recentlyReceivedMessageIds;
if (!queue.contains(str)) {
if (queue.size() >= 10) {
queue.remove();
}
queue.add(str);
return false;
}
if (!Log.isLoggable(Constants.TAG, 3)) {
return true;
}
Log.d(Constants.TAG, "Received duplicate message: " + str);
return true;
}
private void dispatchMessage(Intent intent) {
Bundle extras = intent.getExtras();
if (extras == null) {
extras = new Bundle();
}
extras.remove("androidx.content.wakelockid");
if (NotificationParams.isNotification(extras)) {
NotificationParams notificationParams = new NotificationParams(extras);
ExecutorService newNetworkIOExecutor = FcmExecutors.newNetworkIOExecutor();
try {
if (new DisplayNotification(this, notificationParams, newNetworkIOExecutor).handleNotification()) {
return;
}
newNetworkIOExecutor.shutdown();
if (MessagingAnalytics.shouldUploadScionMetrics(intent)) {
MessagingAnalytics.logNotificationForeground(intent);
}
} finally {
newNetworkIOExecutor.shutdown();
}
}
onMessageReceived(new RemoteMessage(extras));
}
private String getMessageId(Intent intent) {
String stringExtra = intent.getStringExtra(Constants.MessagePayloadKeys.MSGID);
return stringExtra == null ? intent.getStringExtra(Constants.MessagePayloadKeys.MSGID_SERVER) : stringExtra;
}
private Rpc getRpc(Context context) {
if (this.rpc == null) {
this.rpc = new Rpc(context.getApplicationContext());
}
return this.rpc;
}
private void handleMessageIntent(Intent intent) {
if (!alreadyReceivedMessage(intent.getStringExtra(Constants.MessagePayloadKeys.MSGID))) {
passMessageIntentToSdk(intent);
}
getRpc(this).messageHandled(new CloudMessage(intent));
}
private void passMessageIntentToSdk(Intent intent) {
String stringExtra = intent.getStringExtra(Constants.MessagePayloadKeys.MESSAGE_TYPE);
if (stringExtra == null) {
stringExtra = Constants.MessageTypes.MESSAGE;
}
char c4 = 65535;
switch (stringExtra.hashCode()) {
case -2062414158:
if (stringExtra.equals(Constants.MessageTypes.DELETED)) {
c4 = 0;
break;
}
break;
case 102161:
if (stringExtra.equals(Constants.MessageTypes.MESSAGE)) {
c4 = 1;
break;
}
break;
case 814694033:
if (stringExtra.equals(Constants.MessageTypes.SEND_ERROR)) {
c4 = 2;
break;
}
break;
case 814800675:
if (stringExtra.equals(Constants.MessageTypes.SEND_EVENT)) {
c4 = 3;
break;
}
break;
}
switch (c4) {
case 0:
onDeletedMessages();
return;
case 1:
MessagingAnalytics.logNotificationReceived(intent);
dispatchMessage(intent);
return;
case 2:
onSendError(getMessageId(intent), new SendException(intent.getStringExtra(Constants.IPC_BUNDLE_KEY_SEND_ERROR)));
return;
case 3:
onMessageSent(intent.getStringExtra(Constants.MessagePayloadKeys.MSGID));
return;
default:
Log.w(Constants.TAG, "Received message with unknown type: ".concat(stringExtra));
return;
}
}
public static void resetForTesting() {
recentlyReceivedMessageIds.clear();
}
@Override // com.google.firebase.messaging.EnhancedIntentService
public Intent getStartCommandIntent(Intent intent) {
return ServiceStarter.getInstance().getMessagingEvent();
}
@Override // com.google.firebase.messaging.EnhancedIntentService
public void handleIntent(Intent intent) {
String action = intent.getAction();
if (ACTION_REMOTE_INTENT.equals(action) || ACTION_DIRECT_BOOT_REMOTE_INTENT.equals(action)) {
handleMessageIntent(intent);
} else {
if (ACTION_NEW_TOKEN.equals(action)) {
onNewToken(intent.getStringExtra("token"));
return;
}
Log.d(Constants.TAG, "Unknown intent action: " + intent.getAction());
}
}
public void onDeletedMessages() {
}
public void onMessageReceived(RemoteMessage remoteMessage) {
}
public void onMessageSent(String str) {
}
public void onNewToken(String str) {
}
public void onSendError(String str, Exception exc) {
}
public void setRpcForTesting(Rpc rpc) {
this.rpc = rpc;
}
}