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:
463
apk_decompiled/sources/com/google/firebase/FirebaseApp.java
Normal file
463
apk_decompiled/sources/com/google/firebase/FirebaseApp.java
Normal file
@@ -0,0 +1,463 @@
|
||||
package com.google.firebase;
|
||||
|
||||
import K.k;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Application;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.google.android.gms.common.annotation.KeepForSdk;
|
||||
import com.google.android.gms.common.api.internal.BackgroundDetector;
|
||||
import com.google.android.gms.common.internal.Objects;
|
||||
import com.google.android.gms.common.internal.Preconditions;
|
||||
import com.google.android.gms.common.util.Base64Utils;
|
||||
import com.google.android.gms.common.util.PlatformVersion;
|
||||
import com.google.android.gms.common.util.ProcessUtils;
|
||||
import com.google.android.gms.measurement.api.AppMeasurementSdk;
|
||||
import com.google.firebase.components.Component;
|
||||
import com.google.firebase.components.ComponentDiscovery;
|
||||
import com.google.firebase.components.ComponentDiscoveryService;
|
||||
import com.google.firebase.components.ComponentRegistrar;
|
||||
import com.google.firebase.components.ComponentRuntime;
|
||||
import com.google.firebase.components.Lazy;
|
||||
import com.google.firebase.concurrent.ExecutorsRegistrar;
|
||||
import com.google.firebase.concurrent.UiExecutor;
|
||||
import com.google.firebase.events.Publisher;
|
||||
import com.google.firebase.heartbeatinfo.DefaultHeartBeatController;
|
||||
import com.google.firebase.inject.Provider;
|
||||
import com.google.firebase.internal.DataCollectionConfigStorage;
|
||||
import com.google.firebase.provider.FirebaseInitProvider;
|
||||
import com.google.firebase.tracing.ComponentMonitor;
|
||||
import com.google.firebase.tracing.FirebaseTrace;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import s.j;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public class FirebaseApp {
|
||||
public static final String DEFAULT_APP_NAME = "[DEFAULT]";
|
||||
private static final String LOG_TAG = "FirebaseApp";
|
||||
private final Context applicationContext;
|
||||
private final ComponentRuntime componentRuntime;
|
||||
private final Lazy<DataCollectionConfigStorage> dataCollectionConfigStorage;
|
||||
private final Provider<DefaultHeartBeatController> defaultHeartBeatController;
|
||||
private final String name;
|
||||
private final FirebaseOptions options;
|
||||
private static final Object LOCK = new Object();
|
||||
static final Map<String, FirebaseApp> INSTANCES = new j(0);
|
||||
private final AtomicBoolean automaticResourceManagementEnabled = new AtomicBoolean(false);
|
||||
private final AtomicBoolean deleted = new AtomicBoolean();
|
||||
private final List<BackgroundStateChangeListener> backgroundStateChangeListeners = new CopyOnWriteArrayList();
|
||||
private final List<FirebaseAppLifecycleListener> lifecycleListeners = new CopyOnWriteArrayList();
|
||||
|
||||
@KeepForSdk
|
||||
/* loaded from: classes3.dex */
|
||||
public interface BackgroundStateChangeListener {
|
||||
@KeepForSdk
|
||||
void onBackgroundStateChanged(boolean z3);
|
||||
}
|
||||
|
||||
@TargetApi(14)
|
||||
/* loaded from: classes3.dex */
|
||||
public static class GlobalBackgroundStateListener implements BackgroundDetector.BackgroundStateChangeListener {
|
||||
private static AtomicReference<GlobalBackgroundStateListener> INSTANCE = new AtomicReference<>();
|
||||
|
||||
private GlobalBackgroundStateListener() {
|
||||
}
|
||||
|
||||
public static void ensureBackgroundStateListenerRegistered(Context context) {
|
||||
if (PlatformVersion.isAtLeastIceCreamSandwich() && (context.getApplicationContext() instanceof Application)) {
|
||||
Application application = (Application) context.getApplicationContext();
|
||||
if (INSTANCE.get() == null) {
|
||||
GlobalBackgroundStateListener globalBackgroundStateListener = new GlobalBackgroundStateListener();
|
||||
AtomicReference<GlobalBackgroundStateListener> atomicReference = INSTANCE;
|
||||
while (!atomicReference.compareAndSet(null, globalBackgroundStateListener)) {
|
||||
if (atomicReference.get() != null) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
BackgroundDetector.initialize(application);
|
||||
BackgroundDetector.getInstance().addListener(globalBackgroundStateListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override // com.google.android.gms.common.api.internal.BackgroundDetector.BackgroundStateChangeListener
|
||||
public void onBackgroundStateChanged(boolean z3) {
|
||||
synchronized (FirebaseApp.LOCK) {
|
||||
try {
|
||||
Iterator it = new ArrayList(FirebaseApp.INSTANCES.values()).iterator();
|
||||
while (it.hasNext()) {
|
||||
FirebaseApp firebaseApp = (FirebaseApp) it.next();
|
||||
if (firebaseApp.automaticResourceManagementEnabled.get()) {
|
||||
firebaseApp.notifyBackgroundStateChangeListeners(z3);
|
||||
}
|
||||
}
|
||||
} catch (Throwable th) {
|
||||
throw th;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(24)
|
||||
/* loaded from: classes3.dex */
|
||||
public static class UserUnlockReceiver extends BroadcastReceiver {
|
||||
private static AtomicReference<UserUnlockReceiver> INSTANCE = new AtomicReference<>();
|
||||
private final Context applicationContext;
|
||||
|
||||
public UserUnlockReceiver(Context context) {
|
||||
this.applicationContext = context;
|
||||
}
|
||||
|
||||
public static void ensureReceiverRegistered(Context context) {
|
||||
if (INSTANCE.get() == null) {
|
||||
UserUnlockReceiver userUnlockReceiver = new UserUnlockReceiver(context);
|
||||
AtomicReference<UserUnlockReceiver> atomicReference = INSTANCE;
|
||||
while (!atomicReference.compareAndSet(null, userUnlockReceiver)) {
|
||||
if (atomicReference.get() != null) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
context.registerReceiver(userUnlockReceiver, new IntentFilter("android.intent.action.USER_UNLOCKED"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override // android.content.BroadcastReceiver
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
synchronized (FirebaseApp.LOCK) {
|
||||
try {
|
||||
Iterator<FirebaseApp> it = FirebaseApp.INSTANCES.values().iterator();
|
||||
while (it.hasNext()) {
|
||||
it.next().initializeAllApis();
|
||||
}
|
||||
} catch (Throwable th) {
|
||||
throw th;
|
||||
}
|
||||
}
|
||||
unregister();
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
this.applicationContext.unregisterReceiver(this);
|
||||
}
|
||||
}
|
||||
|
||||
public FirebaseApp(Context context, String str, FirebaseOptions firebaseOptions) {
|
||||
this.applicationContext = (Context) Preconditions.checkNotNull(context);
|
||||
this.name = Preconditions.checkNotEmpty(str);
|
||||
this.options = (FirebaseOptions) Preconditions.checkNotNull(firebaseOptions);
|
||||
StartupTime startupTime = FirebaseInitProvider.getStartupTime();
|
||||
FirebaseTrace.pushTrace("Firebase");
|
||||
FirebaseTrace.pushTrace("ComponentDiscovery");
|
||||
List<Provider<ComponentRegistrar>> discoverLazy = ComponentDiscovery.forContext(context, ComponentDiscoveryService.class).discoverLazy();
|
||||
FirebaseTrace.popTrace();
|
||||
FirebaseTrace.pushTrace("Runtime");
|
||||
ComponentRuntime.Builder processor = ComponentRuntime.builder(UiExecutor.INSTANCE).addLazyComponentRegistrars(discoverLazy).addComponentRegistrar(new FirebaseCommonRegistrar()).addComponentRegistrar(new ExecutorsRegistrar()).addComponent(Component.of(context, (Class<Context>) Context.class, (Class<? super Context>[]) new Class[0])).addComponent(Component.of(this, (Class<FirebaseApp>) FirebaseApp.class, (Class<? super FirebaseApp>[]) new Class[0])).addComponent(Component.of(firebaseOptions, (Class<FirebaseOptions>) FirebaseOptions.class, (Class<? super FirebaseOptions>[]) new Class[0])).setProcessor(new ComponentMonitor());
|
||||
if (k.a(context) && FirebaseInitProvider.isCurrentlyInitializing()) {
|
||||
processor.addComponent(Component.of(startupTime, (Class<StartupTime>) StartupTime.class, (Class<? super StartupTime>[]) new Class[0]));
|
||||
}
|
||||
ComponentRuntime build = processor.build();
|
||||
this.componentRuntime = build;
|
||||
FirebaseTrace.popTrace();
|
||||
this.dataCollectionConfigStorage = new Lazy<>((Provider) new a(this, context));
|
||||
this.defaultHeartBeatController = build.getProvider(DefaultHeartBeatController.class);
|
||||
addBackgroundStateChangeListener(new BackgroundStateChangeListener() { // from class: com.google.firebase.b
|
||||
@Override // com.google.firebase.FirebaseApp.BackgroundStateChangeListener
|
||||
public final void onBackgroundStateChanged(boolean z3) {
|
||||
FirebaseApp.this.lambda$new$1(z3);
|
||||
}
|
||||
});
|
||||
FirebaseTrace.popTrace();
|
||||
}
|
||||
|
||||
private void checkNotDeleted() {
|
||||
Preconditions.checkState(!this.deleted.get(), "FirebaseApp was deleted");
|
||||
}
|
||||
|
||||
public static void clearInstancesForTest() {
|
||||
synchronized (LOCK) {
|
||||
INSTANCES.clear();
|
||||
}
|
||||
}
|
||||
|
||||
private static List<String> getAllAppNames() {
|
||||
ArrayList arrayList = new ArrayList();
|
||||
synchronized (LOCK) {
|
||||
try {
|
||||
Iterator<FirebaseApp> it = INSTANCES.values().iterator();
|
||||
while (it.hasNext()) {
|
||||
arrayList.add(it.next().getName());
|
||||
}
|
||||
} catch (Throwable th) {
|
||||
throw th;
|
||||
}
|
||||
}
|
||||
Collections.sort(arrayList);
|
||||
return arrayList;
|
||||
}
|
||||
|
||||
public static List<FirebaseApp> getApps(Context context) {
|
||||
ArrayList arrayList;
|
||||
synchronized (LOCK) {
|
||||
arrayList = new ArrayList(INSTANCES.values());
|
||||
}
|
||||
return arrayList;
|
||||
}
|
||||
|
||||
public static FirebaseApp getInstance() {
|
||||
FirebaseApp firebaseApp;
|
||||
synchronized (LOCK) {
|
||||
try {
|
||||
firebaseApp = INSTANCES.get(DEFAULT_APP_NAME);
|
||||
if (firebaseApp == null) {
|
||||
throw new IllegalStateException("Default FirebaseApp is not initialized in this process " + ProcessUtils.getMyProcessName() + ". Make sure to call FirebaseApp.initializeApp(Context) first.");
|
||||
}
|
||||
firebaseApp.defaultHeartBeatController.get().registerHeartBeat();
|
||||
} catch (Throwable th) {
|
||||
throw th;
|
||||
}
|
||||
}
|
||||
return firebaseApp;
|
||||
}
|
||||
|
||||
public void initializeAllApis() {
|
||||
if (!k.a(this.applicationContext)) {
|
||||
Log.i(LOG_TAG, "Device in Direct Boot Mode: postponing initialization of Firebase APIs for app " + getName());
|
||||
UserUnlockReceiver.ensureReceiverRegistered(this.applicationContext);
|
||||
return;
|
||||
}
|
||||
Log.i(LOG_TAG, "Device unlocked: initializing all Firebase APIs for app " + getName());
|
||||
this.componentRuntime.initializeEagerComponents(isDefaultApp());
|
||||
this.defaultHeartBeatController.get().registerHeartBeat();
|
||||
}
|
||||
|
||||
public static FirebaseApp initializeApp(Context context) {
|
||||
synchronized (LOCK) {
|
||||
try {
|
||||
if (INSTANCES.containsKey(DEFAULT_APP_NAME)) {
|
||||
return getInstance();
|
||||
}
|
||||
FirebaseOptions fromResource = FirebaseOptions.fromResource(context);
|
||||
if (fromResource == null) {
|
||||
Log.w(LOG_TAG, "Default FirebaseApp failed to initialize because no default options were found. This usually means that com.google.gms:google-services was not applied to your gradle project.");
|
||||
return null;
|
||||
}
|
||||
return initializeApp(context, fromResource);
|
||||
} catch (Throwable th) {
|
||||
throw th;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public /* synthetic */ DataCollectionConfigStorage lambda$new$0(Context context) {
|
||||
return new DataCollectionConfigStorage(context, getPersistenceKey(), (Publisher) this.componentRuntime.get(Publisher.class));
|
||||
}
|
||||
|
||||
public /* synthetic */ void lambda$new$1(boolean z3) {
|
||||
if (z3) {
|
||||
return;
|
||||
}
|
||||
this.defaultHeartBeatController.get().registerHeartBeat();
|
||||
}
|
||||
|
||||
private static String normalize(String str) {
|
||||
return str.trim();
|
||||
}
|
||||
|
||||
public void notifyBackgroundStateChangeListeners(boolean z3) {
|
||||
Log.d(LOG_TAG, "Notifying background state change listeners.");
|
||||
Iterator<BackgroundStateChangeListener> it = this.backgroundStateChangeListeners.iterator();
|
||||
while (it.hasNext()) {
|
||||
it.next().onBackgroundStateChanged(z3);
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyOnAppDeleted() {
|
||||
Iterator<FirebaseAppLifecycleListener> it = this.lifecycleListeners.iterator();
|
||||
while (it.hasNext()) {
|
||||
it.next().onDeleted(this.name, this.options);
|
||||
}
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void addBackgroundStateChangeListener(BackgroundStateChangeListener backgroundStateChangeListener) {
|
||||
checkNotDeleted();
|
||||
if (this.automaticResourceManagementEnabled.get() && BackgroundDetector.getInstance().isInBackground()) {
|
||||
backgroundStateChangeListener.onBackgroundStateChanged(true);
|
||||
}
|
||||
this.backgroundStateChangeListeners.add(backgroundStateChangeListener);
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void addLifecycleEventListener(FirebaseAppLifecycleListener firebaseAppLifecycleListener) {
|
||||
checkNotDeleted();
|
||||
Preconditions.checkNotNull(firebaseAppLifecycleListener);
|
||||
this.lifecycleListeners.add(firebaseAppLifecycleListener);
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
if (this.deleted.compareAndSet(false, true)) {
|
||||
synchronized (LOCK) {
|
||||
INSTANCES.remove(this.name);
|
||||
}
|
||||
notifyOnAppDeleted();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof FirebaseApp) {
|
||||
return this.name.equals(((FirebaseApp) obj).getName());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public <T> T get(Class<T> cls) {
|
||||
checkNotDeleted();
|
||||
return (T) this.componentRuntime.get(cls);
|
||||
}
|
||||
|
||||
public Context getApplicationContext() {
|
||||
checkNotDeleted();
|
||||
return this.applicationContext;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
checkNotDeleted();
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public FirebaseOptions getOptions() {
|
||||
checkNotDeleted();
|
||||
return this.options;
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public String getPersistenceKey() {
|
||||
return Base64Utils.encodeUrlSafeNoPadding(getName().getBytes(Charset.defaultCharset())) + "+" + Base64Utils.encodeUrlSafeNoPadding(getOptions().getApplicationId().getBytes(Charset.defaultCharset()));
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return this.name.hashCode();
|
||||
}
|
||||
|
||||
public void initializeAllComponents() {
|
||||
this.componentRuntime.initializeAllComponentsForTests();
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public boolean isDataCollectionDefaultEnabled() {
|
||||
checkNotDeleted();
|
||||
return this.dataCollectionConfigStorage.get().isEnabled();
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public boolean isDefaultApp() {
|
||||
return DEFAULT_APP_NAME.equals(getName());
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void removeBackgroundStateChangeListener(BackgroundStateChangeListener backgroundStateChangeListener) {
|
||||
checkNotDeleted();
|
||||
this.backgroundStateChangeListeners.remove(backgroundStateChangeListener);
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void removeLifecycleEventListener(FirebaseAppLifecycleListener firebaseAppLifecycleListener) {
|
||||
checkNotDeleted();
|
||||
Preconditions.checkNotNull(firebaseAppLifecycleListener);
|
||||
this.lifecycleListeners.remove(firebaseAppLifecycleListener);
|
||||
}
|
||||
|
||||
public void setAutomaticResourceManagementEnabled(boolean z3) {
|
||||
checkNotDeleted();
|
||||
if (this.automaticResourceManagementEnabled.compareAndSet(!z3, z3)) {
|
||||
boolean isInBackground = BackgroundDetector.getInstance().isInBackground();
|
||||
if (z3 && isInBackground) {
|
||||
notifyBackgroundStateChangeListeners(true);
|
||||
} else {
|
||||
if (z3 || !isInBackground) {
|
||||
return;
|
||||
}
|
||||
notifyBackgroundStateChangeListeners(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void setDataCollectionDefaultEnabled(Boolean bool) {
|
||||
checkNotDeleted();
|
||||
this.dataCollectionConfigStorage.get().setEnabled(bool);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return Objects.toStringHelper(this).add(AppMeasurementSdk.ConditionalUserProperty.NAME, this.name).add("options", this.options).toString();
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
@Deprecated
|
||||
public void setDataCollectionDefaultEnabled(boolean z3) {
|
||||
setDataCollectionDefaultEnabled(Boolean.valueOf(z3));
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public static String getPersistenceKey(String str, FirebaseOptions firebaseOptions) {
|
||||
return Base64Utils.encodeUrlSafeNoPadding(str.getBytes(Charset.defaultCharset())) + "+" + Base64Utils.encodeUrlSafeNoPadding(firebaseOptions.getApplicationId().getBytes(Charset.defaultCharset()));
|
||||
}
|
||||
|
||||
public static FirebaseApp getInstance(String str) {
|
||||
FirebaseApp firebaseApp;
|
||||
String str2;
|
||||
synchronized (LOCK) {
|
||||
try {
|
||||
firebaseApp = INSTANCES.get(normalize(str));
|
||||
if (firebaseApp != null) {
|
||||
firebaseApp.defaultHeartBeatController.get().registerHeartBeat();
|
||||
} else {
|
||||
List<String> allAppNames = getAllAppNames();
|
||||
if (allAppNames.isEmpty()) {
|
||||
str2 = "";
|
||||
} else {
|
||||
str2 = "Available app names: " + TextUtils.join(", ", allAppNames);
|
||||
}
|
||||
throw new IllegalStateException("FirebaseApp with name " + str + " doesn't exist. " + str2);
|
||||
}
|
||||
} finally {
|
||||
}
|
||||
}
|
||||
return firebaseApp;
|
||||
}
|
||||
|
||||
public static FirebaseApp initializeApp(Context context, FirebaseOptions firebaseOptions) {
|
||||
return initializeApp(context, firebaseOptions, DEFAULT_APP_NAME);
|
||||
}
|
||||
|
||||
public static FirebaseApp initializeApp(Context context, FirebaseOptions firebaseOptions, String str) {
|
||||
FirebaseApp firebaseApp;
|
||||
GlobalBackgroundStateListener.ensureBackgroundStateListenerRegistered(context);
|
||||
String normalize = normalize(str);
|
||||
if (context.getApplicationContext() != null) {
|
||||
context = context.getApplicationContext();
|
||||
}
|
||||
synchronized (LOCK) {
|
||||
Map<String, FirebaseApp> map = INSTANCES;
|
||||
Preconditions.checkState(!map.containsKey(normalize), "FirebaseApp name " + normalize + " already exists!");
|
||||
Preconditions.checkNotNull(context, "Application context cannot be null.");
|
||||
firebaseApp = new FirebaseApp(context, normalize, firebaseOptions);
|
||||
map.put(normalize, firebaseApp);
|
||||
}
|
||||
firebaseApp.initializeAllApis();
|
||||
return firebaseApp;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user