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,109 @@
|
||||
package com.google.firebase.messaging;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.google.android.gms.common.internal.Preconditions;
|
||||
import com.google.android.gms.tasks.Task;
|
||||
import com.google.android.gms.tasks.TaskCompletionSource;
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
/* loaded from: classes3.dex */
|
||||
public class ImageDownload implements Closeable {
|
||||
private static final int MAX_IMAGE_SIZE_BYTES = 1048576;
|
||||
private volatile Future<?> future;
|
||||
private Task<Bitmap> task;
|
||||
private final URL url;
|
||||
|
||||
private ImageDownload(URL url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
private byte[] blockingDownloadBytes() throws IOException {
|
||||
URLConnection openConnection = this.url.openConnection();
|
||||
if (openConnection.getContentLength() > MAX_IMAGE_SIZE_BYTES) {
|
||||
throw new IOException("Content-Length exceeds max size of 1048576");
|
||||
}
|
||||
InputStream inputStream = openConnection.getInputStream();
|
||||
try {
|
||||
byte[] byteArray = ByteStreams.toByteArray(ByteStreams.limit(inputStream, 1048577L));
|
||||
if (inputStream != null) {
|
||||
inputStream.close();
|
||||
}
|
||||
if (Log.isLoggable(Constants.TAG, 2)) {
|
||||
Log.v(Constants.TAG, "Downloaded " + byteArray.length + " bytes from " + this.url);
|
||||
}
|
||||
if (byteArray.length <= MAX_IMAGE_SIZE_BYTES) {
|
||||
return byteArray;
|
||||
}
|
||||
throw new IOException("Image exceeds max size of 1048576");
|
||||
} catch (Throwable th) {
|
||||
if (inputStream != null) {
|
||||
try {
|
||||
inputStream.close();
|
||||
} catch (Throwable th2) {
|
||||
th.addSuppressed(th2);
|
||||
}
|
||||
}
|
||||
throw th;
|
||||
}
|
||||
}
|
||||
|
||||
public static ImageDownload create(String str) {
|
||||
if (TextUtils.isEmpty(str)) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return new ImageDownload(new URL(str));
|
||||
} catch (MalformedURLException unused) {
|
||||
Log.w(Constants.TAG, "Not downloading image, bad URL: " + str);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public /* synthetic */ void lambda$start$0(TaskCompletionSource taskCompletionSource) {
|
||||
try {
|
||||
taskCompletionSource.setResult(blockingDownload());
|
||||
} catch (Exception e4) {
|
||||
taskCompletionSource.setException(e4);
|
||||
}
|
||||
}
|
||||
|
||||
public Bitmap blockingDownload() throws IOException {
|
||||
if (Log.isLoggable(Constants.TAG, 4)) {
|
||||
Log.i(Constants.TAG, "Starting download of: " + this.url);
|
||||
}
|
||||
byte[] blockingDownloadBytes = blockingDownloadBytes();
|
||||
Bitmap decodeByteArray = BitmapFactory.decodeByteArray(blockingDownloadBytes, 0, blockingDownloadBytes.length);
|
||||
if (decodeByteArray == null) {
|
||||
throw new IOException("Failed to decode image: " + this.url);
|
||||
}
|
||||
if (Log.isLoggable(Constants.TAG, 3)) {
|
||||
Log.d(Constants.TAG, "Successfully downloaded image: " + this.url);
|
||||
}
|
||||
return decodeByteArray;
|
||||
}
|
||||
|
||||
@Override // java.io.Closeable, java.lang.AutoCloseable
|
||||
public void close() {
|
||||
this.future.cancel(true);
|
||||
}
|
||||
|
||||
public Task<Bitmap> getTask() {
|
||||
return (Task) Preconditions.checkNotNull(this.task);
|
||||
}
|
||||
|
||||
public void start(ExecutorService executorService) {
|
||||
TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
|
||||
this.future = executorService.submit(new i(this, taskCompletionSource, 3));
|
||||
this.task = taskCompletionSource.getTask();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user