15、虚拟内存LLDB高级调试

news2024/11/15 21:55:36

一、虚拟内存

  • 早期的操作系统
    • 早期的操作系统,并没有虚拟内存的概念.系统由进程直接访问内存中的物理地址,这种方式存在严重的安全隐患.内存中的不同进程,可以计算出他们的物理地址,可以跨进程访问,可以随意进行数据的篡改.
    • 早期的程序也比较小,在运行时,会将整个程序全部加载到内存中.但随着软件的发展,程序越来越大,而且还有大型游戏的诞生,导致内存越来越吃紧.这就是早期系统中,为什么经常可以看到内存不足提示框.
  • 虚拟内存系统
    • 而现代的操作系统都引入了虚拟内存,进程持有的虚拟地址(Virtual Address)会经过内存管理单元(Memory Management Unit)的转换变成物理地址,然后再通过物理地址访问内存.
    • 操作系统以页为单位管理内存,在iOS系统中,一页为16KB.所以虚拟地址和物理地址的映射表,也称之为页表.页表存储在内存中,有了页表,就可以将程序和物理内存完全隔断开.
    • 早期的系统,将程序全部加载到内存中.程序越大,它的功能越多,这会造成一些并未使用到的功能,也被加载进内存,造成内存的大量浪费
    • 现代的操作系统进行了更合理的优化,例如iOS系统中,当进程被加载时,虚拟内存中会开辟4G的空间(假空间),用于存放MachO、堆区、栈区.但物理内存中,并未真的分配.当数据加载到页表中,系统会配合CPU进行地址翻译,然后载入到物理内存中.地址翻译的过程,由CPU上的内存管理单元(MMU)完成
    • 页表中记录了内存页的状态、虚拟内存和物理内存的对应关系.其中状态分为:未分配(Unallocated)、未缓存(Uncached)、和已缓存(Cached)
      • 未分配的内存页,是没有被进程申请使用的,也就是空闲的虚拟内存,不占用虚拟内存磁盘的任何空间.
      • 未缓存的内存页,仅在虚拟内存中,没有被物理内存缓存.
      • 已缓存的内存页,同时存在于虚拟内存和物理内存中.
  • 缺页中断
    • 当程序访问未被缓存的内存页时,就会触发缺页中断
    • 部分情况下,被访问的页面已经加载到物理内存中,但页表中并不存在该对应关系,这时只需要在页表中建立虚拟内存到物理内存的关系即可
    • 其他情况下,操作系统需要将磁盘上未被缓存的虚拟页加载到物理内存中
  • 页面替换
    • 物理内存的空间是有限的,当内存中没有空间时,操作系统会重新选择合适的物理内存页驱逐回磁盘,为新的内存页让出位置,选择待驱逐页的过程在操作系统中叫做页面替换
  • 虚拟内存解决的问题
    • 数据存储在虚拟内存中,地址是连续的.但在实际的物理内存中,地址是随机存储的.虚拟内存的出现,将程序和物理内存完全隔离开,解决了安全问题.
    • 页表中只加载程序所使用到的部分功能,避免内存浪费的现象,也解决了内存不足问题.
  • 虚拟内存引发的问题
    • 程序的代码在不修改的情况下,每次加载到虚拟内存中的地址都是一样的,这样的方式并不安全.为了解决地址固定的问题,出现了ASLR技术

二、ASLR

2.1 ASLR简介

  • ASLR(Address Space Layout Randomization): 是一种针对缓存区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的.
  • 大部分主流的操作系统已经实现了ASLR
    • Linux: Linux已在内核版本2.6.12中添加ASLR
    • Windows: Windows Server 2008、Windows7、Windows Vista、Windows Server 2008 R2,默认情况下启用ASLR,但它仅适用于动态链接库和可执行文件
    • Mac OS X: Apple在Mac OS X Leopard10.5(2007年十月发行)中某些库导入了随机地址偏移,但其实现并没有提供ASLR所定义的完整保护能力.而 Mac OS X Lion10.7 则对所有的应用程序均提供了ASLR支持.Apple 宣称为应用程序改善了这项技术的支持,能让32及64位的应用程序避开更多此类攻击.从OS X Mountain Lion10.8开始,核心及核心扩充(kext)与zones在系统启动时也会随机配置.
    • iOS(iPhone 、iPod touch、iPad): Apple 在iOS4.3内导入了ASLR.
    • Android: Android 4.0 提供地址空间配置随机加载(ASLR),以帮助保护系统和第三方应用程序免受由于内存管理问题的攻击,在Android 4.1中加入地址无关代码(Position-Independent Code)的支持

2.2 ASLR练习

  • 创建个App类型的Demo、快快一写、编译运行、放入Hopper
- (void)eatWithObject:(NSString *)objc {
    NSLog(@"吃到了 : %@",objc);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self eatWithObject:@"汉堡"];
}
  • 搜索关键函数 eatWithObject

  • 由此得出
    • 偏移地址为: 639c
    • 虚拟内存地址为 000000010000639c
    • 回到工程、断点调试、image list 得出当前的ASLR地址为 0x0000000100bb4000
    • 对函数地址下断点: 0x10000639c+0xbb4000

    • 断点下来、命中函数地址.
  • 接下来设置一个变量a、调试时断点在如下位置、此时a = 10, 控制台取a的虚拟内存地址 0x0000000100708e70

    • 再重新获取image list 得到ASLR 0x0000000100700000
    • 两者差值为 0x8E70
    • 将程序MachO文件拖动到MachOView中查找该地址、可以看到

    • 0x8E70位置为10、得证.

三、LLDB高级调试

3.1 Chisel

  • chisel : Chisel是一组LLDB用于协助调试 iOS 应用程序的命令。根据安装步骤安装完毕后
  • 在调试时使用:
(lldb) p [self.view recursiveDescription]
(__NSCFString *) $0 = 0x00000002834a5ef0 @"<UIView: 0x15be061d0; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x283aecbc0>>\n   | <UIButton: 0x15be10e20; frame = (0 0; 200 200); opaque = NO; layer = <CALayer: 0x283aecb40>>\n   |    | <UIButtonLabel: 0x15be10b00; frame = (73 89.3333; 54 21.6667); text = 'Button'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2819e5450>>"
// 指定View下的视图结构
(lldb) pviews self.view
<UIView: 0x15be061d0; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x283aecbc0>>
   | <UIButton: 0x15be10e20; frame = (0 0; 200 200); opaque = NO; layer = <CALayer: 0x283aecb40>>
   |    | <UIButtonLabel: 0x15be10b00; frame = (73 89.3333; 54 21.6667); text = 'Button'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2819e5450>>       ^
// 指定View的上层视图结构
(lldb) pviews -u self.view
<UIWindow: 0x15bd090f0; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x2834b7d50>; layer = <UIWindowLayer: 0x283ae82e0>>
   | <UIView: 0x15be061d0; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x283aecbc0>>
// 查看当前显示View的视图结构
(lldb) pviews
<UIWindow: 0x15bd090f0; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x2834b7d50>; layer = <UIWindowLayer: 0x283ae82e0>>
   | <UIView: 0x15be061d0; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x283aecbc0>>
   |    | <UIButton: 0x15be10e20; frame = (0 0; 200 200); opaque = NO; layer = <CALayer: 0x283aecb40>>
   |    |    | <UIButtonLabel: 0x15be10b00; frame = (73 89.3333; 54 21.6667); text = 'Button'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2819e5450>>
(lldb)
  • pvc: 查看控制器的视图结构
(lldb) pvc
<MMUINavigationController 0x10b8bec00>, state: disappeared, view: <UILayoutContainerView 0x10b04b7d0> not in the window
   | <WCAccountLoginFirstViewController 0x10c1e4800>, state: disappeared, view: <UIView 0x10b051f80> not in the window
   + <MMUINavigationController 0x10c1c5e00>, state: appeared, view: <UILayoutContainerView 0x10b18d570>, presented with: <_UIFullscreenPresentationController 0x10b06b7f0>
   |    | <WCAccountMainLoginViewController 0x10b860a00>, state: appeared, view: <UIView 0x10b18f570>
<MMUINavigationController 0x10b8bec00>, state: disappeared, view: <UILayoutContainerView 0x10b04b7d0> not in the window
   | <WCAccountLoginFirstViewController 0x10c1e4800>, state: disappeared, view: <UIView 0x10b051f80> not in the window
   + <MMUINavigationController 0x10c1c5e00>, state: appeared, view: <UILayoutContainerView 0x10b18d570>, presented with: <_UIFullscreenPresentationController 0x10b06b7f0>
   |    | <WCAccountMainLoginViewController 0x10b860a00>, state: appeared, view: <UIView 0x10b18f570>
  • pclass 0x10b860a00: 查看指定类的结构
(lldb) pclass 0x10b860a00
WCAccountMainLoginViewController
   | WCAccountBaseViewController
   |    | MMUIViewController
   |    |    | UIViewController
   |    |    |    | UIResponder
   |    |    |    |    | NSObject
  • pmethods 0x10b860a00 : 查看指定对象的方法列表
(lldb) pmethods 0x10b860a00
Class Methods:
No methods were found

Instance Methods:
- (Class)class
- (void)dealloc
- (bool)_isKVOA
  • pinternals self: 查看指定对象的成员属性
(lldb) pinternals 0x10b89a400
(WCUITextField) $55 = {
  UITextField = {
    UIControl = {
      UIView = {
        UIResponder = {
          NSObject = {
            isa = WCUITextField{...}
          }
        }
      }
    }
  }
  m_bRestrictShareMenu = false
  m_fPlaceholderFontSize = 18
}
  • fvc -v 0x15bd10dd0: 寻找视图的所属控制器
(lldb) fvc -v 0x10b860a00
Found the owning view controller.
<WCAccountMainLoginViewController: 0x10b860a00>
  • fv UIButton: 寻找指定控件
(lldb) fv UIButton
0x15bd10dd0 UIButton
0x15bd0fdf0 UIButtonLabel
  • flicker 0x10b89a400: 让指定控件闪烁,可快速找到视图的位置
(lldb) flicker 0x10b89a400
  • 交互式搜索视图:使用vs指令
    • w: 移动到父视图
    • s: 移动到第一个子视图
    • a: 移动到上一个同级
    • d: 移动到下一个同级
    • p: 打印视图结构
    • q: 退出调试状态

3.2 DSLLDB

  • LLDB是aliases/regexes和Python的脚本集合,可帮助开发者进行调试。详情可查看 官方文档
  • 下载LLDB
git clone https://github.com/DerekSelander/LLDB.git
  • 打开~/.lldbinit,添加以下指令:
command script import /Users/LLDB/lldb_commands/dslldb.py
  • 用法说明:
    • 查找UIView的所有实例和子类: search UIView
    • 找到指定类的方法列表: methods UIViewController
    • 找回方法的符号: sbt

四、总结

  • 虚拟内存
    • 所有程序的内存访问都是通过虚拟地址访问的
    • 系统有一张页表,虚拟地址和物理地址的映射表
    • 数据加载、以页为单位加载的
  • ASLR
    • 一种保护技术,在每次加载应用的时候,系统给一个随机的偏移值
    • 定位方法地址,下内存断点
      • 1、LLDB、image list找到MachO的首地址
      • 2、找到方法在文件中的虚拟地址、文件中的偏移地址
      • 3、获取到方法的虚拟地址
        • 3.1、MachO首地址 + 文件中的偏移地址
        • 3.2、MachO中的虚拟地址+ASLR(是不包含PageZero的)
  • LLDB插件
    • chisel、DSLLDB
    • LLDB官方文档,有相关API.通过Python脚本自定义命令
    • 加载插件:通过 .lldbinit文件去加载插件, command script import 脚本地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL——关于bjpowernode.sql的33道经典例题之18-33

目录 18 列出所有“CLERK”&#xff08;办事员&#xff09;的姓名和部门名称、部门人数 19 列出最低薪水大于1500的各种工作和此工作的全部雇员人数 20 列出在部门“SALES”<销售部>工作的员工姓名 21 列出薪资高于公司平均薪资的所有员工&#xff0c;所在部门、上级…

windows python 安装 mathutils库出现问题解决

项目场景&#xff1a; 在windows11上python安装mathutils库时报错。分如下两种情况安装&#xff0c;都报的是同样的错误&#xff1a; &#xff08;1&#xff09;直接在使用pip安装 python -m pip install mathutils # 或者 pip install mathutils &#xff08;2&#xff09;…

2023年第二届服务机器人国际会议(ICoSR 2023) | IEEE-CPS独立出版

会议简介 Brief Introduction 2023年第二届服务机器人国际会议(ICoSR 2023) 会议时间&#xff1a;2023年7月21日-23日 召开地点&#xff1a;中国上海 大会官网&#xff1a;www.iwosr.org ICoSR 2023将围绕“服务机器人”的最新研究领域而展开&#xff0c;为研究人员、工程师、专…

版本升级|Co-Project V3.1智能项目管理平台——新增三大调整板块 提高自动估算精准度

大家好&#xff0c;CoCode开发云旗下Co-Project V3.1智能项目管理平台正式发布&#xff0c;需求分析工具全新升级&#xff0c;新增功能点调整类型、工作量调整因子和费用调整因子三大板块&#xff0c;全面提高自动估算项目精准度。 一、调整功能点数 要提高项目估算精准度&…

stable diffusion webui 使用

参考各文章以及个人操作后的记录文章&#xff0c;也希望能帮助有需要的人~ 首先进去大概是这样的&#xff0c;介绍下下图几个区域&#xff08;主要是文生图&#xff09;。 一、模型区域 Stable Diffusion checkpoint下拉选择框是用来切换ckpt模型&#xff0c;不清楚的可以看…

快速入门 Python 内置模块 argparse

目录 一、argparse 简介二、The add_argument() method 一、argparse 简介 argparse 模块是 Python 内置的用于命令项选项与参数解析的模块&#xff0c;argparse 模块可以让人轻松编写用户友好的命令行接口&#xff0c;能够帮助程序员为模型定义参数。 使用 argparse 模块的四个…

C++string类详解

C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&#xff0c;稍不留神可…

【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

巨型AI模型时代已结束,我们没搞GPT-5,搞的是GPT-4.99999

文章目录 1、ChatGPT 研发热潮2、GPT5 被叫停“AI危险竞赛”3、 叫停是无法被阻止的4 、 不急于训练GPT-5 1、ChatGPT 研发热潮 自ChatGPT重新吹响人工智能革命的号角后&#xff0c;“百模大战”也已然在太平洋两岸同时拉开了帷幕。 近几个月来&#xff0c;OpenAI ChatGPT 的…

记frp内网穿透配置

这两天由于想给客户看一下我们的系统&#xff0c;于是想到用内网穿透&#xff0c;但是怎么办呢&#xff0c;没有用过呀&#xff0c;于是各处找资料&#xff0c;但是搞完以后已经不记得参考了那些文档了&#xff0c;对不起各位大神&#xff0c;就只能写出过程和要被自己蠢死的错…

一文了解,AI圈大火的虚拟数字人到底是什么?

近年来&#xff0c;人工智能技术的发展和应用已经成为科技领域的热门话题。AI不仅可以帮助人们解决各种问题&#xff0c;还可以提高生产效率、改善生活质量等方面做出贡献。而虚拟数字人作为AI技术的一种应用&#xff0c;也在不断地发展和应用&#xff0c;为人们带来更多的便利…

maven安装教程 linux

文章目录 1.maven下载1.1 移动压缩包位置1.2 解压1.3 改名 2. maven 配置修改2.1 创建仓库2.2 编辑settings.xml文件2.3 添加环境变量 1.maven下载 由于maven 暂不支持直接用yum安装遂采用此方法安装 点击链接下载apache-maven-3.6.3-bin.tar.gz wget https://archive.apach…

Javaee Spring的AOP简介

一.Spring的AOP简介 1.1 什么是AOP AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程&#xff0c;是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是…

人工智能论文的风格特点

搞清楚AI领域论文的风格特点是写出一篇高质量AI论文的前提&#xff0c;AI领域的论文有如下显著特点。 1. 论文的架构非常清晰且富有逻辑。一篇高质量的AI论文&#xff0c;读者通过大致扫一眼论文的各级标题就能够对论文的写作思路形成清晰的认识&#xff0c;明白论文各部分之间…

防火墙日志取证及分析

防火墙日志取证 网络安全解决方案的主要目的是保护网络免受攻击。它应监视安全事件并实时提醒&#xff0c;以帮助管理员尽快采取补救措施。此外&#xff0c;您需要深入的信息来分析任何漏洞的根本原因、攻击事件重建和用户活动;这就是取证日志分析的用武之地。 取证日志分析软…

广州蓝景分享—遇到网页慢,我们该怎么办?

前言 移动互联网时代&#xff0c;用户对于网页的打开速度要求越来越高。首屏作为直面用户的第一屏&#xff0c;其重要性不言而喻。优化用户体验更是我们前端开发非常需要 focus 的东西之一。 从用户的角度而言&#xff0c;当打开一个网页&#xff0c;往往关心的是从输入完网页…

计算机:理解操作系统:内存篇(中)

内存 1.堆和栈的本质是什么2. java、Python等内存模型3. java内存模型3.1 java中堆和栈是如何实现的 4. Python内存模型 什么是内存 C/C内存模型 堆区与栈区的本质 Java、Python等内存模型 Java内存模型 Jave中的堆区与栈区是如何实现的 Python内存模型 指针与引用 进程的内存…

企业网站架构部署与优化 LNMP

【安装 Nginx 服务】 systemctl stop firewalld systemctl disable firewalld setenforce 0 1、安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 2、创建运行用户 useradd -M -s /sbin/nologin nginx 3、编译安装 cd /opt tar zxvf nginx-1.12.0.tar.gz -C …

Apifox软件的基础使用方式

Apifox软件的基础使用方式 简单方便的用途 该工具是接口在线调试工具&#xff0c;这里我给到连接供大家去官网下载&#xff0c;我个人觉得是比较于postman工具好用&#xff0c;提供的语言操作是中文版本的便于操作 下载和安装 https://apifox.com/?utm_sourcebaidu&ut…

【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】

目录 1.简介2.环境安装2.1安装torch相关库2.2 获取yolov8最新版本&#xff0c;并安装依赖 3. 如何使用模型用于各种CV任务3.1 目标检测任务实现检测图片代码检测视频代码 3.2 分割任务实现分割图片代码分割视频代码 3.3 追踪任务3.4 姿态检测任务姿态检测&#xff08;图片&…