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,259 @@
package com.google.firebase.sessions.api;
import android.util.Log;
import com.google.firebase.sessions.api.SessionSubscriber;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import kotlin.Metadata;
import kotlin.jvm.JvmStatic;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
import kotlinx.coroutines.sync.Mutex;
import kotlinx.coroutines.sync.MutexKt;
@Metadata(d1 = {"\u00006\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010%\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\u0010$\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\n\\u0002\u0018\u00002\u00020\u0001:\u0001\u0019B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\u000e\u0010\u000b\u001a\u00020\f2\u0006\u0010\r\u001a\u00020\u0007J\u0010\u0010\u000e\u001a\u00020\t2\u0006\u0010\r\u001a\u00020\u0007H\u0002J\u001f\u0010\u000f\u001a\u000e\u0012\u0004\u0012\u00020\u0007\u0012\u0004\u0012\u00020\u00100\nH\u0080@ø\u0001\u0000¢\u0006\u0004\b\u0011\u0010\u0012J\u0015\u0010\u0013\u001a\u00020\u00102\u0006\u0010\r\u001a\u00020\u0007H\u0001¢\u0006\u0002\b\u0014J\u0010\u0010\u0015\u001a\u00020\f2\u0006\u0010\u0016\u001a\u00020\u0010H\u0007J\r\u0010\u0017\u001a\u00020\fH\u0001¢\u0006\u0002\b\u0018R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082T¢\u0006\u0002\n\u0000RN\u0010\u0005\u001aB\u0012\f\u0012\n \b*\u0004\u0018\u00010\u00070\u0007\u0012\f\u0012\n \b*\u0004\u0018\u00010\t0\t \b* \u0012\f\u0012\n \b*\u0004\u0018\u00010\u00070\u0007\u0012\f\u0012\n \b*\u0004\u0018\u00010\t0\t\u0018\u00010\n0\u0006X\u0082\u0004¢\u0006\u0002\n\u0000\u0082\u0002\u0004\n\u0002\b\u0019¨\u0006\u001a"}, d2 = {"Lcom/google/firebase/sessions/api/FirebaseSessionsDependencies;", "", "()V", "TAG", "", "dependencies", "", "Lcom/google/firebase/sessions/api/SessionSubscriber$Name;", "kotlin.jvm.PlatformType", "Lcom/google/firebase/sessions/api/FirebaseSessionsDependencies$Dependency;", "", "addDependency", "", "subscriberName", "getDependency", "getRegisteredSubscribers", "Lcom/google/firebase/sessions/api/SessionSubscriber;", "getRegisteredSubscribers$com_google_firebase_firebase_sessions", "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "getSubscriber", "getSubscriber$com_google_firebase_firebase_sessions", "register", "subscriber", "reset", "reset$com_google_firebase_firebase_sessions", "Dependency", "com.google.firebase-firebase-sessions"}, k = 1, mv = {1, 7, 1}, xi = 48)
/* loaded from: classes3.dex */
public final class FirebaseSessionsDependencies {
private static final String TAG = "SessionsDependencies";
public static final FirebaseSessionsDependencies INSTANCE = new FirebaseSessionsDependencies();
private static final Map<SessionSubscriber.Name, Dependency> dependencies = Collections.synchronizedMap(new LinkedHashMap());
@Metadata(d1 = {"\u0000,\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u000b\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\b\n\u0000\n\u0002\u0010\u000e\n\u0000\b\u0082\b\u0018\u00002\u00020\u0001B\u0019\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\n\b\u0002\u0010\u0004\u001a\u0004\u0018\u00010\u0005¢\u0006\u0002\u0010\u0006J\t\u0010\r\u001a\u00020\u0003HÆ\u0003J\u000b\u0010\u000e\u001a\u0004\u0018\u00010\u0005HÆ\u0003J\u001f\u0010\u000f\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\n\b\u0002\u0010\u0004\u001a\u0004\u0018\u00010\u0005HÆ\u0001J\u0013\u0010\u0010\u001a\u00020\u00112\b\u0010\u0012\u001a\u0004\u0018\u00010\u0001HÖ\u0003J\t\u0010\u0013\u001a\u00020\u0014HÖ\u0001J\t\u0010\u0015\u001a\u00020\u0016HÖ\u0001R\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u001c\u0010\u0004\u001a\u0004\u0018\u00010\u0005X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\t\u0010\n\"\u0004\b\u000b\u0010\\u0006\u0017"}, d2 = {"Lcom/google/firebase/sessions/api/FirebaseSessionsDependencies$Dependency;", "", "mutex", "Lkotlinx/coroutines/sync/Mutex;", "subscriber", "Lcom/google/firebase/sessions/api/SessionSubscriber;", "(Lkotlinx/coroutines/sync/Mutex;Lcom/google/firebase/sessions/api/SessionSubscriber;)V", "getMutex", "()Lkotlinx/coroutines/sync/Mutex;", "getSubscriber", "()Lcom/google/firebase/sessions/api/SessionSubscriber;", "setSubscriber", "(Lcom/google/firebase/sessions/api/SessionSubscriber;)V", "component1", "component2", "copy", "equals", "", "other", "hashCode", "", "toString", "", "com.google.firebase-firebase-sessions"}, k = 1, mv = {1, 7, 1}, xi = 48)
/* loaded from: classes3.dex */
public static final /* data */ class Dependency {
private final Mutex mutex;
private SessionSubscriber subscriber;
public Dependency(Mutex mutex, SessionSubscriber sessionSubscriber) {
Intrinsics.checkNotNullParameter(mutex, "mutex");
this.mutex = mutex;
this.subscriber = sessionSubscriber;
}
public static /* synthetic */ Dependency copy$default(Dependency dependency, Mutex mutex, SessionSubscriber sessionSubscriber, int i, Object obj) {
if ((i & 1) != 0) {
mutex = dependency.mutex;
}
if ((i & 2) != 0) {
sessionSubscriber = dependency.subscriber;
}
return dependency.copy(mutex, sessionSubscriber);
}
/* renamed from: component1, reason: from getter */
public final Mutex getMutex() {
return this.mutex;
}
/* renamed from: component2, reason: from getter */
public final SessionSubscriber getSubscriber() {
return this.subscriber;
}
public final Dependency copy(Mutex mutex, SessionSubscriber subscriber) {
Intrinsics.checkNotNullParameter(mutex, "mutex");
return new Dependency(mutex, subscriber);
}
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof Dependency)) {
return false;
}
Dependency dependency = (Dependency) other;
return Intrinsics.areEqual(this.mutex, dependency.mutex) && Intrinsics.areEqual(this.subscriber, dependency.subscriber);
}
public final Mutex getMutex() {
return this.mutex;
}
public final SessionSubscriber getSubscriber() {
return this.subscriber;
}
public int hashCode() {
int hashCode = this.mutex.hashCode() * 31;
SessionSubscriber sessionSubscriber = this.subscriber;
return hashCode + (sessionSubscriber == null ? 0 : sessionSubscriber.hashCode());
}
public final void setSubscriber(SessionSubscriber sessionSubscriber) {
this.subscriber = sessionSubscriber;
}
public String toString() {
return "Dependency(mutex=" + this.mutex + ", subscriber=" + this.subscriber + ')';
}
public /* synthetic */ Dependency(Mutex mutex, SessionSubscriber sessionSubscriber, int i, DefaultConstructorMarker defaultConstructorMarker) {
this(mutex, (i & 2) != 0 ? null : sessionSubscriber);
}
}
private FirebaseSessionsDependencies() {
}
private final Dependency getDependency(SessionSubscriber.Name subscriberName) {
Map<SessionSubscriber.Name, Dependency> dependencies2 = dependencies;
Intrinsics.checkNotNullExpressionValue(dependencies2, "dependencies");
Dependency dependency = dependencies2.get(subscriberName);
if (dependency != null) {
Intrinsics.checkNotNullExpressionValue(dependency, "dependencies.getOrElse(s…load time.\"\n )\n }");
return dependency;
}
throw new IllegalStateException("Cannot get dependency " + subscriberName + ". Dependencies should be added at class load time.");
}
@JvmStatic
public static final void register(SessionSubscriber subscriber) {
Intrinsics.checkNotNullParameter(subscriber, "subscriber");
SessionSubscriber.Name sessionSubscriberName = subscriber.getSessionSubscriberName();
Dependency dependency = INSTANCE.getDependency(sessionSubscriberName);
if (dependency.getSubscriber() != null) {
Log.d(TAG, "Subscriber " + sessionSubscriberName + " already registered.");
return;
}
dependency.setSubscriber(subscriber);
Log.d(TAG, "Subscriber " + sessionSubscriberName + " registered.");
Mutex.DefaultImpls.unlock$default(dependency.getMutex(), null, 1, null);
}
/* JADX WARN: Multi-variable type inference failed */
public final void addDependency(SessionSubscriber.Name subscriberName) {
Intrinsics.checkNotNullParameter(subscriberName, "subscriberName");
if (subscriberName == SessionSubscriber.Name.PERFORMANCE) {
throw new IllegalArgumentException("Incompatible versions of Firebase Perf and Firebase Sessions.\nA safe combination would be:\n firebase-sessions:1.1.0\n firebase-crashlytics:18.5.0\n firebase-perf:20.5.0\nFor more information contact Firebase Support.");
}
Map<SessionSubscriber.Name, Dependency> dependencies2 = dependencies;
if (dependencies2.containsKey(subscriberName)) {
Log.d(TAG, "Dependency " + subscriberName + " already added.");
return;
}
Intrinsics.checkNotNullExpressionValue(dependencies2, "dependencies");
dependencies2.put(subscriberName, new Dependency(MutexKt.Mutex(true), null, 2, 0 == true ? 1 : 0));
Log.d(TAG, "Dependency to " + subscriberName + " added.");
}
/* JADX WARN: Removed duplicated region for block: B:15:0x006f */
/* JADX WARN: Removed duplicated region for block: B:20:0x00b3 A[RETURN] */
/* JADX WARN: Removed duplicated region for block: B:27:0x0048 */
/* JADX WARN: Removed duplicated region for block: B:8:0x0024 */
/* JADX WARN: Unsupported multi-entry loop pattern (BACK_EDGE: B:19:0x009f -> B:10:0x00a0). Please report as a decompilation issue!!! */
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
public final java.lang.Object getRegisteredSubscribers$com_google_firebase_firebase_sessions(kotlin.coroutines.Continuation<? super java.util.Map<com.google.firebase.sessions.api.SessionSubscriber.Name, ? extends com.google.firebase.sessions.api.SessionSubscriber>> r10) {
/*
r9 = this;
boolean r0 = r10 instanceof com.google.firebase.sessions.api.FirebaseSessionsDependencies$getRegisteredSubscribers$1
if (r0 == 0) goto L13
r0 = r10
com.google.firebase.sessions.api.FirebaseSessionsDependencies$getRegisteredSubscribers$1 r0 = (com.google.firebase.sessions.api.FirebaseSessionsDependencies$getRegisteredSubscribers$1) r0
int r1 = r0.label
r2 = -2147483648(0xffffffff80000000, float:-0.0)
r3 = r1 & r2
if (r3 == 0) goto L13
int r1 = r1 - r2
r0.label = r1
goto L18
L13:
com.google.firebase.sessions.api.FirebaseSessionsDependencies$getRegisteredSubscribers$1 r0 = new com.google.firebase.sessions.api.FirebaseSessionsDependencies$getRegisteredSubscribers$1
r0.<init>(r9, r10)
L18:
java.lang.Object r9 = r0.result
java.lang.Object r10 = kotlin.coroutines.intrinsics.IntrinsicsKt.getCOROUTINE_SUSPENDED()
int r1 = r0.label
r2 = 1
r3 = 0
if (r1 == 0) goto L48
if (r1 != r2) goto L40
java.lang.Object r1 = r0.L$5
java.lang.Object r4 = r0.L$4
java.util.Map r4 = (java.util.Map) r4
java.lang.Object r5 = r0.L$3
kotlinx.coroutines.sync.Mutex r5 = (kotlinx.coroutines.sync.Mutex) r5
java.lang.Object r6 = r0.L$2
com.google.firebase.sessions.api.SessionSubscriber$Name r6 = (com.google.firebase.sessions.api.SessionSubscriber.Name) r6
java.lang.Object r7 = r0.L$1
java.util.Iterator r7 = (java.util.Iterator) r7
java.lang.Object r8 = r0.L$0
java.util.Map r8 = (java.util.Map) r8
kotlin.ResultKt.throwOnFailure(r9)
goto La0
L40:
java.lang.IllegalStateException r9 = new java.lang.IllegalStateException
java.lang.String r10 = "call to 'resume' before 'invoke' with coroutine"
r9.<init>(r10)
throw r9
L48:
kotlin.ResultKt.throwOnFailure(r9)
java.util.Map<com.google.firebase.sessions.api.SessionSubscriber$Name, com.google.firebase.sessions.api.FirebaseSessionsDependencies$Dependency> r9 = com.google.firebase.sessions.api.FirebaseSessionsDependencies.dependencies
java.lang.String r1 = "dependencies"
kotlin.jvm.internal.Intrinsics.checkNotNullExpressionValue(r9, r1)
java.util.LinkedHashMap r1 = new java.util.LinkedHashMap
int r4 = r9.size()
int r4 = kotlin.collections.MapsKt.mapCapacity(r4)
r1.<init>(r4)
java.util.Set r9 = r9.entrySet()
java.util.Iterator r9 = r9.iterator()
r7 = r9
r4 = r1
L69:
boolean r9 = r7.hasNext()
if (r9 == 0) goto Lb3
java.lang.Object r9 = r7.next()
java.util.Map$Entry r9 = (java.util.Map.Entry) r9
java.lang.Object r1 = r9.getKey()
java.lang.Object r5 = r9.getKey()
r6 = r5
com.google.firebase.sessions.api.SessionSubscriber$Name r6 = (com.google.firebase.sessions.api.SessionSubscriber.Name) r6
java.lang.Object r9 = r9.getValue()
com.google.firebase.sessions.api.FirebaseSessionsDependencies$Dependency r9 = (com.google.firebase.sessions.api.FirebaseSessionsDependencies.Dependency) r9
kotlinx.coroutines.sync.Mutex r5 = r9.getMutex()
r0.L$0 = r4
r0.L$1 = r7
r0.L$2 = r6
r0.L$3 = r5
r0.L$4 = r4
r0.L$5 = r1
r0.label = r2
java.lang.Object r9 = r5.lock(r3, r0)
if (r9 != r10) goto L9f
return r10
L9f:
r8 = r4
La0:
com.google.firebase.sessions.api.FirebaseSessionsDependencies r9 = com.google.firebase.sessions.api.FirebaseSessionsDependencies.INSTANCE // Catch: java.lang.Throwable -> Lae
com.google.firebase.sessions.api.SessionSubscriber r9 = r9.getSubscriber$com_google_firebase_firebase_sessions(r6) // Catch: java.lang.Throwable -> Lae
r5.unlock(r3)
r4.put(r1, r9)
r4 = r8
goto L69
Lae:
r9 = move-exception
r5.unlock(r3)
throw r9
Lb3:
return r4
*/
throw new UnsupportedOperationException("Method not decompiled: com.google.firebase.sessions.api.FirebaseSessionsDependencies.getRegisteredSubscribers$com_google_firebase_firebase_sessions(kotlin.coroutines.Continuation):java.lang.Object");
}
public final SessionSubscriber getSubscriber$com_google_firebase_firebase_sessions(SessionSubscriber.Name subscriberName) {
Intrinsics.checkNotNullParameter(subscriberName, "subscriberName");
SessionSubscriber subscriber = getDependency(subscriberName).getSubscriber();
if (subscriber != null) {
return subscriber;
}
throw new IllegalStateException("Subscriber " + subscriberName + " has not been registered.");
}
public final void reset$com_google_firebase_firebase_sessions() {
dependencies.clear();
}
}