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,29 @@
|
||||
package com.google.firebase.crashlytics.internal.stacktrace;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public class MiddleOutFallbackStrategy implements StackTraceTrimmingStrategy {
|
||||
private final int maximumStackSize;
|
||||
private final MiddleOutStrategy middleOutStrategy;
|
||||
private final StackTraceTrimmingStrategy[] trimmingStrategies;
|
||||
|
||||
public MiddleOutFallbackStrategy(int i, StackTraceTrimmingStrategy... stackTraceTrimmingStrategyArr) {
|
||||
this.maximumStackSize = i;
|
||||
this.trimmingStrategies = stackTraceTrimmingStrategyArr;
|
||||
this.middleOutStrategy = new MiddleOutStrategy(i);
|
||||
}
|
||||
|
||||
@Override // com.google.firebase.crashlytics.internal.stacktrace.StackTraceTrimmingStrategy
|
||||
public StackTraceElement[] getTrimmedStackTrace(StackTraceElement[] stackTraceElementArr) {
|
||||
if (stackTraceElementArr.length <= this.maximumStackSize) {
|
||||
return stackTraceElementArr;
|
||||
}
|
||||
StackTraceElement[] stackTraceElementArr2 = stackTraceElementArr;
|
||||
for (StackTraceTrimmingStrategy stackTraceTrimmingStrategy : this.trimmingStrategies) {
|
||||
if (stackTraceElementArr2.length <= this.maximumStackSize) {
|
||||
break;
|
||||
}
|
||||
stackTraceElementArr2 = stackTraceTrimmingStrategy.getTrimmedStackTrace(stackTraceElementArr);
|
||||
}
|
||||
return stackTraceElementArr2.length > this.maximumStackSize ? this.middleOutStrategy.getTrimmedStackTrace(stackTraceElementArr2) : stackTraceElementArr2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.google.firebase.crashlytics.internal.stacktrace;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public class MiddleOutStrategy implements StackTraceTrimmingStrategy {
|
||||
private final int trimmedSize;
|
||||
|
||||
public MiddleOutStrategy(int i) {
|
||||
this.trimmedSize = i;
|
||||
}
|
||||
|
||||
@Override // com.google.firebase.crashlytics.internal.stacktrace.StackTraceTrimmingStrategy
|
||||
public StackTraceElement[] getTrimmedStackTrace(StackTraceElement[] stackTraceElementArr) {
|
||||
int length = stackTraceElementArr.length;
|
||||
int i = this.trimmedSize;
|
||||
if (length <= i) {
|
||||
return stackTraceElementArr;
|
||||
}
|
||||
int i4 = i / 2;
|
||||
int i5 = i - i4;
|
||||
StackTraceElement[] stackTraceElementArr2 = new StackTraceElement[i];
|
||||
System.arraycopy(stackTraceElementArr, 0, stackTraceElementArr2, 0, i5);
|
||||
System.arraycopy(stackTraceElementArr, stackTraceElementArr.length - i4, stackTraceElementArr2, i5, i4);
|
||||
return stackTraceElementArr2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.google.firebase.crashlytics.internal.stacktrace;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public class RemoveRepeatsStrategy implements StackTraceTrimmingStrategy {
|
||||
private final int maxRepetitions;
|
||||
|
||||
public RemoveRepeatsStrategy() {
|
||||
this(1);
|
||||
}
|
||||
|
||||
private static boolean isRepeatingSequence(StackTraceElement[] stackTraceElementArr, int i, int i4) {
|
||||
int i5 = i4 - i;
|
||||
if (i4 + i5 > stackTraceElementArr.length) {
|
||||
return false;
|
||||
}
|
||||
for (int i6 = 0; i6 < i5; i6++) {
|
||||
if (!stackTraceElementArr[i + i6].equals(stackTraceElementArr[i4 + i6])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static StackTraceElement[] trimRepeats(StackTraceElement[] stackTraceElementArr, int i) {
|
||||
int i4;
|
||||
HashMap hashMap = new HashMap();
|
||||
StackTraceElement[] stackTraceElementArr2 = new StackTraceElement[stackTraceElementArr.length];
|
||||
int i5 = 0;
|
||||
int i6 = 0;
|
||||
int i7 = 1;
|
||||
while (i5 < stackTraceElementArr.length) {
|
||||
StackTraceElement stackTraceElement = stackTraceElementArr[i5];
|
||||
Integer num = (Integer) hashMap.get(stackTraceElement);
|
||||
if (num == null || !isRepeatingSequence(stackTraceElementArr, num.intValue(), i5)) {
|
||||
stackTraceElementArr2[i6] = stackTraceElementArr[i5];
|
||||
i6++;
|
||||
i7 = 1;
|
||||
i4 = i5;
|
||||
} else {
|
||||
int intValue = i5 - num.intValue();
|
||||
if (i7 < i) {
|
||||
System.arraycopy(stackTraceElementArr, i5, stackTraceElementArr2, i6, intValue);
|
||||
i6 += intValue;
|
||||
i7++;
|
||||
}
|
||||
i4 = (intValue - 1) + i5;
|
||||
}
|
||||
hashMap.put(stackTraceElement, Integer.valueOf(i5));
|
||||
i5 = i4 + 1;
|
||||
}
|
||||
StackTraceElement[] stackTraceElementArr3 = new StackTraceElement[i6];
|
||||
System.arraycopy(stackTraceElementArr2, 0, stackTraceElementArr3, 0, i6);
|
||||
return stackTraceElementArr3;
|
||||
}
|
||||
|
||||
@Override // com.google.firebase.crashlytics.internal.stacktrace.StackTraceTrimmingStrategy
|
||||
public StackTraceElement[] getTrimmedStackTrace(StackTraceElement[] stackTraceElementArr) {
|
||||
StackTraceElement[] trimRepeats = trimRepeats(stackTraceElementArr, this.maxRepetitions);
|
||||
return trimRepeats.length < stackTraceElementArr.length ? trimRepeats : stackTraceElementArr;
|
||||
}
|
||||
|
||||
public RemoveRepeatsStrategy(int i) {
|
||||
this.maxRepetitions = i;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.google.firebase.crashlytics.internal.stacktrace;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public interface StackTraceTrimmingStrategy {
|
||||
StackTraceElement[] getTrimmedStackTrace(StackTraceElement[] stackTraceElementArr);
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.google.firebase.crashlytics.internal.stacktrace;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public class TrimmedThrowableData {
|
||||
public final TrimmedThrowableData cause;
|
||||
public final String className;
|
||||
public final String localizedMessage;
|
||||
public final StackTraceElement[] stacktrace;
|
||||
|
||||
private TrimmedThrowableData(String str, String str2, StackTraceElement[] stackTraceElementArr, TrimmedThrowableData trimmedThrowableData) {
|
||||
this.localizedMessage = str;
|
||||
this.className = str2;
|
||||
this.stacktrace = stackTraceElementArr;
|
||||
this.cause = trimmedThrowableData;
|
||||
}
|
||||
|
||||
public static TrimmedThrowableData makeTrimmedThrowableData(Throwable th, StackTraceTrimmingStrategy stackTraceTrimmingStrategy) {
|
||||
Stack stack = new Stack();
|
||||
while (th != null) {
|
||||
stack.push(th);
|
||||
th = th.getCause();
|
||||
}
|
||||
TrimmedThrowableData trimmedThrowableData = null;
|
||||
while (!stack.isEmpty()) {
|
||||
Throwable th2 = (Throwable) stack.pop();
|
||||
trimmedThrowableData = new TrimmedThrowableData(th2.getLocalizedMessage(), th2.getClass().getName(), stackTraceTrimmingStrategy.getTrimmedStackTrace(th2.getStackTrace()), trimmedThrowableData);
|
||||
}
|
||||
return trimmedThrowableData;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user