15、虚拟内存LLDB高级调试

news/2024/4/29 4:07:21/文章来源:https://blog.csdn.net/SharkToping/article/details/130263462

一、虚拟内存

  • 早期的操作系统
    • 早期的操作系统,并没有虚拟内存的概念.系统由进程直接访问内存中的物理地址,这种方式存在严重的安全隐患.内存中的不同进程,可以计算出他们的物理地址,可以跨进程访问,可以随意进行数据的篡改.
    • 早期的程序也比较小,在运行时,会将整个程序全部加载到内存中.但随着软件的发展,程序越来越大,而且还有大型游戏的诞生,导致内存越来越吃紧.这就是早期系统中,为什么经常可以看到内存不足提示框.
  • 虚拟内存系统
    • 而现代的操作系统都引入了虚拟内存,进程持有的虚拟地址(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 foundInstance Methods:
- (Class)class
- (void)dealloc
- (bool)_isKVOA
  • pinternals self: 查看指定对象的成员属性
(lldb) pinternals 0x10b89a400
(WCUITextField) $55 = {UITextField = {UIControl = {UIView = {UIResponder = {NSObject = {isa = WCUITextField{...}}}}}}m_bRestrictShareMenu = falsem_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.luyixian.cn/news_show_291354.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins安装(Linux)

文章目录 请谨慎安装最新版本的jenkins1. Jenkins 介绍1.1 jenkins使用场景 2.jenkins下载2.1上传至Linux2.2 rpm安装jenkins2.3 修改jenkins配置2.3.1 修改内容 2.4 开放端口2.5 启动jenkins2.5.1 启动错误2.5.2 添加JAVA_HOME 2.6 jenkins配置添加自定义安装java目录2.7 Erro…

Python每日一练(20230423)

目录 1. 删除链表的倒数第 N 个结点 &#x1f31f;&#x1f31f; 2. 最小覆盖子串 &#x1f31f;&#x1f31f;&#x1f31f; 3. 二叉树的层序遍历 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏…

小米集团Jira实战:如何在高负载状态下保持Jira性能与运行稳定

2023年4月14日&#xff0c;Atlassian中国合作伙伴企业日上海站圆满落幕。作为Atlassian全球白金合作伙伴、云专业伙伴&#xff0c;龙智参与了此次活动&#xff0c;并邀请小米集团信息技术部SRE薛世英作为演讲嘉宾&#xff0c;分享了小米公司的Jira实战经验。 以“小米集团Jira实…

【手撕MyBatis源码】执行器与缓存

文章目录 概述执行器(Executor)执行器总结 缓存MyBatis缓存概述一级缓存(LocalCache)Spring集成MyBatis后一级缓存失效的问题二级缓存二级缓存组件结构二级缓存的使用为什么要提交之后才能命中二级缓存?二级缓存结构二级缓存执行流程 概述 通过一条修改语句&#xff0c;我们来…

完美解决丨RuntimeError: create_session() called before __init__().

错误&#xff1a; import sys sys.path.append(/home/pi/ssd-detect) import ssd_detect ssd_detect.detect(/home/pi/ssd-detect/test.jpg) 报错如下&#xff1a; Traceback (most recent call last): File "test.py", line 6, in <module ssd_detect.detect(/ho…

java二维数组遍历

在 java中&#xff0c;二维数组是指在二维平面上的一个数组。在二维数组中&#xff0c;数据都是按行排序的。我们通常可以用“从上到下”、“从左到右”、“从后到前”等方法来遍历二维数组。由于二维数组中数据的有序性&#xff0c;我们可以在二维数组中快速地找到我们所需要的…

Python数据结构与算法-RAS算法(p96)

一、RSA加密算法简介 1、加密算法概念 传统密码: 加密算法是秘密的 现代密码系统:加密算法是公开的&#xff0c;密钥是秘密的&#xff1b;&#xff08;密钥可能是随机生成的&#xff0c;与他人不一致&#xff09; 对称加密—加密和解密用的同一个密钥 非对称加密—加密和解密用…

客户端请求耗时严重原因排查优化 (Nginx导致)

客户端请求耗时严重&#xff0c;初步从几个方面进行排查 1.检查网络连接&#xff0c;是否实现丢包&#xff0c;网络波动&#xff0c;网络拥堵等问题。 2.检查客户端请求耗时和project api 接口耗时差异&#xff0c;判断是nginx问题还是接口问题 如果是nginx耗时导致&#xff0c…

用CentOS服务器自己搭建部署个Discuz论坛网站,网站搭建教程

Linux系统CentOS服务器使用堡塔搭建论坛网站全套教程。服务器大本营&#xff0c;技术文章内容集合站发车啦&#xff01; 操作系统&#xff1a;Centos 7.6 网站程序&#xff1a;Discuz-X3.4 前言 首先&#xff0c;搭建一个网站需要准备&#xff1a;服务器、域名、网站程序。 …

php使用tcpdf,通过html生成的pdf文件,合同章(图片)错位?需要怎么解决

php使用tcpdf&#xff0c;通过html生成的pdf文件&#xff0c;合同章有错位&#xff1f;需要怎么解决&#xff1f; 1、html下的排版正确&#xff0c;如图&#xff1a; 2、html代码&#xff0c;如图 3、生成pdf后的文件&#xff0c;如图 $pdf->Image()&#xff0c;计算一下x、…

如何利用工时表来帮助项目管理做得更完善?

项目管理是一项复杂的任务&#xff0c;需要协调各种资源以确保项目按时交付。其中一个关键方面是管理各个员工工时。工时表软件是一种可以帮助企业记录各个员工工作时效的工具&#xff0c;而且还可以帮助项目管理者记录和跟踪项目成员的时间。那么如何利用工时表来帮助项目管理…

贝叶斯学习(Bayesian Learning)基础篇

Bayesian Learning 前言Motivation and IntroductionThink about Spam Filtering.先验概率后验概率似然度边际概率 Basic assumptionRelevancePractical diculties Bayes TheoremProbability: random eventsBayesian Learning Maximum A Posteriori HypothesisBayes Optimal Cl…

Java核心技术 卷1-总结-9

Java核心技术 卷1-总结-9 使用异常机制的技巧为什么要使用泛型程序设计定义简单泛型类泛型方法类型变量的限定 泛型类型的继承规则 使用异常机制的技巧 1.异常处理不能代替简单的测试。 使用异常的基本规则是&#xff1a;只在异常情况下使用异常机制。 2.不要过分地细化异常。…

人机交互有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是几个人机交互领域的SCI期刊推荐&#xff1a; ACM Transactions on Computer-Human Interaction (ACM TOCHI)&#xff1a; 由ACM&#xff08;Association for Computing Machinery&#xff09;出版的人机交互领域的顶级期刊之一&#xff0c;发表关于计算机和人之间相互作…

简单聊下HBase

大家好&#xff0c;我是易安&#xff01; Google发表了三篇论文&#xff0c;即GFS、MapReduce和BigTable&#xff0c;被誉为“三驾马车”&#xff0c;开启了大数据时代。今天我们来聊一下BigTable对应的NoSQL系统HBase&#xff0c;看看它是如何处理海量数据的。 在计算机数据存…

客户体验的重要性和企业发展的紧密联系

近年来&#xff0c;随着企业数字化转型的加速&#xff0c;客户服务的意义越来越被人们所重视。客户服务的质量不仅直接影响到客户满意度和忠诚度&#xff0c;而且会间接影响到企业的品牌口碑和市场竞争力。然而&#xff0c;目前市面上的很多企业帮助中心搭建平台&#xff0c;可…

Point cloud tools for Matlab(点云学习工具)

Point cloud tools for Matlab (tuwien.ac.at)https://www.geo.tuwien.ac.at/downloads/pg/pctools/pctools.html#PointCloud_class 下载&#xff1a;Download Matlab Code 添加路径 addpath(genpath(D:\MyMatlabCode\pointCloudTools)); pc pointCloud(Lion.xyz); pc.plot…

redis入门必会知识

Redis基础知识目录 5、sortedSet 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 一、redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务 ! 是一个开源的使用ANSI C语言编写…

Python 查看数据常用函数

Python 查看数据常用函数&#xff08;以 iris 数据集为例&#xff09; 1、查看前后几行数据&#xff1a;head 和 tail2、查看数据基本信息&#xff1a;info3、查看数据统计信息&#xff1a;describe 查看数据可以用很多函数&#xff0c;这里就挑选几个最常用的进行简单展示&…

除了学历,你更需要有能力

遥想当年&#xff0c;家里培养出一个大学生&#xff0c;是多荣耀的事&#xff01;可现今却处于一个比较尴尬的状态。 为什么大学生贬值得这么厉害&#xff1f;其实大学生之所以会不值钱不外乎三大原因&#xff1a;量大、与企业需求不匹配、质量差。 高校扩招下&#xff0c;大…