
Android-Reverse-Engineering für Menschen und KI-Agenten: typisiertes Java in Millisekunden, Xrefs, API- und Secret-Recon, APK-Diff, erneutes Signieren, ein nativer Viewer und ein MCP-Server. Eine einzige Rust-Executable, keine JVM.
Öffne eine beliebige Android-App und sieh, was sie wirklich tut.
Was sie sammelt, wie sie mit dir Geld verdient, was sie preisgibt. In Sekunden, als lesbares Java.
Viewer, CLI und MCP-Server für KI-Agenten. Eine ausführbare Datei. Kein Java erforderlich.
Jeder einzelne erforderte, das Manifest, die Ressourcen und den dekompilierten Code zusammen zu lesen. Eine Suche nach
http:// findet nichts davon. Klicke auf einen Befund für den Beweis: echte Ausgabe, gekürzt auf die Zeilen, die zählen.
Block Blast! 10.9.3 (Play-Build), 75.938 Klassen, in 3,1 s gescannt.
Wer deine Daten bekommt: AppLovin MAX, AdMob, Meta, Unity, ironSource, Pangle, Liftoff/Vungle, InMobi,
Moloco, Amazon APS, Digital Turbine/Fyber, PubMatic, Bigo. Tracker: AppsFlyer, Firebase, Facebook- und
TikTok-Events, ThinkingData, das eigene cn.hsdata des Studios. Berechtigungen: Werbe-ID und alle vier
Privacy-Sandbox-Ad-APIs.
Zwei Endpunkte stammen aus keinem SDK. infer ist ein Modellaufruf: Was sind die Werbeeinnahmen dieses Spielers wert?
$ 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());
Diese füllen deviceModel, ram, disk, cpu, carrier, country, ip_country, timeZone,
install_time, cold_start_num und deine bisherigen Anzeigen mit ihrem revenue. Die Antwort legt deinen Mindestpreis fest,
den niedrigsten Gebotspreis, den ein Werbetreibender übertreffen muss, um dir eine Anzeige anzuzeigen:
$ 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"
Urteil: legal, und wie werbefinanzierte Spiele funktionieren. Jetzt können Sie es sehen.
Block Blast versteckt seine Spielklassen hinter einem NetEase-Packer: org.cocos2dx.javascript.AppActivity ist nicht
in der APK. apkscope dump ließ das Spiel sich selbst entpacken und holte 15 DEX in 25 s aus dem Speicher, etwa
3.100 versteckte Klassen. Die Skripte rufen Java über JsCallJava auf; dessen Methoden zeigen, wonach sie fragen:
$ 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 in den Skripten des Spiels,
und das Spiel merkt es sich. Spiele nutzen dies, um sich anders zu verhalten, während ein Store sie überprüft; was
Block Blast ändert, steckt in seinen verschlüsselten Skripten, daher behaupten wir nicht mehr.callNativeGetLeftBattery (Akku in %), callNativeIsInstallOtherApp
(ist App X installiert?), getDeviceInfoByAdb (CPU-Geschwindigkeiten, RAM, Speicher, Bildschirm, Modell).trackGameEndRevenue speichert Umsatzdaten am Ende jedes Spiels.BleBumpKit koppelt zwei Telefone in der Nähe, nachdem es um Erlaubnis gebeten hat.Nicht gezeigt: wie es deine nächsten Blöcke bestimmt. Das steckt in den verschlüsselten Skripten (siehe Grenzen).
Der Dateidatenbank-Provider ist exportiert, und seine <path-permission>-Tags nennen eine Berechtigung, die buchstäblich
"false" heißt. Die einzige echte Absicherung liegt im Code, und sie überspringt file/, dir/ und das Root-Verzeichnis:
$ 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)) {
(Datenbankfallbezeichnungen zusammengefasst, Kommentare hinzugefügt.) insert, update und delete verwenden dieselbe Prüfung. Die Tabelle
enthält path, path_decrypted, file_owner, sharees, share_by_link, metadata_gps...
Urteil: Jede installierte App kann Ihre Dateinamen, Ordner und Freigaben lesen, einschließlich der entschlüsselten Namen von Ende-zu-Ende-verschlüsselten Dateien, und Zeilen ändern oder löschen. GitHub Security Lab hat es 2021 vermerkt; die SQL-Injection aus diesem Bericht wurde behoben, der offene Zugriff ist in 35.0.1 weiterhin vorhanden. Aus dem Code gelesen, nicht auf einem Gerät ausgeführt.
$ 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);