检查 Android 发布包
打开 APK 或 AAB,查看发布风险,再检查原生库对齐与签名指纹。
静态检查提示文件层面的风险,不能保证 Google Play 审核通过。
本地文件分析 · 构建排障 · 逆向工程
用免费浏览器工具和可复现的指南,找到下一步。
识别未知文件、检查 Android 发布包,或追查 JavaScript 报错。工具在浏览器本地解析,文件不上传。需要进一步分析时,可继续阅读 REA 系列教程;REA 是 morluto 开发的开源逆向工程 MCP 服务器和命令行工具。
打开 APK 或 AAB,查看发布风险,再检查原生库对齐与签名指纹。
静态检查提示文件层面的风险,不能保证 Google Play 审核通过。
先读魔数判断格式;遇到可执行文件,再查看架构和文件头,不运行输入文件。
识别结果只是起点,选择解析器前请核对具体证据。
把线上报错堆栈与 source map 对应起来,或将打包后的脚本还原为便于阅读的代码。
缺少映射、源码内容或原始名称时,可恢复的内容会受限。
用 npx rea-agents setup 安装 REA:Node 版本要求、锁定版本的 MCP 注册、--client 与 --dry-run、更新、rea doctor 排错和第一次分析。
确认装的是正版 REA:核对官方仓库和 npm 包名,用 npm view 查元数据,用 npm audit signatures 验证 provenance,发现假冒去哪举报。
没有扩展名的文件,看前几个字节就能认:用 file、xxd 或 Format-Hex 读文件头,区分 APK、NuGet 等 ZIP 格式,再交给对应的工具打开。
用 security cms、openssl、plutil 解开 iOS 描述文件,读出 entitlements、团队、UDID、过期时间和证书,再和 App 的实际签名对比。
在浏览器里打开 ELF、PE 或 Mach-O 文件,查看架构、带熵值的节区、导入导出和字符串,并判断二进制有没有被 strip,文件不上传。
用 REA 在 CLI 或 AI agent 里驱动 Ghidra 无头分析:配置与 doctor 检查,decompile、xrefs、trace 命令,附一个带标准答案的样本。
不运行程序也能逆向 macOS 应用:bundle 结构、Info.plist、Mach-O 切片、签名、dylib 加载、NIB 菜单和 Swift 类,全部在 Rectangle 上实测。
不运行程序,判断 Windows EXE 或 DLL 是 x86、x64 还是 ARM64;讲清 .NET AnyCPU 程序集为什么看起来像 32 位,以及怎么读 CLI 标志。
复现 dyld 的 Library not loaded @rpath 崩溃,读懂 tried 路径,用 otool 查 rpath,再用 install_name_tool 或随包附带 dylib 修好。
用 Frida Interceptor 在 Android 模拟器里 hook 一个 C 函数:frida-server 部署、-rdynamic 导出坑、spawn 与 attach 区别、frida-trace,以及 macOS 上为何超时。
一步步逆向 EXE 或 DLL:先判断原生还是 .NET,再看导出表和导入表、解码版本与字符串资源,最后读导出函数背后的机器码。
go version -m 能从任意 Go 可执行文件读出 Go 版本、依赖模块、replace 替换和 VCS 提交,去符号、交叉编译后也一样。附 gh、cloudflared 实测。
发布前确认自己的 ELF、PE、Mach-O 构建开了 NX、PIE、完整 RELRO、栈保护、ASLR、CFG 和 Hardened Runtime:真实输出、参数和结果解读。
判断 Mac 应用或 dylib 是不是通用二进制,列出 arm64 和 x86_64 切片,逐个对比最低系统版本、签名和依赖库;手边没有 Mac 也能查。
找到各平台上的 app.asar,用浏览器或 npx @electron/asar 解包,再按顺序读 package.json、main、preload 和 IPC 通道。
在真实的 Electron 应用 Joplin 3.7.22 上逆向分析:复制并解开 app.asar,读 webPreferences 和 preload,梳理 IPC 通道,找出原生 addon,检查 fuses。全部是真实输出。
obfuscator.io 反混淆能还原什么:字符串数组、base64 与 RC4、包装函数和控制流平坦化都能解开,renameProperties 和局部变量名还原不了。14 组参数实测。
还原压缩过的 webpack bundle:从 .map 的 sourcesContent 直接取回源码,用 Wakaru 拆开模块表,再用 REA 梳理 chunk、模块和请求。全部是真实输出。
发版前查出 source map 泄露:用 npm pack --dry-run 找 .map 文件,看 sourcesContent 暴露了什么,在生产环境关闭或隐藏 source map,并在 CI 里拦住。
把 app.js:1:68 这样的压缩代码报错还原成原始文件、行号和名称:保留 hidden source map,在本地逐帧查询,并排查 map 与 bundle 对不上的情况。
用 bundletool build-apks --mode=universal 把 AAB 转成通用 APK,按设备提取拆分包,再用 unzip 取出 APK 里的 assets。附 bundletool 1.18.3 真实输出。
用 adb logcat -b crash -d 读出 Android 崩溃,在 adb bugreport 里找到原生 tombstone,再用 ndk-stack 对应回源码行。全部是模拟器上的真实输出。
检查 APK/AAB 是否满足 Android 16 KB 页面大小要求,Flutter、React Native 构建同样适用:ELF 段对齐、.so 在 ZIP 内的对齐和 64 位库,可在浏览器里查,也可用 zipalign 复核。
Firebase、Google 登录、assetlinks.json 要的 SHA-1 / SHA-256 签名指纹怎么取:keytool -list -v 查 JKS 和 PKCS#12、signingReport、apksigner 查 APK,附实测输出和常见坑。
Android 开发者验证要填包名和签名证书 SHA-256 指纹。从 APK、AAB 或 keystore 读出这两个值,选对要登记的密钥,并弄清 2026-09-30 起哪些安装受影响。
Play Protect 为什么拦截线下分发的 App(短信与无障碍权限、targetSdk 过旧、调试密钥、ZIP 不规范),每一项怎么修,以及 Play Protect 申诉表要填什么。
查出一个 APK 是哪个 Flutter / Dart 版本编译的,以及 libapp.so 里有什么:快照哈希、裸 Dart 版本字符串、引擎 Build ID 和依赖包 URI,并用 llvm-readelf 核对。
谷歌上架被拒,很多原因就写在安装包里:targetSdk 不达标、缺 64 位和 16 KB 原生库、调试签名、敏感权限没声明、前台服务类型缺权限。上传前逐项查出并修好。
把 JADX 以无头方式挂成 MCP Server,接入 Claude Code 或 Codex:JDK 17+、jadx-headless-mcp 0.7.1、env 配置、提问方式,以及一次真实的 Aegis APK 分析。
安装时提示“安装包与现有包冲突”或签名不一致?对比两个 APK 的证书 SHA-256,找出设备上已装的那一份,用正确的密钥修复,不丢用户数据。
手机提示“应用未安装:软件包似乎无效”?先用 adb 拿到真实的 INSTALL_PARSE_FAILED 代码,再从签名、resources.arsc、拆分包逐项修好 APK。
安装提示“应用与你的手机不兼容”或“安装包无效或不兼容”?先用 adb 拿到真实的 INSTALL_FAILED 代码,再逐项检查 targetSdk、原生库 ABI 和 minSdk。
崩溃堆栈只剩 a.c.b(r8-map-id-…:3)?讲清 mapping.txt 在哪、行号区间和内联组怎么读、retrace 怎么用,并和浏览器工具逐行对比。
REA 的 Android 工具各管什么、在哪里止步:JADX 搜类读代码、Apktool 字符串表与语言区域、ADB 拉取 split APK、Flutter 快照哈希。
安卓逆向入门:自己编译一道 APK 练习题,先在浏览器里体检,用 DEX 类浏览器定位校验方法,再用 JADX 和 REA 读懂逻辑,写脚本解出 flag 并在模拟器上验证。
第一道 CTF 逆向题怎么下手:识别文件类型、跑 strings、看导入和节区,再读懂校验逻辑写出解题脚本。全程用自己编译的练习程序演示。
把 HAR 发给客服之前先脱敏:Chrome 脱敏导出去掉了什么、漏掉了什么,token 藏在哪里,以及怎样在不上传文件的情况下按接口归纳 HAR。
把 WASM 转成 WAT,并在浏览器里查看 WebAssembly 模块的导入、导出、内存、函数和自定义段,再用 wabt 命令行逐项核对。
一个能在 Chrome 里跑起来的 WebMCP 示例:打开功能开关,用 registerTool 和带属性的表单注册工具,用 document.modelContext.getTools() 列出它们,再在版本之间对比工具变化。
读懂 PEM/DER 证书的主体、颁发者、SAN、有效期、密钥用途和指纹,再用 openssl verify 检查证书链,附 fullchain.pem 验证失败的原因。
没有 schema 时,protobuf/gRPC 二进制里能读出什么:wire type、zigzag、字符串与嵌套消息和 packed 的歧义、gRPC 帧头,对照 protoc 验证。
从文件字节分辨 .NET Framework EXE、apphost、单文件发布、ReadyToRun 和 NativeAOT,五种构建全部实测,附真实输出和可直接用的解析脚本。
不装 Visual Studio,也能查出 DLL 面向哪个 .NET 版本、程序集版本和文件版本、引用了哪些程序集:附 Newtonsoft.Json 13.0.3 八份构建的真实输出。
为什么 file 把 APK、IPA、JAR、DOCX 报成 Zip archive data,把签名描述文件报成 data,把半个 JAR 仍报成 JAR:25 个样本和背后的魔数规则。
亲手复现 UnsupportedClassVersionError 和 major version 61/65/69 报错,查清是哪个类、对应哪个 Java 版本,再用 --release 和 Gradle toolchain 修好。
补丁对比实操:自己编译 zlib 1.2.11 和 1.2.12,用 REA 调 Ghidra 比较 deflateInit2_ 与 compress_block,从真实 diff 里看到 CVE 修复。
用 REA 盘点并提取 Godot PCK,区分资源原路径、MD5 声明与实际 SHA-256;用正常、校验不一致和全零 MD5 三个样本说明结果边界。
在 Linux、macOS、Kali 上安装 Binwalk 3.1.0,避开 v2 软件包的坑,用 -e、-M 提取固件,排查“什么都没解出来”,并说明何时改用 Unblob。
在路由器固件 .bin 中定位 SquashFS 根文件系统,用 dd 切出、unsquashfs 解包,或交给 Binwalk 3、Unblob 一步完成,全程用 OpenWrt 官方镜像实测。
Etherscan 报 bytecode does not match、hardhat verify 失败?从链上代码读出 solc 版本,再用九组编译对照判断是源码不一致还是编译设置不对。
Etherscan 上合约没有验证源码,怎么判断是不是代理?从字节码识别 EIP-1967 代理和 EIP-1167 克隆,找到实现合约,并读出代币有哪些管理权限函数。
从引擎、费用、安装和写入能力对比 GhidraMCP、ida-pro-mcp、r2mcp、Binary Ninja MCP 和 REA,并在同一个二进制上实测了 GhidraMCP 与 REA。部分实测、部分资料整理,日期 2026-11。
对比 ILSpy 11.2、dnSpyEx 6.6.0 和 dotPeek 2026.2.4 的平台、许可证和调试能力,附同一个 DLL 的真实反编译输出,并写清楚在 macOS 上哪些实测了、哪些没有。
截至 2026 年 10 月对比 JADX 1.5.6、Apktool 3.0.3 和 JEB 5.48:各自输出什么、F-Droid APK 实测耗时、价格与许可证,以及 REA 如何接入。
Android
读取 APK 或 AAB 的 Manifest、原生库和签名证书,检查 16 KB 对齐、targetSdk 等最常卡住 Google Play 发版的规则。
区块链
粘贴已部署合约的字节码,列出全部 4 字节函数选择器,并用编译成 WebAssembly 的 EVMole 推断参数类型和状态可变性,不需要 ABI 或验证过的源码。
区块链
粘贴 EVM 字节码,得到按地址标注的操作码清单,单独解码 Solidity 的 CBOR 元数据尾部(solc 版本、IPFS/bzzr 哈希),并列出分发器中的函数选择器。全程在浏览器本地运行。
WebAssembly
打开 .wasm 文件,查看导入、导出、函数、内存和自定义段,并用 wabt 转成可读的 WAT 文本。
.NET
不运行程序就能检查 .NET DLL 或 EXE:PE/CLI 头、类型和成员表、引用的程序集,以及每个方法的 IL。
HAR / SAZ
载入 HAR 或 Fiddler SAZ 抓包文件,按域名和接口路径归纳请求,列出每个接口出现过的方法、状态码、查询参数和请求体字段。
Electron
在浏览器里解开 Electron 的 app.asar,浏览其中文件,并列出主进程与渲染进程之间的 IPC 通道和 preload 暴露的接口。
Source map
用 source map 的 sourcesContent 重建原始源码目录并打包下载,并把压缩后 bundle 中的位置或报错堆栈映射回原始文件、行号和名称。
ELF / PE / Mach-O
不运行程序就能识别 ELF、PE 或 Mach-O 文件:架构、文件头、带熵值的节区、导入导出符号、NX/PIE/RELRO/ASLR 等加固标志,以及可打印字符串。
Java / JAR
查 .class、JAR、WAR、EAR 或 AAR 需要哪个 Java 版本:逐类读出 class 文件版本(含嵌套 jar)、多版本分层、module-info 和构建 JDK,还能解读 UnsupportedClassVersionError 报错。
Protobuf / gRPC
把以十六进制、base64 粘贴或以文件打开的 protobuf、gRPC、gRPC-Web 二进制 body 解成字段号和值,输出与 protoc --decode_raw 完全一致,另有列出各种可能解读的树形视图。
Keystore / SHA-1
读取 .jks、.keystore、.p12、.pfx 密钥库、APK/AAB 或证书文件里的证书,给出 SHA-1、SHA-256 和 MD5 指纹,并按 Firebase、Google 登录和 Facebook 要求的冒号、无冒号和 Base64 格式列出,不用装 keytool。
X.509
粘贴 PEM 证书或证书链,或拖入 DER、CRT、CER 文件,查看全部字段和扩展(SAN、密钥用法、EKU、基本约束、AKI/SKI、AIA、CRL、SCT),检查证书链顺序,并显示每张证书当前是否在有效期内。
魔数 / 十六进制
按魔数判断未知文件是什么格式,给出依据所在的偏移和可信度;再扫描内嵌签名、画出熵图、提取字符串,并在十六进制视图里查看任意字节。几 GB 的文件也能处理。
R8 / ProGuard
粘贴混淆后的 Android 或 Java 崩溃堆栈,选择那次构建的 mapping.txt,还原出原始类名、方法名和行号,内联帧也会展开。输出与 Google 官方 retrace 一致。
反混淆
把压缩过或 obfuscator.io 风格混淆的 JavaScript 还原成可读代码:解开字符串数组,撤销控制流与死代码混淆,重命名 _0x 变量,并把 webpack、browserify 打包拆成模块。
iOS / IPA
在浏览器里读取 .mobileprovision 或 .ipa:描述文件类型、过期时间、团队、设备和证书,Info.plist 与隐私清单,以及可执行文件签入的 entitlements,并与描述文件逐项比对。