
Обратная разработка Android для людей и ИИ-агентов: типизированный Java за миллисекунды, перекрёстные ссылки, разведка API и секретов, сравнение APK, повторное подписывание, нативный просмотрщик и MCP-сервер. Один исполняемый файл на Rust, без JVM.
Откройте любое Android-приложение и узнайте, что оно на самом деле делает.
Что оно собирает, как зарабатывает на вас, что раскрывает. За секунды, в читаемом виде Java.
Просмотрщик, CLI и MCP-сервер для ИИ-агентов. Один исполняемый файл. Java не требуется.
Каждая находка потребовала совместного чтения манифеста, ресурсов и декомпилированного кода. Поиск по
http:// не находит ничего из этого. Нажмите на находку, чтобы увидеть доказательство: реальный вывод, урезанный до значимых строк.
Block Blast! 10.9.3 (сборка Play), 75 938 классов, просканировано за 3,1 с.
Кто получает ваши данные: AppLovin MAX, AdMob, Meta, Unity, ironSource, Pangle, Liftoff/Vungle, InMobi,
Moloco, Amazon APS, Digital Turbine/Fyber, PubMatic, Bigo. Трекеры: AppsFlyer, Firebase, события Facebook и
TikTok, ThinkingData, собственный cn.hsdata студии. Разрешения: рекламный идентификатор и все четыре
API рекламы Privacy Sandbox.
Две конечные точки не принадлежат ни одному SDK. infer — это вызов модели: сколько стоят рекламные показы этому игроку?
$ 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());
Они заполняют deviceModel, ram, disk, cpu, carrier, country, ip_country, timeZone,
install_time, cold_start_num и вашу прошлую рекламу с её revenue. Ответ задаёт вашу минимальную
цену — наименьшую ставку, которую рекламодатель должен превзойти, чтобы показать вам рекламу:
$ 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"
Вердикт: легально, и как работают игры с рекламным финансированием. Теперь вы это видите.
Block Blast скрывает свои игровые классы за упаковщиком NetEase: org.cocos2dx.javascript.AppActivity отсутствует
в APK. apkscope dump позволил игре распаковать себя и извлёк 15 DEX из памяти за 25 с, около
3 100 скрытых классов. Скрипты вызывают Java через JsCallJava; его методы показывают, что они запрашивают:
$ 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 в скриптах игры, и игра его запоминает. Игры используют это, чтобы вести себя иначе, пока магазин их проверяет; что именно меняет Block Blast, находится в его зашифрованных скриптах, поэтому мы не утверждаем большего.callNativeGetLeftBattery (заряд батареи в %), callNativeIsInstallOtherApp (установлено ли приложение X?), getDeviceInfoByAdb (частоты CPU, RAM, хранилище, экран, модель).trackGameEndRevenue сохраняет данные о доходе в конце каждой игры.BleBumpKit сопрягает два телефона поблизости, предварительно запросив разрешение.Не показано: как он определяет ваши следующие блоки. Это находится в зашифрованных скриптах (см. ограничения).
Провайдер базы данных файлов экспортирован, а его теги <path-permission> указывают разрешение, буквально называемое "false". Единственная реальная защита находится в коде, и она пропускает file/, dir/ и корень:
$ 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)) {
(Метки case свёрнуты, комментарии добавлены.) insert, update и delete используют одну и ту же проверку. Таблица
содержит path, path_decrypted, file_owner, sharees, share_by_link, metadata_gps...
Вердикт: любое установленное приложение может читать ваши имена файлов, папки и общие ресурсы, включая расшифрованные имена файлов со сквозным шифрованием, а также изменять или удалять строки. GitHub Security Lab отметил это в 2021 году; SQL-инъекция из того отчёта была исправлена, открытый доступ по-прежнему присутствует в 35.0.1. Прочитано по коду, не запускалось на устройстве.
$ 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);