1) 基础必备

JVM 与字节码

  • .class 文件结构:常量池、字段、方法、属性(Code/LineNumberTable/LocalVariableTable 等)

  • 字节码指令:invokevirtual/invokestatic/invokeinterface/invokespecialgetfield/putfieldaload/iload

  • 访问控制:public/protected/private、包访问、final/static/volatile/synchronized

  • 类加载机制:Bootstrap/Ext/App(或模块化后)、ClassLoader、双亲委派、defineClass

  • 反射:Class.forNameMethod.invokesetAccessible(true)

Android 运行时

  • Dalvik/ART、dexodex/vdex、AOT/JIT

  • APK 结构:AndroidManifest.xmlclasses*.dex、resources.arsc、签名、lib/

  • 组件模型:Activity/Service/Receiver/Provider

  • 常见入口:Application.attachBaseContextonCreate


2) 静态分析常用(最常用的“看”)

反编译 / 资源分析

  • Java 源级反编译:jadx(首选)、CFR、Fernflower

  • dex 解析/Smali:baksmali/smali、Apktool(看资源+Manifest)

  • 关键文件:

    • Manifest:导出组件、权限、DeepLink

    • resources:字符串、URL、开关、灰度配置

    • assets/raw:证书、脚本、配置、模型、加密字典

Smali 必懂点

  • 寄存器概念:locals/registersp0/p1 参数寄存器

  • 常见改法:

    • 强制返回 true/false(绕过校验)

    • NOP 掉关键调用

    • 替换字符串常量(URL/开关)

  • 混淆识别:短类名、短方法名、控制流奇怪、反射大量使用

常见定位技巧(“从哪儿下手”)

  • 搜索关键字:域名、API path、错误码、提示语、加密算法名(AES/RSA/HMAC)、“sign”“token”“timestamp”

  • 从网络层找:OkHttp/Retrofit/Volley/HttpURLConnection

  • 从登录/风控找:设备指纹、签名、时间戳、nonce、序列号


3) 动态分析常用(最常用的“抓/改/看”)

Hook / 插桩

  • Frida:Java 层 Hook、native Hook、RPC、spawn/attach

  • Xposed/LSPosed:长期驻留、系统级/应用级 Hook

  • 关键 Hook 点:

    • OkHttp:Interceptor.interceptRequest.Builder.addHeader

    • Retrofit:CallAdapterConverter

    • 加密:Cipher.doFinalMac.doFinalMessageDigest.digest

    • Base64:android.util.Base64 / java.util.Base64

    • JSON:Gson/Jackson 序列化入口

抓包与证书

  • HTTPS 抓包:Burp/Charles/mitmproxy

  • 证书 Pinning 绕过(概念层面):

    • OkHttp CertificatePinner / TrustManager

    • WebView SSL 错误处理

  • 常见坑:

    • 双向 TLS(mTLS)

    • 自定义加密通道(即使 HTTPS 也再加密一层)

日志与调试

  • logcat、调试模式、反调试检测(简单版)

  • 运行时信息:

    • 当前类加载列表

    • 方法调用栈

    • 动态生成类/热修复框架加载情况


4) 加密与签名(逆向里最常见的“核心战场”)

高频算法/结构

  • AES(CBC/GCM/CTR)+ IV/Nonce

  • RSA/ECC(多用于密钥交换/签名)

  • HMAC-SHA256(最常见签名)

  • MD5/SHA1(旧项目/兼容)

  • 常见签名组成:

    • canonical string:按 key 排序、拼接 k=v、加上 secret

    • timestamp + nonce + body hash + path + method

典型定位路线

  1. 从网络请求找 header:sign/x-signature/token/timestamp/nonce

  2. Hook 加密 API:Cipher/Mac/MessageDigest → 看输入输出

  3. 往上追:谁在组织 canonical string、谁在取 secret

  4. 找 secret 来源:硬编码/so/服务端下发/KeyStore/动态算法


5) 混淆与保护(你经常会遇到)

ProGuard/R8

  • 类/方法名混淆、字符串常量仍可能可见

  • keep 规则、反射导致的保留痕迹

字符串加密/动态解密

  • 常见模式:静态数组 + XOR/AES + runtime 解密

  • 逆向策略:

    • Hook 解密函数(拿明文)

    • 或把解密逻辑抽出来离线还原

控制流平坦化/花指令(概念)

  • 代码结构看起来“跳来跳去”

  • 应对:动态 Hook 输出关键变量/中间值

热修复/插件化

  • Tinker、Sophix、RePlugin、Dynamic Feature

  • 入口可能不在主 dex,需关注:

    • attachBaseContext 中加载逻辑

    • dexClassLoader / pathList 修改


6) Native 相关(很多“关键逻辑”会下沉到 so)

  • JNI:Java ↔ C/C++ 的调用桥

  • 常见目标:签名算法、设备指纹、反调试、加密密钥

  • 基本技能:

    • JNI_OnLoad,定位 RegisterNatives

    • Frida/ptrace 层面的 Hook(高阶)

    • 符号裁剪/混淆:从字符串、导入函数、行为定位


7) 反调试/反 Hook/反抓包(你会经常遇到)

(我只讲防护点,不教你做违法用途)

  • root 检测、模拟器检测、Xposed/Frida 检测

  • ptrace / TracerPid / ro.debuggable

  • SSL Pinning、WebView pinning

  • 运行时完整性校验(签名校验、dex 校验、so 校验)


8) 实战工作流(最实用的一套)

A. 快速摸清 app 在干什么(30 分钟内)

  1. apktool 看 Manifest(入口、权限、导出组件)

  2. jadx 全局搜域名/接口 path/关键 header

  3. 找网络层:OkHttp/Retrofit → 看请求构造

  4. 找 sign 生成:从拦截器/请求 builder 往上追

B. 签名/加密逆向(最常见任务)

  1. 抓包看参数差异(timestamp/nonce/sign)

  2. Hook Cipher/Mac/MessageDigest 拿明文

  3. 追踪 secret 来源与拼接规则

  4. 复现为脚本(注意时间、排序、编码)

C. 破解只做“验证/调试”

  • 一切改动要可回滚

  • 记录:版本号、哈希、改动点、验证用例


9) “常见知识点速查表”

  • OkHttp:Interceptor、Request/Response body 只能读一次(要注意 buffer)

  • Gson/Jackson:序列化字段名、@SerializedName

  • 时间:毫秒/秒、时区、服务器时间校准

  • 编码:UTF-8、URL encode、Base64(标准/URL-safe)

  • 压缩:gzip/deflate/zlib(很多 body 会压缩再加密)