01. 安卓逆向基础、环境搭建与授权
边界说明本文只面向自研 Demo、开源靶场或已获得书面授权的 App。所有操作目标都是理解 Android 应用结构、验证安全风险、建设防护能力不用于未授权破解、盗号、绕过付费或攻击第三方服务。1. 本章目标学完本章后应能完成四件事能力说明验收方式理解 APK 构成知道 Manifest、DEX、资源、Native 库、签名各自负责什么能解压 APK 并标注每类文件用途搭建工具链准备 Android Studio、adb、jadx、apktool、apksigner、Frida、Burp/mitmproxy每个工具能输出版本或完成一次最小操作创建授权 Demo自己写一个包含登录、会员判断、HTTPS 请求、Native 方法的测试 App能安装运行 debug 和 release APK建立实验记录每次分析都有命令、截图、日志、结论和限制输出case-notes.md安卓逆向学习最常见的问题是直接上工具但不知道工具结果说明什么。本章先把 Android 应用的运行模型、工程产物和实验环境讲清楚后续静态、动态、Native、防护章节都围绕同一个 Demo 进行。2. Android 逆向必须先懂的基础2.1 APK 是什么APK 本质上是一个带签名的 ZIP 包。它不是单个可执行文件而是由多个层次组成文件或目录作用逆向关注点AndroidManifest.xml声明包名、权限、组件、入口、导出状态组件暴露、调试开关、备份开关、Deep Linkclasses.dexJava/Kotlin 编译后的 Dalvik 字节码业务逻辑、加密逻辑、风控判断、接口调用resources.arsc编译后的资源索引字符串、布局、资源 ID 映射res/布局、图片、字符串等资源页面结构、隐藏入口、硬编码文案assets/原样打包的资源文件配置、证书、模型文件、脚本lib/abi/*.soNative 动态库JNI、加密、反调试、完整性校验META-INF/或签名块APK 签名信息是否被重签名、签名方案版本逆向时不要只看 Java 反编译结果。很多关键逻辑会拆散在 Manifest、资源、Java/Kotlin、Native、网络请求和服务端校验之间。2.2 Android 安全边界Android 的基础安全模型包括应用沙箱每个 App 默认拥有独立 UID私有目录通常在/data/data/package。权限模型危险权限需要运行时申请组件导出需要额外权限或身份校验。签名模型同签名 App 可共享能力升级安装依赖签名一致。进程模型Java 层、Native 层、系统服务通过 Binder、JNI、系统 API 协作。网络模型App 通过 OkHttp、Retrofit、HttpURLConnection、WebView 等发起请求。逆向分析就是在这些边界上找证据哪里把秘密放在客户端哪里只做本地判断哪里能被抓包重放哪里缺少签名或完整性验证。3. 工具链安装与验证3.1 基础工具清单工具用途验证命令或方法Android Studio创建 Demo、编译 APK、调试源码能打开项目并运行模拟器Android SDK / adb安装、启动、日志、shell、文件操作adb devicesjadx / jadx-guiAPK 转近似 Java/Kotlin 源码jadx --version或打开 GUIapktool反编译资源和 Smali重打包 APKapktool --versionapksignerAPK 签名、签名验证apksigner verify --verbose app.apkkeytool生成测试证书keytool -helpFrida / frida-toolsJava/Native Hookfrida --version、frida-ps -UaiBurp Suite / mitmproxy抓包、改包、重放请求能抓到 Demo 的 HTTP/HTTPS 请求Ghidra / IDA FreeNative 反编译能打开.so并查看函数3.2 adb 基础命令adb devices adbinstallapp-debug.apk adb shell pm list packages|grepreverse adb shell dumpsys package com.example.reversedemo adb shell am start-ncom.example.reversedemo/.MainActivity adb logcat|grepReverseDemo adb shell run-as com.example.reversedemolsfiles关键理解adb install用于安装未上架测试包。dumpsys package能看到 Activity、Service、Receiver、Provider、权限和签名摘要。logcat是动态分析的第一手证据但正式包不应输出敏感日志。run-as只对 debuggable 应用可用正式包不能依赖这个能力。3.3 Frida 设备验证Frida 需要电脑端版本和设备端frida-server主版本一致。frida--versionadb shell getprop ro.product.cpu.abi adb push frida-server /data/local/tmp/frida-server adb shellchmod755/data/local/tmp/frida-server adb shell /data/local/tmp/frida-server frida-ps-Uai验证标准检查项通过标准USB 连接adb devices显示 deviceFrida 服务设备端frida-server正常运行进程枚举frida-ps -Uai能列出 App版本一致无 protocol mismatch 报错4. 授权 Demo 工程设计建议创建一个ReverseDemo故意包含学习用的风险点和后续修复点。不要直接拿第三方商业 App 当练习目标。4.1 Demo 功能清单功能初始实现用于练习登录页用户名密码写死为demo/123456静态字符串定位、日志检查会员判断isVip()本地返回布尔值Smali 修改、Frida Hook接口请求请求本地测试服务/api/profile抓包、参数篡改、重放请求签名客户端生成timestamp nonce hmac静态定位签名函数、动态打印明文Native 方法nativeCheck()返回环境检测结果JNI 定位、Native HookRoot/代理检测简单检测su、代理端口绕过检测与防护复测防护开关release 开启混淆、签名校验对比加固前后分析成本4.2 Kotlin 示例本地会员判断packagecom.example.reversedemoobjectUserCenter{privateconstvalLOCAL_USERdemoprivateconstvalLOCAL_PASSWORD123456funlogin(user:String,password:String):Boolean{returnuserLOCAL_USERpasswordLOCAL_PASSWORD}funisVip(userId:String):Boolean{returnuserId10001}funfeatureName():String{returnif(isVip(10002))vip-videoelsefree-video}}这个 Demo 故意把账号、密码和会员判断放在客户端。后续章节会证明只要关键权益依赖客户端判断就可以被静态修改或动态 Hook 影响。4.3 Kotlin 示例网络签名函数objectSigner{privateconstvalCLIENT_SECRETdemo-client-secret-change-mefunsign(path:String,timestamp:String,nonce:String,body:String):String{valraw$path|$timestamp|$nonce|$body|$CLIENT_SECRETreturnsha256(raw)}privatefunsha256(value:String):String{valdigestjava.security.MessageDigest.getInstance(SHA-256)returndigest.digest(value.toByteArray()).joinToString(){%02x.format(it)}}}这个写法也故意不安全只要密钥在客户端就可能被静态搜索、动态打印或从内存里定位。真正的核心鉴权应由服务端掌握客户端只能持有短期凭证。4.4 Native 示例JNI 检测#includejni.h#includeunistd.hexternCJNIEXPORT jboolean JNICALLJava_com_example_reversedemo_NativeGuard_nativeCheck(JNIEnv*,jobject){returnaccess(/system/bin/su,F_OK)!0;}这个 Native 方法用于练习用 jadx 找到System.loadLibrary。用readelf、nm或 Ghidra 找 JNI 函数。用 Frida Hook Java 层或 Native 层返回值。把检测结果从“可绕过”改造成“只作为风险信号不作为唯一安全判断”。5. Demo 构建与运行5.1 Debug 包./gradlew assembleDebug adbinstall-rapp/build/outputs/apk/debug/app-debug.apk adb shell am start-ncom.example.reversedemo/.MainActivity adb logcat|grepReverseDemoDebug 包适合学习调试但不代表真实防护状态。它通常包含调试符号、日志、未混淆类名攻击成本很低。5.2 Release 包./gradlew assembleRelease apksigner verify--verboseapp/build/outputs/apk/release/app-release.apk adbinstall-rapp/build/outputs/apk/release/app-release.apkRelease 包要重点检查是否关闭debuggable。是否启用 R8/ProGuard 混淆。是否删除敏感日志。是否启用签名校验和完整性校验。是否启用 Network Security Config。6. 本章 Demo环境验收实验6.1 实验任务编译并安装ReverseDemodebug 包。用adb shell dumpsys package记录包名、版本、Activity 和签名摘要。用 jadx 打开 APK找到UserCenter.isVip()。用 apktool 反编译 APK找到 Manifest 和 Smali 目录。用 Burp/mitmproxy 抓到 Demo 的一次接口请求。用frida-ps -Uai确认能看到 Demo 进程。6.2 验证表步骤命令或工具通过标准证据文件安装 APKadb install -r app-debug.apk显示Success01-install.txt查看包信息adb shell dumpsys package能看到 Activity 和签名02-package.txt静态查看jadx-gui能定位isVip()03-jadx-screenshot.png资源反编译apktool生成AndroidManifest.xml和smali/04-apktool-log.txt抓包Burp/mitmproxy能看到 Demo 请求05-http-sample.txtFrida 枚举frida-ps -Uai能看到进程06-frida-list.txt6.3 常见问题问题原因处理adb devices显示 unauthorized设备未授权电脑手机弹窗允许 USB 调试INSTALL_FAILED_UPDATE_INCOMPATIBLE已安装不同签名包卸载旧包后重装测试包jadx 打不开 APKAPK 损坏或路径含特殊字符换短路径先用unzip -t检查apktool 重打包失败资源解码异常或版本旧升级 apktool保留错误日志Frida 连接失败server 架构或版本不一致按 ABI 下载同版本 serverHTTPS 看不到明文App 启用证书绑定或未信任用户证书本章只记录现象后续章节专门处理7. 本章交付物完成本章后建议产出case-reversedemo/ 01-env/ 01-install.txt 02-package.txt 03-jadx-screenshot.png 04-apktool-log.txt 05-http-sample.txt 06-frida-list.txt case-notes.mdcase-notes.md至少包含实验环境、工具版本、APK 信息、已完成步骤、未完成原因、下一步计划。8. Android 运行模型8.1 从源码到 APK 的完整链路Android 逆向要先理解“源码不是 APK 的最终形态”。一个普通 Kotlin/Java 项目从源码到安装包大致经历阶段输入输出逆向关注点Kotlin/Java 编译.kt、.java.class语法糖会被展开例如 Kotlinobject、默认参数、协程状态机DEX 转换.classclasses.dex方法数、字符串池、类结构、调用引用资源编译res/、AndroidManifest.xmlresources.arsc、二进制 XML资源 ID、组件声明、字符串Native 编译C/C.soJNI、符号、导入函数、架构 ABI打包DEX、资源、so、assets未签名 APK目录结构、压缩内容签名未签名 APK、证书可安装 APKV1/V2/V3/V4 签名、证书摘要安装APK/data/app/...、应用沙箱包名、UID、私有目录、权限学习时要把 jadx、apktool、adb、Frida 分别放在这条链路里理解。jadx 更接近 DEX 反编译apktool 更接近资源和 Smaliadb 更接近运行环境Frida 更接近运行时行为。8.2 Android 进程和沙箱每个 Android App 默认运行在自己的 Linux UID 下。这个 UID 决定了它能访问哪些文件、能否读写其他应用目录、能否通过 Binder 调用系统服务。概念解释实操观察UID应用安装后分配的 Linux 用户 IDadb shell dumpsys package私有目录/data/data/pkg或/data/user/0/pkgdebug 包可尝试run-as pkg进程名默认是包名也可为组件单独配置进程adb shell ps -A权限Manifest 申请运行时授权adb shell dumpsys package pkgSELinux限制系统资源访问adb shell getenforce逆向时常见误判是在 root 设备上能看到的文件不代表普通设备也能看到debug 包能run-as不代表 release 包也能。8.3 Activity、Service、Receiver、Provider 的逆向意义组件正常用途逆向分析点Demo 设计Activity页面展示和交互是否可被外部启动、是否绕过登录态DebugPanelActivityService后台任务、长连接、播放、同步是否导出、是否接受外部 IntentSyncServiceBroadcastReceiver接收系统或应用广播是否可被伪造广播触发DebugReceiverContentProvider跨进程数据访问是否暴露敏感数据DemoProviderDemo 中可以故意放一个导出 Activity再在后续章节验证外部命令能否直接启动页面是否校验登录态。adb shell am start-ncom.example.reversedemo/.DebugPanelActivity adb shell am broadcast-acom.example.reversedemo.DEBUG_ACTION adb shell content query--uricontent://com.example.reversedemo.provider/user8.4 Intent 与 Deep LinkDeep Link 风险不是“能打开页面”本身而是打开后是否能执行敏感操作。activityandroid:name.DeepLinkActivityandroid:exportedtrueintent-filteractionandroid:nameandroid.intent.action.VIEW/categoryandroid:nameandroid.intent.category.DEFAULT/categoryandroid:nameandroid.intent.category.BROWSABLE/dataandroid:schemereversedemoandroid:hostopen//intent-filter/activity验证命令adb shell am start-aandroid.intent.action.VIEW-dreversedemo://open/vip?userId10002检查点页面是否要求登录。参数是否做白名单校验。是否允许跳转到任意 URL。是否触发支付、提现、绑定账号等敏感动作。错误参数是否导致崩溃或信息泄露。9. Demo 工程细化9.1 推荐 Demo 模块划分ReverseDemo/ app/ src/main/java/com/example/reversedemo/ MainActivity.kt LoginActivity.kt DebugPanelActivity.kt UserCenter.kt Signer.kt ApiClient.kt NativeGuard.kt RiskDetector.kt StorageLab.kt src/main/cpp/ native_guard.cpp src/main/res/xml/ network_security_config.xml每个类负责一个学习主题文件学习主题后续章节对应UserCenter.kt登录和会员判断静态分析、Smali、FridaSigner.kt请求签名和硬编码密钥jadx 搜索、Hook 参数ApiClient.ktOkHttp/Retrofit 请求抓包、重放、篡改NativeGuard.ktJNI 声明Native 分析RiskDetector.ktroot、debug、proxy 检测Hook 和防护复测StorageLab.ktSharedPreferences、SQLite、文件本地数据风险9.2 Demo 风险开关设计为了方便对比可以把风险点做成可切换模式objectLabSwitch{constvalUSE_LOCAL_VIP_CHECKtrueconstvalUSE_CLIENT_SIDE_SECRETtrueconstvalPRINT_SENSITIVE_LOGtrueconstvalENABLE_EXPORTED_DEBUG_PAGEtrueconstvalENABLE_NATIVE_ROOT_CHECKtrue}实验方式开关打开时验证关闭或修复后复测USE_LOCAL_VIP_CHECKHook/Smali 可影响会员页服务端接口拒绝核心权益USE_CLIENT_SIDE_SECRETjadx/Frida 能定位签名材料服务端不再依赖客户端长期密钥PRINT_SENSITIVE_LOGlogcat 可看到敏感字段release 无敏感日志ENABLE_EXPORTED_DEBUG_PAGEadb 可直接启动导出关闭或入口鉴权ENABLE_NATIVE_ROOT_CHECKNative 方法可被 Hook检测仅作为风险信号9.3 Demo 后端最小设计即使是 Android 逆向学习也建议准备一个最小后端。否则只能验证客户端现象不能证明服务端是否安全。接口建议接口用途风险验证POST /login返回测试 tokentoken 存储、日志泄露GET /profile查询用户资料越权访问POST /vip/resource访问会员资源本地会员判断是否影响服务端POST /order/pay模拟下单支付金额篡改、订单归属POST /risk/report上报环境检测结果风险信号设计服务端最小校验token 必须有效。userId由 token 推导不能信任客户端传入。签名必须覆盖 path、method、timestamp、nonce、body hash。nonce 只能使用一次。高风险操作需要服务端二次校验。10. 工具验证深水区10.1 adb 深入命令任务命令用途查看安装路径adb shell pm path com.example.reversedemo定位 base.apk拉取 APKadb pull /data/app/.../base.apk分析已安装包查看应用 UIDadb shell dumpsys packagegrep userId查看权限adb shell dumpsys packagegrep permission -n启动 Activityadb shell am start -n pkg/activity验证导出页面发送广播adb shell am broadcast -a action验证 Receiver查看崩溃adb logcat -b crash定位异常查看网络代理adb shell settings get global http_proxy抓包排错清除数据adb shell pm clear pkg复现实验初始状态卸载应用adb uninstall pkg解决签名冲突10.2 jadx 使用细节操作目的注意全局搜索字符串找 URL、密钥、错误文案混淆后字符串仍常保留搜索方法名找业务入口混淆后方法名可能不可用查看调用者建立调用链反射和动态加载可能断链导出 Gradle 项目方便全文搜索不能当源码直接运行对比 debug/release看混淆和日志差异release 更接近真实环境10.3 apktool 使用细节apktool d-fapp-debug.apk-odecoded-debug apktool b decoded-debug-orebuilt.apk常见参数参数用途-f覆盖输出目录-o指定输出目录或文件--use-aapt2使用 aapt2 构建资源--no-res不反编译资源适合资源异常时--no-src不反编译 Smali只看资源apktool 成功反编译不代表能成功重打包。资源异常、签名差异、版本差异都可能影响安装。10.4 Frida 环境排错清单现象排查方向处理unable to connectUSB、frida-server 未运行检查adb devices和 serverprotocol error电脑端和设备端版本不一致下载同版本 frida-serverpermission deniedserver 无执行权限chmod 755只看到系统进程权限或设备连接异常用 root 环境或调试设备spawn 后黑屏Hook 脚本异常阻塞先注释修改逻辑只打印类找不到类未加载或包名错误先触发页面或枚举 ClassLoader11. 实验记录规范11.1 每次实验必须记录的字段# 实验记录 ## 基本信息 - 实验名称 - 实验日期 - 操作人 - App 包名 - App 版本 - APK 哈希 - 设备型号 - Android 版本 - 是否 root ## 工具版本 | 工具 | 版本 | 用途 | ## 操作步骤 1. 2. 3. ## 证据 | 证据 | 文件 | 说明 | ## 结论 - 已验证 - 未验证 - 限制 - 下一步11.2 APK 哈希记录shasum-a256app-debug.apk shasum-a256app-release.apk为什么要记录哈希保证报告和样本对应。避免 debug/release 混用。复测时确认是否同一版本。多人协作时减少证据争议。11.3 证据命名规范类型命名示例命令输出01-adb-devices.txt截图02-jadx-isvip.pngHook 脚本03-hook-isvip.jsHook 日志04-hook-isvip.log抓包样本05-profile-request.http修改前代码06-before.smali修改后代码07-after.smali复测矩阵08-retest-matrix.md12. 阶段练习12.1 入门练习练习操作通过标准APK 解压unzip -l app.apk能解释主要目录包名识别apkanalyzer或 Manifest能写出包名和版本设备安装adb installApp 可启动日志查看adb logcat能过滤 Demo 日志jadx 查看打开 APK能定位MainActivity12.2 进阶练习练习操作通过标准导出组件验证adb shell am start能证明是否可外部启动本地存储查看debug 包run-as能找到测试数据网络代理配置Burp/mitmproxy能抓到 Demo 请求Frida 枚举frida-ps -Uai能看到 Demo 进程Native 提取unzip -p能提取目标 ABI so12.3 专项练习主题任务输出Manifest列出所有组件和导出状态manifest-audit.mdDEX找登录、会员、签名方法dex-map.md网络抓 3 个关键接口api-flow.mdNative找nativeCheckjni-map.md防护对比 debug 和 releasebuild-compare.md13. 验收考试最终验收要求在本机完成 Demo 编译和安装。用不少于 8 条 adb 命令完成设备、包、组件、日志、代理检查。用 jadx 定位 3 个关键类登录、签名、Native 声明。用 apktool 反编译并找到 Manifest 和 Smali。用 Frida 完成进程枚举。用 Burp/mitmproxy 完成至少一次授权 Demo 抓包。输出完整case-notes.md。评分表项目分值扣分点环境可用20工具版本未记录、设备不可连接Demo 可运行20debug/release 混淆、包名不清工具验证20jadx/apktool/Frida/Burp 任一缺证据记录规范20没有命令输出和截图安全边界20未写授权范围或使用真实敏感数据14. 基础、环境与 Demo 工程本节补充真正的知识点说明。每个知识点都包含需要理解的核心、Demo 中的验证方式和常见误区。Android 应用基础知识点核心理解Demo/验证常见误区APK 文件结构APK 是带签名的压缩包核心由 Manifest、DEX、资源、Native 库、assets 和签名信息组成。解压ReverseDemo标注AndroidManifest.xml、classes.dex、lib/arm64-v8a/libreversedemo.so。只看 jadx 代码忽略 Manifest、资源和 so。DEX 字节码Java/Kotlin 最终会进入 DEXART 执行的是 DEX 而不是源码。在 jadx 中对比 Kotlinobject和反编译后的类结构。把反编译代码当作原始源码逐行理解。Kotlin 编译痕迹空安全、伴生对象、默认参数、协程会生成额外类和辅助方法。搜索Intrinsics、Companion、DefaultImpls。看到代码复杂就误以为有安全防护。应用 UIDAndroid 用 Linux UID 隔离应用私有目录权限由 UID 控制。用dumpsys package查看userIddebug 包尝试run-as。把 root 设备能读到的数据当作普通设备也可读。四大组件Activity、Service、Receiver、Provider 是外部入口和业务承载点。分别用am start、am broadcast、content query验证 Demo 入口。只测试页面不测试后台组件和 Provider。Intent 参数Intent 的 extras、data、action 都可能由外部构造不能默认可信。构造 Deep Link 参数打开会员页。把客户端传入的userId当作服务端可信身份。签名机制签名证明 APK 来源和升级一致性不加密代码。用apksigner verify --print-certs查看证书摘要。认为 APK 签名能阻止反编译。Debug 与 Releasedebug 包偏调试release 包才接近真实上线状态。分别构建两个包并用 jadx 对比混淆、日志和 Manifest。只分析 debug 包后直接给出正式安全结论。工具与环境知识点核心理解Demo/验证常见误区adb 设备通道adb 提供安装、shell、日志、组件触发和数据清理能力。完成adb devices、install、logcat、am start。把 adb 能触发当作漏洞结论不看触发后的业务影响。jadx 角色jadx 适合读 DEX 近似源码和调用关系。定位UserCenter.isVip()、Signer.sign()。认为 jadx 看不到就代表不存在。apktool 角色apktool 适合资源、Manifest、Smali 和重打包验证。反编译 Demo 并找到 Smali 目录。用 apktool 输出的资源名直接推断业务风险。apksigner 角色apksigner 验证签名方案、证书和重签名结果。对原包和重签名包分别验证。只要能重签名就认为完整性防护失效还需结合服务端。Frida 前置条件Frida 需要设备连接、server 版本、目标进程和注入时机匹配。用frida-ps -Uai枚举 Demo。Hook 成功就直接判业务高危。Burp/mitmproxy抓包工具用于观察和篡改授权测试流量。抓 Demo 的/api/profile请求。抓不到包就认为接口一定安全。Ghidra 角色Ghidra 用于 so 反汇编、字符串引用、函数重命名和控制流理解。导入libreversedemo.so并搜索nativeCheck。只看 Java external 方法不分析 so。工具版本记录逆向结果和工具版本强相关报告必须记录版本。输出tool-version.md。不记录版本导致复现困难。Demo 工程设计知识点核心理解Demo/验证常见误区可控授权样本学习逆向必须使用自建 Demo、开源靶场或授权测试包。在ReverseDemo中内置测试账号和测试接口。用第三方未授权 App 练习。本地会员判断客户端布尔值可被 Smali 或 Hook 影响。设计UserCenter.isVip()。把本地判断当作核心权益保护。请求签名函数签名函数用于学习参数覆盖范围和密钥边界。设计Signer.sign(path,timestamp,nonce,body)。认为客户端签名必然安全。测试后端没有后端就无法验证核心业务是否真的越权。提供/login、/profile、/vip/resource。只看客户端 UI 变化不测接口结果。Native 检测点Native 适合学习 JNI 和环境检测但不是绝对安全。设计NativeGuard.nativeCheck()。把逻辑放进 so 就认为不可分析。证据目录证据必须按阶段归档便于复现和交付。建立01-env、02-static、03-dynamic。截图和命令输出散落最后无法写报告。使用方式每个知识点都要落到三件事能解释原理能在ReverseDemo或授权样本里找到证据能写出验证结果和修复边界。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2580569.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!