安卓应用程序结构

  • AndroidManifest.xml(清单文件)
  • dex(java代码编译后的文件)
  • res(ui布局、颜色、字符资源文件)
  • lib(第三方库)
  • assets(静态的音视频文件)
  • META.INF(签名)

安卓应用四大组件

  • Activity
  • Service
  • Broadcast Receiver
  • Content Provider

反编译

dex反编译

  • dex -> smali
    • baksmali
  • dex -> smali -> java
    • Jeb
    • apktool
    • dex2jar

so反编译

  • elf -> arm指令
    • IDA
    • Radare2
    • Ghidra
  • arm -> C++
    • IDA f5
    • Ghidra

定位逆向目标

  • 关键字定位
    • 关键字
    • Grep
      • 反编译的静态代码
      • Dump动态代码
      • 监控文件变化
  • 资源定位
    1. 定位UI中的资源变量名
      • ddms
      • uiautomatorviewer
      • dumpsys
    2. res目录中对应的索引值
    3. 在smali代码中grep所有对该索引值的引用
  • 日志定位
    • adb logcat | grep
    • 日志文件
      • app目录下
      • Sdcard
    • 打开app内置的日至开关
      • 重打包
      • hook
    • smali注入
  • 调用栈跟踪
    • ddms method profiling
    • hook系统函数打印call back

核心目标逆向

  • 静态分析

    • 直接分析smali代码
    • 分析伪java代码
    • 直接分析arm指令
    • 分析伪C++代码

    smali代码

    •类
    • 基本数据类型
    • 寄存器
    • 函数和函数调用 • 代码块和跳转

    ARM指令

    • 寄存器 SP、PC、LR • 传参方式
    • 跳转 B、BL、BX、BLX • 存储器访问

    • 数据处理
    • arm和thumb切换

  • 动态调试

    • AS 调试(smali动调)
    • IDA动调
    • Smali注入
    • hook技术

    Smali代码注入(插桩)

    • 注入方法
    • 反编译 -> 修改smali代码 -> 重打包

    • 使用场景
    • 批量打印log

    • 控制流分析

    • 数据流分析
    • 可能存在的问题 • 重打包失败

    • 签名检查
    • 寄存器维护

    Hook技术

    • 使用场景

    • 注入到目标代码,改变执行结果 • 获取某一状态下的变量值

    • hook的本质 • 代码注入

    • Hook工具
    • Xposed 替换app_process

    • Frida Ptrace注入

frida和xposed hook

page40image36923344.png

frida

一般在root手机上运行 由于frida app是后台app,所以一般用attach附加

page42image37069760.png

page43image37194176.png

  • 在native上的hook

page44image36896768.png

Android应用安全保护和对抗

干扰反编译

  • 利用反编译工具的bug或者漏洞
    • AndroidManifest.xml
    • dex
    • so
  • 转化为伪代码的bug
    • smali -> java
    • arm -> C++
  • 链接资源文件时的bug
    • 特殊的资源文件
    • 超长的资源id

  • 案例
    1. xxe漏洞
    2. 无效代码使反编译工具的CPU耗尽
    3. 添加无效的资源文件,使apktool编译失败
    4. 资源id越界导致链接时Crash
    5. 添加特殊编码字符,使反编译工具Crash
  • 对抗
    1. 反编译不链接资源文件 -no-resource
    2. 使用新的反编译工具
    3. 直接分析底层代码
    4. 打造自己的逆向环境

代码混淆

  • 目的:将代码变得难以阅读

    • 变量名、类名、方法名混淆

      • 超长名字 00o0ooo00ooo000ooo

      • 相似字符 mabin -> m4bln

      • 特定含义的代码 int int= 5

      • 特殊编码 ȷava \u0237

      • 难以阅读的字符

image-20200114114522966

image-20200114114529858

image-20200114114537778

page56image54002336.png

  • 字符串加密

    • 编码

    • 进行各种加密

page57image37071632.png

  • 控制流混淆

  • 运算混淆

    • 控制流伪造
      - 控制流平坦化
  • 代码混淆工具

  • java代码
    - ProGuard
    - DexGurad

    • C++代码
      • OLLVM
  • 混淆带来的问题

   -   运行不稳定
   -   开发调试困难
   -   执行效率
  • 什么app会使用混淆

    • 受众基础大的APP不会使用“变态”的混淆方式
    • 即使混淆,也只是一小部分核心逻辑
    • 老版本的APP一般不会混淆
    • 纯混淆的CTF题目很无聊
    • 企业级的APP
  • 对抗代码混淆

    • 变量名、类名、方法名混淆
      • 变量重命名 jeb、重打包
      • 寻找老版本app
      • 根据开源代码映射
      • 自动化 -> 自动化相似代码检测
    • 字符串加密
      • 静态分析替换
      • 动态hook
    • 控制流混淆
      • 优化反编译工具
      • 符号执行
      • 硬核逆向

反调试

策略(一般是多种策略结合)

  • ptrace

  • 检测TracePid的值

  • 检测调试器

    • 进程名
      • gdb_server
      • android-server
    • 端口号
      • IDA: 23946
      • Frida: 27042
      • 内存特征码
  • 基于时间检测

    page65image36930784.png

对抗

  • 找到所有的监测点并Patch

  • 抢占先机hook 如frida

  • 上帝模式修改系统

  • IDA绕过反调试https://blog.csdn.net/jltxgcy/article/details/50598670

加壳

  • 加固
    • Dex加固
      • 指令抽取
      • Dex加密
      • java->C
    • So加固
      • So加密
      • 函数动态加解密
      • 虚拟机(vmp)

dex

image-20200114141821861

image-20200114215712790

  • 实际上的Android生命周期

  • Process.start->Application创建->attachBaseContext->onCreate->onStart->onResume->Activity生命周期

  • 各厂商对比

    page71image53287840.png

    可见原理上大致相同

  • dex脱壳

    • hook dex加载函数
    • dump内存重建dex
    • 定制化系统
  • 脱壳工具

    • dumpdex
    • FDex2
    • Frida

    总的来说,没有完全万能的脱壳工具,如果有能力自己编写一个是最好,没有的话Frida是最好用也最简单的但是要进行js的学习

so

  • 有源码

    • vmp
  • 无源码

    • so加密

    • section加密

      page73image53187664.png

  • so脱壳

    • 解密so
      • hook loader
      • 修复section
      • dump内存
    • vmp
      • 硬逆
      • 状态机
      • 虚拟机入口

Frida hook

https://mabin004.github.io/2018/03/09/Android-Hook-%E2%80%94%E2%80%94-Frida/

一道极棒2017的第一题攻击&讲解

(之后再写)