美文网首页
18-lldb(下)chisel & 插件

18-lldb(下)chisel & 插件

作者: 深圳_你要的昵称 | 来源:发表于2021-05-29 11:59 被阅读0次

    前言

    一、虚拟内存 & ASLR

    在我之前写的文章启动优化解析中,有介绍物理内存虚拟内存的区别,以及ASLR的概念,现在我们再次总结一下。

    1.1 虚拟内存小结

    • 物理内存:你可以这么理解,就是电脑插的内存条,容量就是真实的,是8G8G,是16G16G
    • 虚拟内存:物理内存的衍生物。主要解决2大问题 👉 内存不够 & 不安全
      • 高效利用内存空间 👉 物理内存中只加载了应用程序需要的几页数据,未用到的不加载
      • 数据安全 👇
        1. 每个应用只能访问自己的虚拟内存空间,无法访问其他应用的信息,做到了应用间的安全隔离。
        2. 应用程序启动后,数据具体放在物理内存的哪几页,并不固定。物理内存与虚拟内存的映射关系是张,每次表内生成映射关系时,会加入ASLR(随机地址偏移),所以不能通过固定地址篡改数据。

    1.2 ASLR小结

    在我之前的逆向文章中,也不止一次的提到和用到ASLR,可见其重要性。我们需要掌握它的原理,为什么底层会这么设计,最好做到知其然知其所以然

    ASLR的概念 👉 (Address Space Layout Randomization) 地址空间配置随机加载,是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。

    ASLR的目的 👉 通过利用随机方式配置数据地址空间,使某些敏感数据(例如APP登录注册、支付相关代码)配置到一个恶意程序无法事先获知的地址,令攻击者难以进行攻击。

    二、Chisel

    Chisellldb的指令集合,可帮助开发者调试iOS应用程序。详情可查看 官方文档

    2.1 安装

    brew update
    brew install chisel
    

    打开~/.lldbinit,添加以下指令 👇

    command script import /usr/local/opt/chisel/libexec/fbchisellldb.py
    

    2.2 案例演示

    2.2.1 查看View的视图层级

    使用pviews指令👇

    指定View下的视图结构👇

    pviews self.view
    

    指定View的上层视图结构👇

    pviews -u self.view
    

    2.2.2 查看控制器的视图结构

    使用pvc指令👇

    2.2.3 查看指定类的结构

    使用pclass指令👇

    2.2.4 查看指定对象的方法列表

    使用pmethod指令👇

    2.2.5 查看指定对象的成员属性

    使用pinternals指令👇

    2.2.6 寻找视图的所属控制器

    使用fvc指令👇

    fvc -v `view的地址`
    

    2.2.7 寻找指定控件

    使用fv指令👇

    2.2.8 指令的使用帮助

    pviews --help
    -------------------------
    Usage:  [options]
    
    Options:
     -h, --help            show this help message and exit
     -u, --up              Print only the hierarchy directly above the view, up
                           to its window.
     -d DEPTH, --depth=DEPTH
                           Print only to a given depth. 0 indicates infinite
                           depth.
     -w WINDOW, --window=WINDOW
                           Specify the window to print a description of. Check
                           which windows exist with "po (id)[[UIApplication
                           sharedApplication] windows]".
     -s, --short           Print a short description of the view
     -m, --medium          Print a medium description of the view
    

    2.2.9 让指定控件闪烁,可快速找到视图的位置

    使用flicker指令👇

    2.2.10 交互式搜索视图

    使用vs指令👇

    w:移动到父视图
    s:移动到第一个子视图
    a:移动到上一个同级
    d:移动到下一个同级
    p打印视图结构
    q退出调试状态

    三、LLDB

    LLDBaliases/regexesPython的脚本集合,可帮助开发者进行调试。详情可查看 官方文档

    3.1 安装

    1. 克隆LLDB
    git clone https://github.com/DerekSelander/LLDB.git
    
    1. 打开~/.lldbinit,添加以下指令👇
    command script import /Users/xxx/LLDB/lldb_commands/dslldb.py
    

    ⚠️注意:LLDB的安装路径。

    3.2 案例演示

    3.2.1 查找UIView的所有实例和子类

    使用search指令👇

    3.2.2 找到指定类的方法列表

    使用methods指令👇

    找到方法地址,可以对其设置断点👇

    b -a `方法的地址`
    

    3.2.3 找回方法的符号

    使用sbt指令👇

    总结

    • 虚拟内存

      • 所有程序的内存访问,都是通过虚拟地址访问的
      • 页表存储在内存中,记录状态、虚拟地址和物理地址的映射关系
      • 数据以页为单位加载,iOS系统一页为16KB
    • ASLR

      • 一种保护技术,在每次加载应用时,系统给一个随机的偏移值
      • 定位方法地址:
        lldb中,使用image list指令,找到MachO的首地址,包含ASLR
        ◦ 找到方法在文件中的虚拟地址或文件中的偏移地址
        ◦ 可以使用MachO首地址 + 文件中的偏移地址
        ◦ 或者使用文件中的虚拟地址 + ASLR
    • Chisel

      • Chisellldb的指令集合,可帮助开发者调试iOS应用程序。详情可查看 官方文档
      • 查看View、ViewController、Class视图结构
      • 查看指定对象方法列表、成员属性
      • 寻找视图的所属控制器
      • 寻找指定控件
      • 指令的使用帮助
      • 让指定控件闪烁,可快速找到视图的位置
      • 交互式搜索视图
    • lldb插件

      • LLDBaliases/regexesPython的脚本集合,可帮助开发者进行调试。详情可查看 官方文档
      • 通过Python脚本自定义命令
      • 通过.lldbinit文件加载插件,使用command script import脚本

    相关文章

      网友评论

          本文标题:18-lldb(下)chisel & 插件

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