Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(五)

news/2024/6/16 10:32:23/文章来源:https://blog.csdn.net/mydo/article/details/136995063

在这里插入图片描述

概览

我们在上一篇

  • Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(四)

博文中“一头扎入”系统底层,从汇编语言的角度详细介绍了 iOS 运行时(Runtime)方法调用栈的跟踪、以及如何恣意更改方法调用链走向等理论知识。
在这里插入图片描述

“纸上来得终觉浅,绝知此事要躬行”,而在本篇我们就来实际拥抱汇编代码,“撸起袖子秀上一波”吧。

在本篇博文中,您将学到如下内容:

  • 概览
  • 8. 走进 ARM64 汇编的世界
  • 9. 让汇编代码告别“傻白甜”
  • 10. 番外篇:另一种更简洁的方案
  • 总结

这是本系列最后一篇文章,我们的大冒险已接近尾声,收官之战就在眼前!

那小伙伴们怎能止步不前呢?让我们马上圆满本次探险之旅吧!

Let’s put an end to it!!!😉


8. 走进 ARM64 汇编的世界

承接上一篇博文,我们首先新建一个汇编源代码文件,文件后缀应该为 .s。


Xcode 对汇编语法的支持实在“强差人意”,如果可能的话大家可以找一个优秀的汇编代码编辑器。

比如 Sublime Text 或 VS Code 等都是优选。


将下面的代码“塞入”新建的汇编源代码文件里:

.text.globl  _asm_test.p2align 2
_asm_test:// 申请堆栈空间并保存 fp、lr 寄存器sub    sp, sp, #0xF0stp    x29, x30, [sp, #0xE0]add    x29, sp, #0xE0// 保存任何可能被覆写的寄存器str    x0,[x29, #-0x8]str    x1,[x29, #-0x10]str    x2,[x29, #-0x18]str    x3,[x29, #-0x20]str    x4,[x29, #-0x28]str    x5,[x29, #-0x30]str    x6,[x29, #-0x38]str    x7,[x29, #-0x40]str    x8,[x29, #-0x48]str    x9,[x29, #-0x50]str    x10,[x29, #-0x58]str    x11,[x29, #-0x60]str    x16,[x29, #-0x68]str    x20,[x29, #-0x70]// 施展我们的“精细外科手术”:将 thunk() 中返回地址改为原地址后两条指令的地址ldr    x1,[x29]add    x1,x1,#0x8ldr    x0,[x1]add    x0,x0,#0x8str    x0,[x1]/* 拓展功能,待实现*/// 平衡 thunk() 中原来 swift_retain() 方法的调用ldr    x16,[x29, #-0x68]ldr    x0,[x29, #-0x70

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

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

相关文章

C++多态的一些理解

C多态的一些理解 多态的概念 什么是多态?多态是C的三大特性之一。简单来说就是用一种接口(函数)来实现多种不同的功能。当我们调用同一个函数的时候,根据业务需要,会执行不同的功能,产生不同的效果。 为…

大创项目推荐 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

VSCode在文件生成添加作者,创建时间、最后编辑人和最后编辑时间等信息

一、安装插件 我使用的是 korofileheader 二、配置文件 左下角点击设置图标—设置—输入"ext:obkoro1.korofileheader"—点击"在setting.json中编辑" 进入后会自动定位到你添加信息的地方 "Author": "tom", "Date": "…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(5)

PS从入门到精通视频各类教程整理全集,包含素材、作业等 最新PS以及插件合集,可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制,今天先分享到这里,后续持续更新 初寒调色案例及练习图 等文件 https://www.alipan.…

JimuReport积木报表 v1.7.4 正式版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…

大数据量查询语句优化

测试单表模糊查询,符合条件的数量为: -- 查看总共有多少条数据 select count(0) from "REGISTER_HOUSE_INFO" where SEAT_NAME like %1% ;未优化:测试单表模糊查询分页,符合条件的数据为: select * from …

【Linux2】Linux的权限

思维导图 学习内容 在介绍完一些基本指令后,我们需要进行对权限以后一个全新的认识,比如文件的权限、目录的权限等等…… 学习内容 通过上面的学习目标,我们可以列出要学习的内容: shell命令以及运行原理Linux权限的概念Linux权…

【Frida】【Android】06_夜神模拟器中间人抓包

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

EasyExcel 复杂表头的导出(动态表头和静态表头)

问题:如图,1部分的表头是动态的根据日期变化,2部分是数据库对应的字段,静态不变的; 解决方案:如果不看1的部分,2部分内容可以根据实体类注解的方式导出,那么我们是不是可以先将动态表…

vivado 配置存储器器件编程2

为双 QSPI (x8) 器件创建配置存储器文件 您可使用 write_cfgmem Tcl 命令来为双 QSPI (x8) 器件生成 .mcs 镜像。此命令会将配置数据自动拆分为 2 个独立 的 .mcs 文件。 注释 : 为 SPIx8 生成 .mcs 时指定的大小即为这 2 个四通道闪存器件的总大小。…

[leetcode]剑指 Offer 29. 顺时针打印矩阵

前言:剑指offer刷题系列 问题: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]思路: 看到这个…

标准版IP地址证书

IP地址证书是一种网络安全工具,用于确保互联网通信中IP地址的所有权和真实性。它类似于为网站颁发的SSL/TLS证书,但专门针对IP地址。这种证书由受信任的第三方机构(如证书颁发机构)签发,包含公钥、所有者信息和有效期。…

Php_Code_challenge18

题目: 答案: 解析: strcmp遇到特殊类型数据返回0,MD5函数遇到特殊数据类型会返回0,弱类型可用16进制绕过。

el-row一行放置3个el-col,有时出现空行现象

利用el-row的type属性&#xff0c;将type设置为flex&#xff0c;启用flex布局&#xff0c;再设置justify和align属性&#xff0c;即可避免该问题出现。 <el-row type"flex" class"row-bg"><el-col :span"6"><div class"gri…

数据结构之栈

栈的概念 栈是一种遵从后进先出原则的有序集合添加新元素的一端称为栈顶&#xff0c;另一端称为栈底操作栈的元素时&#xff0c;只能从栈顶操作&#xff08;添加、移除或取值&#xff09; 栈的实现 push() 入栈方法pop() 出栈方法top() 获取栈顶值size() 获取栈的元素个数cle…

3月27日 磁盘操作Linux下安装MySQL

3月27日 磁盘操作&&Linux下安装MySQL 一&#xff0e; 增加磁盘 增加了2个磁盘&#xff0c;然后重启系统。 #lsblk 可用于查看所有设备挂载情况 注意&#xff1a;增加了2块硬盘&#xff0c;分别是sdb和sdc,但是这2块硬盘没有分区也没有格式化&#xff0c;无法使用 Li…

使用pillow创建动态图形验证码

使用pillow创建动态图形验证码 #安装pillow模块&#xff1a;pip3 install pillow from PIL import Image,ImageDraw,ImageFont import random import stringdef id_code(width,height,bit,font_file,font_size):"""功能&#xff1a;生成随机图片验证码:param w…

Java毕业设计-基于Spring Boot的在线考试系统-毕业论文+答辩ppt(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统登录注册2、管理员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于Spring Boot的在线考试系统-毕…

如何用Git在终端以可视化的方式查看提交情况

2024年4月2日&#xff0c;周二上午 要使用 Git 查看树状提交情况&#xff0c;可以使用 git log 命令的 --graph 选项。这个选项会以树状图的形式显示提交历史&#xff0c;清晰地展示每个提交的分支合并情况和分支间的关系。 git log --graph 除了 --graph 选项外&#xff0c;还…

如何将Maven与TestNG集成

我们已经讨论了如何在maven中执行单元测试用例&#xff0c;但那些是JUnit测试用例&#xff0c;而不是TestNG。当maven使用“mvn test”命令进入测试阶段时&#xff0c;这些用例被执行。 本文将介绍如何将Maven与TestNG集成&#xff0c;并在maven进入测试阶段时执行TestNG测试。…