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,123 @@
|
||||
package com.google.android.gms.common.stats;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.util.Log;
|
||||
import com.google.android.gms.common.annotation.KeepForSdk;
|
||||
import com.google.android.gms.common.internal.Preconditions;
|
||||
import com.google.android.gms.common.internal.zzs;
|
||||
import com.google.android.gms.common.util.PlatformVersion;
|
||||
import com.google.android.gms.common.util.VisibleForTesting;
|
||||
import com.google.android.gms.common.wrappers.Wrappers;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@KeepForSdk
|
||||
/* loaded from: classes3.dex */
|
||||
public class ConnectionTracker {
|
||||
private static final Object zzb = new Object();
|
||||
private static volatile ConnectionTracker zzc;
|
||||
|
||||
@VisibleForTesting
|
||||
public ConcurrentHashMap zza = new ConcurrentHashMap();
|
||||
|
||||
private ConnectionTracker() {
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public static ConnectionTracker getInstance() {
|
||||
if (zzc == null) {
|
||||
synchronized (zzb) {
|
||||
try {
|
||||
if (zzc == null) {
|
||||
zzc = new ConnectionTracker();
|
||||
}
|
||||
} finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
ConnectionTracker connectionTracker = zzc;
|
||||
Preconditions.checkNotNull(connectionTracker);
|
||||
return connectionTracker;
|
||||
}
|
||||
|
||||
private static void zzb(Context context, ServiceConnection serviceConnection) {
|
||||
try {
|
||||
context.unbindService(serviceConnection);
|
||||
} catch (IllegalArgumentException | IllegalStateException | NoSuchElementException unused) {
|
||||
}
|
||||
}
|
||||
|
||||
private final boolean zzc(Context context, String str, Intent intent, ServiceConnection serviceConnection, int i, boolean z3, Executor executor) {
|
||||
ComponentName component = intent.getComponent();
|
||||
if (component != null) {
|
||||
String packageName = component.getPackageName();
|
||||
"com.google.android.gms".equals(packageName);
|
||||
try {
|
||||
if ((Wrappers.packageManager(context).getApplicationInfo(packageName, 0).flags & 2097152) != 0) {
|
||||
Log.w("ConnectionTracker", "Attempted to bind to a service in a STOPPED package.");
|
||||
return false;
|
||||
}
|
||||
} catch (PackageManager.NameNotFoundException unused) {
|
||||
}
|
||||
}
|
||||
if (!zzd(serviceConnection)) {
|
||||
return zze(context, intent, serviceConnection, i, executor);
|
||||
}
|
||||
ServiceConnection serviceConnection2 = (ServiceConnection) this.zza.putIfAbsent(serviceConnection, serviceConnection);
|
||||
if (serviceConnection2 != null && serviceConnection != serviceConnection2) {
|
||||
Log.w("ConnectionTracker", String.format("Duplicate binding with the same ServiceConnection: %s, %s, %s.", serviceConnection, str, intent.getAction()));
|
||||
}
|
||||
try {
|
||||
boolean zze = zze(context, intent, serviceConnection, i, executor);
|
||||
if (zze) {
|
||||
return zze;
|
||||
}
|
||||
return false;
|
||||
} finally {
|
||||
this.zza.remove(serviceConnection, serviceConnection);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean zzd(ServiceConnection serviceConnection) {
|
||||
return !(serviceConnection instanceof zzs);
|
||||
}
|
||||
|
||||
private static final boolean zze(Context context, Intent intent, ServiceConnection serviceConnection, int i, Executor executor) {
|
||||
return (!PlatformVersion.isAtLeastQ() || executor == null) ? context.bindService(intent, serviceConnection, i) : context.bindService(intent, i, executor, serviceConnection);
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public boolean bindService(Context context, Intent intent, ServiceConnection serviceConnection, int i) {
|
||||
return zzc(context, context.getClass().getName(), intent, serviceConnection, i, true, null);
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void unbindService(Context context, ServiceConnection serviceConnection) {
|
||||
if (!zzd(serviceConnection) || !this.zza.containsKey(serviceConnection)) {
|
||||
zzb(context, serviceConnection);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
zzb(context, (ServiceConnection) this.zza.get(serviceConnection));
|
||||
} finally {
|
||||
this.zza.remove(serviceConnection);
|
||||
}
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void unbindServiceSafe(Context context, ServiceConnection serviceConnection) {
|
||||
try {
|
||||
unbindService(context, serviceConnection);
|
||||
} catch (IllegalArgumentException unused) {
|
||||
}
|
||||
}
|
||||
|
||||
public final boolean zza(Context context, String str, Intent intent, ServiceConnection serviceConnection, int i, Executor executor) {
|
||||
return zzc(context, str, intent, serviceConnection, i, true, executor);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.google.android.gms.common.stats;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import com.google.android.gms.common.annotation.KeepForSdk;
|
||||
|
||||
@KeepForSdk
|
||||
/* loaded from: classes3.dex */
|
||||
public final class LoggingConstants {
|
||||
|
||||
@KeepForSdk
|
||||
@Deprecated
|
||||
public static final String EXTRA_WAKE_LOCK_KEY = "WAKE_LOCK_KEY";
|
||||
public static final ComponentName zza = new ComponentName("com.google.android.gms", "com.google.android.gms.common.stats.GmsCoreStatsService");
|
||||
|
||||
private LoggingConstants() {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.google.android.gms.common.stats;
|
||||
|
||||
import C.w;
|
||||
import com.google.android.gms.common.annotation.KeepForSdk;
|
||||
import com.google.android.gms.common.internal.ReflectedParcelable;
|
||||
import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
|
||||
|
||||
@KeepForSdk
|
||||
@Deprecated
|
||||
/* loaded from: classes3.dex */
|
||||
public abstract class StatsEvent extends AbstractSafeParcelable implements ReflectedParcelable {
|
||||
|
||||
@KeepForSdk
|
||||
/* loaded from: classes3.dex */
|
||||
public interface Types {
|
||||
|
||||
@KeepForSdk
|
||||
public static final int EVENT_TYPE_ACQUIRE_WAKE_LOCK = 7;
|
||||
|
||||
@KeepForSdk
|
||||
public static final int EVENT_TYPE_RELEASE_WAKE_LOCK = 8;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
long zzc = zzc();
|
||||
int zza = zza();
|
||||
long zzb = zzb();
|
||||
String zzd = zzd();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(zzc);
|
||||
sb.append("\t");
|
||||
sb.append(zza);
|
||||
sb.append("\t");
|
||||
return w.q(sb, zzb, zzd);
|
||||
}
|
||||
|
||||
public abstract int zza();
|
||||
|
||||
public abstract long zzb();
|
||||
|
||||
public abstract long zzc();
|
||||
|
||||
public abstract String zzd();
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.google.android.gms.common.stats;
|
||||
|
||||
import android.os.PowerManager;
|
||||
import android.os.Process;
|
||||
import android.text.TextUtils;
|
||||
import com.google.android.gms.common.annotation.KeepForSdk;
|
||||
|
||||
@KeepForSdk
|
||||
@Deprecated
|
||||
/* loaded from: classes3.dex */
|
||||
public class StatsUtils {
|
||||
@KeepForSdk
|
||||
public static String getEventKey(PowerManager.WakeLock wakeLock, String str) {
|
||||
String valueOf = String.valueOf((Process.myPid() << 32) | System.identityHashCode(wakeLock));
|
||||
if (true == TextUtils.isEmpty(str)) {
|
||||
str = "";
|
||||
}
|
||||
return String.valueOf(valueOf).concat(String.valueOf(str));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
package com.google.android.gms.common.stats;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.text.TextUtils;
|
||||
import com.google.android.gms.common.annotation.KeepForSdk;
|
||||
import com.google.android.gms.common.internal.safeparcel.SafeParcelWriter;
|
||||
import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
|
||||
import java.util.List;
|
||||
|
||||
@KeepForSdk
|
||||
@SafeParcelable.Class(creator = "WakeLockEventCreator")
|
||||
@Deprecated
|
||||
/* loaded from: classes3.dex */
|
||||
public final class WakeLockEvent extends StatsEvent {
|
||||
public static final Parcelable.Creator<WakeLockEvent> CREATOR = new zza();
|
||||
|
||||
@SafeParcelable.VersionField(id = 1)
|
||||
final int zza;
|
||||
|
||||
@SafeParcelable.Field(getter = "getTimeMillis", id = 2)
|
||||
private final long zzb;
|
||||
|
||||
@SafeParcelable.Field(getter = "getEventType", id = 11)
|
||||
private int zzc;
|
||||
|
||||
@SafeParcelable.Field(getter = "getWakeLockName", id = 4)
|
||||
private final String zzd;
|
||||
|
||||
@SafeParcelable.Field(getter = "getSecondaryWakeLockName", id = 10)
|
||||
private final String zze;
|
||||
|
||||
@SafeParcelable.Field(getter = "getCodePackage", id = 17)
|
||||
private final String zzf;
|
||||
|
||||
@SafeParcelable.Field(getter = "getWakeLockType", id = 5)
|
||||
private final int zzg;
|
||||
|
||||
@SafeParcelable.Field(getter = "getCallingPackages", id = 6)
|
||||
private final List zzh;
|
||||
|
||||
@SafeParcelable.Field(getter = "getEventKey", id = 12)
|
||||
private final String zzi;
|
||||
|
||||
@SafeParcelable.Field(getter = "getElapsedRealtime", id = 8)
|
||||
private final long zzj;
|
||||
|
||||
@SafeParcelable.Field(getter = "getDeviceState", id = 14)
|
||||
private int zzk;
|
||||
|
||||
@SafeParcelable.Field(getter = "getHostPackage", id = 13)
|
||||
private final String zzl;
|
||||
|
||||
@SafeParcelable.Field(getter = "getBeginPowerPercentage", id = 15)
|
||||
private final float zzm;
|
||||
|
||||
@SafeParcelable.Field(getter = "getTimeout", id = 16)
|
||||
private final long zzn;
|
||||
|
||||
@SafeParcelable.Field(getter = "getAcquiredWithTimeout", id = 18)
|
||||
private final boolean zzo;
|
||||
private long zzp = -1;
|
||||
|
||||
@SafeParcelable.Constructor
|
||||
public WakeLockEvent(@SafeParcelable.Param(id = 1) int i, @SafeParcelable.Param(id = 2) long j4, @SafeParcelable.Param(id = 11) int i4, @SafeParcelable.Param(id = 4) String str, @SafeParcelable.Param(id = 5) int i5, @SafeParcelable.Param(id = 6) List list, @SafeParcelable.Param(id = 12) String str2, @SafeParcelable.Param(id = 8) long j5, @SafeParcelable.Param(id = 14) int i6, @SafeParcelable.Param(id = 10) String str3, @SafeParcelable.Param(id = 13) String str4, @SafeParcelable.Param(id = 15) float f2, @SafeParcelable.Param(id = 16) long j6, @SafeParcelable.Param(id = 17) String str5, @SafeParcelable.Param(id = 18) boolean z3) {
|
||||
this.zza = i;
|
||||
this.zzb = j4;
|
||||
this.zzc = i4;
|
||||
this.zzd = str;
|
||||
this.zze = str3;
|
||||
this.zzf = str5;
|
||||
this.zzg = i5;
|
||||
this.zzh = list;
|
||||
this.zzi = str2;
|
||||
this.zzj = j5;
|
||||
this.zzk = i6;
|
||||
this.zzl = str4;
|
||||
this.zzm = f2;
|
||||
this.zzn = j6;
|
||||
this.zzo = z3;
|
||||
}
|
||||
|
||||
@Override // android.os.Parcelable
|
||||
public final void writeToParcel(Parcel parcel, int i) {
|
||||
int beginObjectHeader = SafeParcelWriter.beginObjectHeader(parcel);
|
||||
SafeParcelWriter.writeInt(parcel, 1, this.zza);
|
||||
SafeParcelWriter.writeLong(parcel, 2, this.zzb);
|
||||
SafeParcelWriter.writeString(parcel, 4, this.zzd, false);
|
||||
SafeParcelWriter.writeInt(parcel, 5, this.zzg);
|
||||
SafeParcelWriter.writeStringList(parcel, 6, this.zzh, false);
|
||||
SafeParcelWriter.writeLong(parcel, 8, this.zzj);
|
||||
SafeParcelWriter.writeString(parcel, 10, this.zze, false);
|
||||
SafeParcelWriter.writeInt(parcel, 11, this.zzc);
|
||||
SafeParcelWriter.writeString(parcel, 12, this.zzi, false);
|
||||
SafeParcelWriter.writeString(parcel, 13, this.zzl, false);
|
||||
SafeParcelWriter.writeInt(parcel, 14, this.zzk);
|
||||
SafeParcelWriter.writeFloat(parcel, 15, this.zzm);
|
||||
SafeParcelWriter.writeLong(parcel, 16, this.zzn);
|
||||
SafeParcelWriter.writeString(parcel, 17, this.zzf, false);
|
||||
SafeParcelWriter.writeBoolean(parcel, 18, this.zzo);
|
||||
SafeParcelWriter.finishObjectHeader(parcel, beginObjectHeader);
|
||||
}
|
||||
|
||||
@Override // com.google.android.gms.common.stats.StatsEvent
|
||||
public final int zza() {
|
||||
return this.zzc;
|
||||
}
|
||||
|
||||
@Override // com.google.android.gms.common.stats.StatsEvent
|
||||
public final long zzb() {
|
||||
return this.zzp;
|
||||
}
|
||||
|
||||
@Override // com.google.android.gms.common.stats.StatsEvent
|
||||
public final long zzc() {
|
||||
return this.zzb;
|
||||
}
|
||||
|
||||
@Override // com.google.android.gms.common.stats.StatsEvent
|
||||
public final String zzd() {
|
||||
List list = this.zzh;
|
||||
String str = this.zzd;
|
||||
int i = this.zzg;
|
||||
String join = list == null ? "" : TextUtils.join(",", list);
|
||||
int i4 = this.zzk;
|
||||
String str2 = this.zze;
|
||||
if (str2 == null) {
|
||||
str2 = "";
|
||||
}
|
||||
String str3 = this.zzl;
|
||||
if (str3 == null) {
|
||||
str3 = "";
|
||||
}
|
||||
float f2 = this.zzm;
|
||||
String str4 = this.zzf;
|
||||
return "\t" + str + "\t" + i + "\t" + join + "\t" + i4 + "\t" + str2 + "\t" + str3 + "\t" + f2 + "\t" + (str4 != null ? str4 : "") + "\t" + this.zzo;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.google.android.gms.common.stats;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import com.google.android.gms.common.annotation.KeepForSdk;
|
||||
import java.util.List;
|
||||
|
||||
@KeepForSdk
|
||||
@Deprecated
|
||||
/* loaded from: classes3.dex */
|
||||
public class WakeLockTracker {
|
||||
private static WakeLockTracker zza = new WakeLockTracker();
|
||||
|
||||
@KeepForSdk
|
||||
public static WakeLockTracker getInstance() {
|
||||
return zza;
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void registerAcquireEvent(Context context, Intent intent, String str, String str2, String str3, int i, String str4) {
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void registerDeadlineEvent(Context context, String str, String str2, String str3, int i, List<String> list, boolean z3, long j4) {
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void registerEvent(Context context, String str, int i, String str2, String str3, String str4, int i4, List<String> list) {
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void registerReleaseEvent(Context context, Intent intent) {
|
||||
}
|
||||
|
||||
@KeepForSdk
|
||||
public void registerEvent(Context context, String str, int i, String str2, String str3, String str4, int i4, List<String> list, long j4) {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
package com.google.android.gms.common.stats;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import com.google.android.gms.common.internal.safeparcel.SafeParcelReader;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public final class zza implements Parcelable.Creator {
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public final /* bridge */ /* synthetic */ Object createFromParcel(Parcel parcel) {
|
||||
int validateObjectHeader = SafeParcelReader.validateObjectHeader(parcel);
|
||||
int i = 0;
|
||||
int i4 = 0;
|
||||
int i5 = 0;
|
||||
int i6 = 0;
|
||||
boolean z3 = false;
|
||||
long j4 = 0;
|
||||
long j5 = 0;
|
||||
long j6 = 0;
|
||||
String str = null;
|
||||
ArrayList<String> arrayList = null;
|
||||
String str2 = null;
|
||||
String str3 = null;
|
||||
String str4 = null;
|
||||
String str5 = null;
|
||||
float f2 = 0.0f;
|
||||
while (parcel.dataPosition() < validateObjectHeader) {
|
||||
int readHeader = SafeParcelReader.readHeader(parcel);
|
||||
switch (SafeParcelReader.getFieldId(readHeader)) {
|
||||
case 1:
|
||||
i = SafeParcelReader.readInt(parcel, readHeader);
|
||||
break;
|
||||
case 2:
|
||||
j4 = SafeParcelReader.readLong(parcel, readHeader);
|
||||
break;
|
||||
case 3:
|
||||
case 7:
|
||||
case 9:
|
||||
default:
|
||||
SafeParcelReader.skipUnknownField(parcel, readHeader);
|
||||
break;
|
||||
case 4:
|
||||
str = SafeParcelReader.createString(parcel, readHeader);
|
||||
break;
|
||||
case 5:
|
||||
i5 = SafeParcelReader.readInt(parcel, readHeader);
|
||||
break;
|
||||
case 6:
|
||||
arrayList = SafeParcelReader.createStringList(parcel, readHeader);
|
||||
break;
|
||||
case 8:
|
||||
j5 = SafeParcelReader.readLong(parcel, readHeader);
|
||||
break;
|
||||
case 10:
|
||||
str3 = SafeParcelReader.createString(parcel, readHeader);
|
||||
break;
|
||||
case 11:
|
||||
i4 = SafeParcelReader.readInt(parcel, readHeader);
|
||||
break;
|
||||
case 12:
|
||||
str2 = SafeParcelReader.createString(parcel, readHeader);
|
||||
break;
|
||||
case 13:
|
||||
str4 = SafeParcelReader.createString(parcel, readHeader);
|
||||
break;
|
||||
case 14:
|
||||
i6 = SafeParcelReader.readInt(parcel, readHeader);
|
||||
break;
|
||||
case 15:
|
||||
f2 = SafeParcelReader.readFloat(parcel, readHeader);
|
||||
break;
|
||||
case 16:
|
||||
j6 = SafeParcelReader.readLong(parcel, readHeader);
|
||||
break;
|
||||
case 17:
|
||||
str5 = SafeParcelReader.createString(parcel, readHeader);
|
||||
break;
|
||||
case 18:
|
||||
z3 = SafeParcelReader.readBoolean(parcel, readHeader);
|
||||
break;
|
||||
}
|
||||
}
|
||||
SafeParcelReader.ensureAtEnd(parcel, validateObjectHeader);
|
||||
return new WakeLockEvent(i, j4, i4, str, i5, arrayList, str2, j5, i6, str3, str4, f2, j6, str5, z3);
|
||||
}
|
||||
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public final /* synthetic */ Object[] newArray(int i) {
|
||||
return new WakeLockEvent[i];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user