18-lldb(下)chisel & 插件

前言

一、虚拟内存 & 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 & 插件)