
Engenharia reversa de Android para humanos e agentes de IA: Java tipado em milissegundos, xrefs, reconhecimento de API e segredos, diff de APK, re-assinatura, um visualizador nativo e um servidor MCP. Um único executável Rust, sem JVM.
Abra qualquer aplicativo Android e veja o que ele realmente faz.
O que ele coleta, como ele lucra com você, o que ele expõe. Em segundos, como Java legível.
Visualizador, CLI e servidor MCP para agentes de IA. Um único executável. Sem necessidade de Java.
Cada uma exigiu a leitura conjunta do manifesto, dos recursos e do código descompilado. Um grep por
http:// não encontra nada disso. Clique em uma descoberta para ver a prova: saída real, reduzida às linhas que importam.
Block Blast! 10.9.3 (build da Play), 75.938 classes, escaneado em 3,1 s.
Quem recebe seus dados: AppLovin MAX, AdMob, Meta, Unity, ironSource, Pangle, Liftoff/Vungle, InMobi,
Moloco, Amazon APS, Digital Turbine/Fyber, PubMatic, Bigo. Rastreadores: AppsFlyer, Firebase, eventos do Facebook e
do TikTok, ThinkingData, o próprio cn.hsdata do estúdio. Permissões: ID de publicidade e todas as quatro
APIs de anúncios do Privacy Sandbox.
Dois endpoints não são de nenhum SDK. infer é uma chamada de modelo: quanto valem os anúncios deste jogador?
$ 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());
Esses campos preenchem deviceModel, ram, disk, cpu, carrier, country, ip_country, timeZone,
install_time, cold_start_num e seus anúncios anteriores com sua revenue. A resposta define seu preço
mínimo, o lance mais baixo que um anunciante precisa superar para exibir um anúncio para você:
$ 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"
Veredito: legal, e como funcionam os jogos financiados por anúncios. Agora você pode ver.
O Block Blast oculta suas classes de jogo atrás de um packer da NetEase: org.cocos2dx.javascript.AppActivity não está
no APK. O apkscope dump permitiu que o jogo se desempacotasse sozinho e extraiu 15 DEX da memória em 25 s, cerca de
3.100 classes ocultas. Os scripts chamam Java através de JsCallJava; seus métodos mostram o que eles solicitam:
$ 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 nos scripts do jogo,
e o jogo se lembra disso. Os jogos usam isso para agir de forma diferente enquanto uma loja os avalia; o que
o Block Blast altera está em seus scripts criptografados, então não afirmamos mais do que isso.callNativeGetLeftBattery (bateria %), callNativeIsInstallOtherApp
(o app X está instalado?), getDeviceInfoByAdb (velocidades de CPU, RAM, armazenamento, tela, modelo).trackGameEndRevenue armazena dados de receita ao final de cada jogo.BleBumpKit emparelha dois telefones próximos, após pedir permissão.Não mostrado: como ele decide seus próximos blocos. Isso está nos scripts criptografados (veja limites).
O provedor de banco de dados de arquivos é exportado, e suas tags <path-permission> nomeiam uma permissão literalmente
chamada "false". A única proteção real está no código, e ela ignora file/, dir/ e a raiz:
$ 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)) {
(Rótulos de casos recolhidos, comentários adicionados.) insert, update e delete usam a mesma verificação. A tabela
contém path, path_decrypted, file_owner, sharees, share_by_link, metadata_gps...
Veredito: qualquer aplicação instalada pode ler os seus nomes de ficheiros, pastas e partilhas, incluindo nomes desencriptados de ficheiros com encriptação ponta a ponta, e alterar ou eliminar linhas. O GitHub Security Lab assinalou-o em 2021; a injeção SQL desse relatório foi corrigida, o acesso aberto continua lá na 35.0.1. Lido a partir do código, não executado num 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);