前言
一、虚拟内存 & ASLR
在我之前写的文章启动优化解析中,有介绍物理内存
和虚拟内存
的区别,以及ASLR
的概念,现在我们再次总结一下。
1.1 虚拟内存小结
- 物理内存:你可以这么理解,就是电脑插的
内存条
,容量就是真实的,是8G
就8G
,是16G
就16G
。 - 虚拟内存:物理内存的衍生物。主要解决2大问题 👉
内存不够
&不安全
。- 高效利用内存空间 👉 物理内存中只加载了应用程序
需要
的几页数据,未用
到的不加载
。 - 数据安全 👇
- 每个
应用
只能访问自己
的虚拟内存空间,无法
访问其他应用
的信息,做到了应用间
的安全隔离。 - 应用程序启动后,数据具体放在物理内存的哪几页,并
不固定
。物理内存与虚拟内存的映射关系
是张表
,每次表内生成映射关系时,会加入ASLR(随机地址偏移)
,所以不能
通过固定地址
篡改数据。
- 每个
- 高效利用内存空间 👉 物理内存中只加载了应用程序
1.2 ASLR小结
在我之前的逆向
文章中,也不止一次的提到和用到ASLR
,可见其重要性。我们需要掌握它的原理,为什么底层会这么设计,最好做到知其然知其所以然
。
ASLR的概念 👉 (Address Space Layout Randomization) 地址空间配置随机加载
,是一种针对缓冲区溢出
的安全保护技术,通过对堆、栈、共享库映射
等线性区布局的随机化
,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击
代码位置,达到阻止溢出攻击的目的的一种技术。
ASLR的目的 👉 通过利用随机方式配置数据地址空间
,使某些敏感数据(例如APP登录注册、支付相关代码)
配置到一个恶意程序无法事先获知
的地址,令攻击者难以进行攻击。
二、Chisel
Chisel
是lldb
的指令集合,可帮助开发者调试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
LLDB
是aliases/regexes
和Python
的脚本集合,可帮助开发者进行调试。详情可查看 官方文档
3.1 安装
- 克隆LLDB
git clone https://github.com/DerekSelander/LLDB.git
- 打开
~/.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
-
Chisel
是lldb
的指令集合,可帮助开发者调试iOS
应用程序。详情可查看 官方文档 - 查看
View、ViewController、Class
的视图结构
- 查看指定
对象
的方法列表、成员属性
- 寻找视图的
所属控制器
- 寻找
指定控件
- 指令的使用帮助
- 让指定控件
闪烁
,可快速找到视图的位置 -
交互式
搜索视图
-
-
lldb插件
-
LLDB
是aliases/regexes
和Python
的脚本集合,可帮助开发者进行调试。详情可查看 官方文档 - 通过
Python
脚本自定义命令 - 通过
.lldbinit
文件加载插件,使用command script import
脚本
-
网友评论