
Reverse engineering Android per esseri umani e agenti AI: Java tipizzato in millisecondi, xref, ricognizione di API e secret, diff di APK, ri-firma, un visualizzatore nativo e un server MCP. Un unico eseguibile Rust, senza JVM.
Apri qualsiasi app Android e scopri cosa fa davvero.
Cosa raccoglie, come ci guadagna alle tue spalle, cosa espone. In pochi secondi, come Java leggibile.
Viewer, CLI e server MCP per agenti AI. Un solo eseguibile. Nessun Java necessario.
Ognuno di questi risultati ha richiesto la lettura congiunta del manifest, delle risorse e del codice decompilato. Un grep per
http:// non ne trova nessuno. Clicca su un risultato per la prova: output reale, ridotto alle righe che contano.
Block Blast! 10.9.3 (build Play), 75.938 classi, analizzate in 3,1 s.
Chi riceve i tuoi dati: AppLovin MAX, AdMob, Meta, Unity, ironSource, Pangle, Liftoff/Vungle, InMobi,
Moloco, Amazon APS, Digital Turbine/Fyber, PubMatic, Bigo. Tracker: AppsFlyer, Firebase, eventi Facebook e
TikTok, ThinkingData, il cn.hsdata dello studio stesso. Permessi: advertising ID e tutte e quattro le
API pubblicitarie Privacy Sandbox.
Due endpoint non provengono da alcun SDK. infer è una chiamata a un modello: quanto valgono gli annunci di questo giocatore?
$ apkscope search blockblast.xapk urls
q.mb("https://low-ecpm.afafb.com/infer/v1/low_ecpm_cut", appActivity, jSONObject, new c() {
return "https://ecpm.afafb.com/infer/v1/ecpm";
$ apkscope decompile blockblast.xapk me.f # the code calls it AlgorithmInterCutManager
m2.mg(jSONObject, "ActUserInfo", ClassE.ma());
m2.me(jSONObject, "AdHistInfo", jSONArray);
m2.mg(jSONObject, "UserContext", ClassE.mc(str2, appActivity, z, UUID.randomUUID().toString(), "INTER"));
m2.mg(jSONObject, "UserInfo", ClassE.md());
Questi compilano deviceModel, ram, disk, cpu, carrier, country, ip_country, timeZone,
install_time, cold_start_num e i tuoi annunci passati con il loro revenue. La risposta imposta il tuo prezzo
minimo, l'offerta più bassa che un inserzionista deve superare per mostrarti un annuncio:
$ apkscope decompile blockblast.xapk v2.d --method Y # AlgorithmBy1004, AppLovin MAX
double d3 = d * d2; // floor = predicted eCPM x "floor_factor" (remote, default 2.0)
this.g_c.mi(d3);
String.format(Locale.locale_US, "算法接口成功更新底价 - FloorPrice: %.2f, ... // "algorithm API updated the floor price"
Verdetto: legale, e come funzionano i giochi finanziati dalla pubblicità. Ora puoi vederlo.
Block Blast nasconde le sue classi di gioco dietro un packer NetEase: org.cocos2dx.javascript.AppActivity non è
nell'APK. apkscope dump ha permesso al gioco di scompattarsi da solo e ha estratto 15 DEX dalla memoria in 25 s, circa
3.100 classi nascoste. Gli script chiamano Java tramite JsCallJava; i suoi metodi mostrano cosa richiedono:
$ apkscope dump com.block.juggle out/ --attach
$ apkscope decompile out/dex/classes9.dex org.cocos2dx.javascript.pay.o --method w # SPayManager.serverControl
if (jSONObject.has("isStatus")) {
boolean z = k0.ma("1", jSONObject.getString("isStatus"));
SPStore.mk().y(z);
JsCallJava.setGameAuditMode(z, "auditMode"); // → window.IPAUtils.respHearingState(1)
auditMode negli script del gioco, e il gioco lo memorizza. I giochi usano questo per comportarsi diversamente mentre uno store li esamina; ciò che Block Blast modifica è nei suoi script cifrati, quindi non affermiamo altro.callNativeGetLeftBattery (percentuale batteria), callNativeIsInstallOtherApp
(l'app X è installata?), getDeviceInfoByAdb (velocità CPU, RAM, archiviazione, schermo, modello).trackGameEndRevenue memorizza i dati sui ricavi alla fine di ogni partita.BleBumpKit accoppia due telefoni nelle vicinanze, dopo aver chiesto il permesso.Non mostrato: come decide i tuoi blocchi successivi. Questo è negli script cifrati (vedi limiti).
Il provider del database dei file è esportato, e i suoi tag <path-permission> indicano un permesso chiamato letteralmente
"false". L'unica vera protezione è nel codice, e salta file/, dir/ e la radice:
$ apkscope decompile nextcloud.apk com.owncloud.android.providers.FileContentProvider
private boolean isCallerNotAllowed(Uri uri) {
switch (i) {
case 4: case 5: case 6: case 7: case 8: // shares, capabilities, uploads, ...
str = this.mContext.getPackageManager().getNameForUid(Binder.getCallingUid());
}
return false; // file (1), dir (2), root (3): anyone
}
public Cursor query(Uri uri, ...) {
if (i != 1 && i != 2 && i != 3 && isCallerNotAllowed(uri)) {
(Le etichette dei casi sono state accorpate, i commenti aggiunti.) insert, update e delete usano lo stesso controllo. La tabella
contiene path, path_decrypted, file_owner, sharees, share_by_link, metadata_gps...
Verdetto: qualsiasi app installata può leggere i nomi dei tuoi file, le cartelle e le condivisioni, inclusi i nomi decifrati dei file con crittografia end-to-end, e modificare o eliminare righe. GitHub Security Lab lo ha segnalato nel 2021; l'iniezione SQL di quel report è stata corretta, l'accesso aperto è ancora presente nella 35.0.1. Letto dal codice, non eseguito su un dispositivo.
$ apkscope resource antennapod.apk res/xml/network_security_config.xml
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="user" />
<certificates src="system" />
$ apkscope decompile antennapod.apk de.danoeh.antennapod.net.ssl.CompositeX509TrustManager --method checkServerTrusted
X509TrustManager x509TrustManager = (X509TrustManager) iterator.next();
try {
x509TrustManager.checkServerTrusted(x509CertificateArr, str);