day4

作者: zs0zrc | 来源:发表于2018-08-12 11:57 被阅读34次

Android 安全
android课程大纲

1.安卓背景介绍(安卓生态圈简介、安卓安全架构、常用概念和技术) 2. 安卓分析环境与工具准备 3.逻辑代码保护与逆向技术的对抗(编译与反编译、加壳与脱壳、原生代码混淆与解混淆、隐藏与取证、Hook与注入) 4.应用层漏洞分析(组件、传输、存储、加密、凭证安全) 5. 安卓ROOT攻击:未加锁、锁定设备root 6.题目解析(直接逆向技术题目、原生层混淆题目、加脱壳技术题目)

android 生态圈简况

  • 基于linux内核的开源操作系统
  • 大家都可以DIY
  • 应用市场管理不严
  • 厂商安全补丁推送不及时,覆盖率低

Android 的优点:
开放、分享、可定制化程度高

android的整体架构:

image.png

大致分四层:从底层往上

  • linux kernel
  • Libraries和Android Runtime:Libraries:即C/C++函数库部分,大多数都是开放源代码的函数库,
  • android application framework (应用软件架构),Java应用程序开发人员主要是使用该层封装好的API进行快速开发。
  • 应用层 application 该层是Java的应用程序层

android的结构可以看这篇博客


android的安全模型:

  • 基于 Linux 的用户隔离
    区分 UID 和 UserID

  • 应用权限

  • 代码签名

  • 应用权限申请 -->通过Manifest.xml

  • SELinux

    • Security Enhancements for Android
    • 强制访问控制
    • 核心系统守护进程和用户应用隔离到不同的domain
  • 系统更新

    • 解锁、BootLoader、Recovery负责刷写一些模块
    • recovery是一个单独小型的system,可以访问所有的设备
    • 通常只允许签名验证通过的刷写
    • 解锁:允许替换recovery和系统镜像,将会清除所有用户数据

分析环境和常用的工具

  • santoku
    基于linux的android取证、逆向、开发的平台
    2014年就停止更新了

  • Android Studio
    android应用的开发
    APK分析,性能分析

  • JEB

    • Android逆向工具 支持无源码调试,提供ARM 、Mips、Intel x86/64反编译支持
      *用法:
      直接将apk脱进jeb中就行了,然后它就会将自动分析apk包,然后按Q可以将Smali语言转换成java代码
  • jadx
    开源的dex文件反编译工具

  • Smali、BakSmali|、APKTool
    返汇编常用工具,dex文件和smali代码的相互转换,apk文件的解包和打包

    • apktool用法:
      在命令行用 apktool d filename.apk -f
  • dex2jar-2.0
    将dex文件转化jar文件
    在命令行使用:

./d2j-dex2jar.bat classes.dex --force to overwrite
  • jd-gui
    将jar转换成源代码
    将dex2jar得到的jar拖进去就可以看到源码了

  • IDA Pro
    支持Dalvik指令集的反汇编
    多用于动态调试Native代码


安卓代码分析和对抗
编译:正向了解apk的构建流程

反编译逆向:

  • APK文件结构
    • 本质是一个压缩包
    • 常见文件
      • Manifest.xml:清单文件,该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,
      • META-INF:META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
      • classes.dex:是java源码编译后生成的java字节码文件(非传统JVM解释执行的class字节码)。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样
      • res目录:存放原生资源文件
      • assets目录:存放原生资源文件 ,可以存放一些配置文件(比如webview本地资源、图片资源、音视频等等),不会经过编译,和原始工程里面的文件是一致的,这些文件的内容在程序运行过程中可以通过相关的API(android.content.res.AssetManager)获得
      • lib目录:lib目录下的子目录存放的是一些与手机CPU架构对应的C/C++代码编译生成的so文件,一般用于JNI开发。

理解什么是dex文件:

  • Android 可执行文件
  • java代码编译而来
  • 包含Dalvik指令集

理解是smali代码:

  • 有字节码返汇编得到的可阅读代码

smali语法:
可以看博客

  • 每个smali文件代表一个类
  • 开头
    • .class <权限>[修饰]<类名>
    • .super 父类
    • .source 源文件名
  • field 字段的定义
  • .method 方法的定义
  • java经过编译后几乎保留了所有的语义信息

JNI

  • Java 与Native(C/C++)沟通的桥梁
  • JNI的注册:
    • 静态注册(名字对应)---Demo
    • 动态注册( RegisterNativeMethods )
  • JNI_ONLoad 加载so文件时调用
  • 在加载so文件时被执行

native关键字 java声明函数的一个关键字,用于申明调用native层的函数

  • Demo hiddendata

--

加壳技术:

  • 利用动态代码加载技术去隐藏原本的dex文件
  • 动态加载过程隐秘,且复杂度高
  • 增加完整性检查,反调试措施

加壳的基础思路:

  • 将加载后的东西立即删除
  • dex不落地加载
  • 使加载过程更加隐蔽
  • 自己实现函数逻辑加载,不用系统API

Android提供的动态调试的方法:

  • DexClassLoader: apk/jar/dex, 可以从 SD 卡加载
  • PathClassLoader: 只能加载已安装到系统中(/data/app)的文件

动态调试的条件:

  • Android:debugger = "truce"

  • Android os

    • ro.debuggable = 1
    • boot.img->default.prop
    • 模拟器或者userdebug编译
    • mprop、BDOpner(Xposed模块)
  • 无源码动态调试(JAVA层)

    • smalidea(推荐)
    • 使用android studio的sdk调试 abd
    • IDA pro
    • JEB
  • Native代码调试
    *IDA Pro 利用IDA Pro的远程调试

方法跟踪

  • Android本身提供了method tracing
    • DDMS
    • CPU profile

这个方法跟踪只记录函数调用信息,不记录参数信息,

脱壳技术:

  • 运行时机:

    • dex文件加载
    • 类加载
    • 方法执行
  • 针对内存加密壳的脱壳技术:

    • 暴力内存搜索
    • 关键函数断点
    • DexHunter
    • AppSpear

要认识dex文件格式,了解dex的文件头
dex文件一般来说在内存中是连续的

  • 暴力内存搜索
  • dex文件在内存中有特征
    • DexHunter magic

dex的加载流程:

  • 验证dex的有效性
  • 生成 odex
  • 解析odex并生成相应的内存结构

生成odex时:

  • dvmOptimizeDexFile
  • 执行/bin/dexopt进行dex优化-->dvmContinueOptimization

dvmDexFileOpenPartial:

  • address --> dex的起始位置
  • len----->dex的长度
  • DexHunter 与AppSpear
    *主动初始化所有类
    • dex文件内存重构技术

反混淆

  • 花指令
    *simplifu
    • 动态执行去除花指令
  • 名称混淆
    • 根据类型信息重命名
      Demo 360 renameByType

Hook

  • 根据需求不同
    • Hook 一切 ( Xopsed, Frida )
    • Hook 自己 ( VirtualXposed, Legend )
      Android应用的四大组件

Android 应用四大组件

  • Activity

    • 具有用户界面的单一屏幕
    • UI 相关
  • Service

    • 后台运行的组建
  • Content Provider

    • 共享应用数据
  • Broadcast Receiver

    • 响应广播通知
  • 组件需要在 Manifest 中申明注册

    • BroadcastReceiver 也可以动态注册
  • 组件生命周期

    • onCreate, onResume …
  • 组件间通信

    • Intent 为载体,底层由 Binder 实现

应用层安全

  • 内存破坏漏洞

    • 底层服务
    • 蓝牙、V8、Binder …
  • 应用逻辑漏洞

    • 空指针异常
    • 权限设置(组件权限、存储权限)
    • 支付流程
  • 网络通信

  • SSL、Web 安全等

    • 本质是权限控制
      • exported = “true”Intent Scheme
  • Intent Scheme URLs

    • browser -> Intent -> Activity
    • 加载任意网页
  • addJavascriptInterface
    *js调用java代码

*设备root

  • root ~= 为所欲为
  • 工程机的 root
    • adb 以 root 模式启动,随后 drop 权限
    • adb root —— adbd 始终以 root 权限运行
    • 包含 su 命令
  • 普通机器的 root
    • 主动 root —— eg.superSU
    • 被动 root —— 漏洞一把梭
  • superSU
    • 直接刷入一个 su 文件?
      • system 分区以 nosetuid 挂载
      • zygote 被 drop 权限
      • SELinux 下划分了安全域
    • superSU 架构
      • daemonsu <-> UNIX socket <-> untrusted App·

网友评论

      本文标题:day4

      本文链接:https://www.haomeiwen.com/subject/gkvpvftx.html