【iOS安全】iOS ARM汇编

mov指令

MOV X22, X0
将X0的值移到X22中

参数传递

参数1:寄存器X0传递
参数2:寄存器X1传递
参数3:寄存器X2传递
参数4:寄存器X3传递
(这里的X0传递的就是第一个实际参数,而不是self、selector之类的)

如果需要传递更多参数,会使用栈来传递

返回值

ARM架构下,通常使用X0来存储返回值

ADRP指令

ADRP(Address of PC-relative Data)指令是ARM指令集中的一条指令,用于将指定的绝对地址的高16位(即地址的页索引)左移12位(乘4096,页大小)后存储到目标寄存器中

ADRP指令和LDR指令

ADRP指令通常与LDR指令结合使用

例如

ADRP X8, #classRef_CDVInvokedUrlCommand@PAGE
LDR X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF]

这两行代码的作用是 CDVInvokedUrlCommand 类的引用地址classRef_CDVInvokedUrlCommand加载到 X0 寄存器

通常,后续会将X0 作为一个参数,最终传递给_objc_msgSend函数,让_objc_msgSend的第一个参数就是X0的值,这样后面就可以调用CDVInvokedUrlCommand这个类的某个函数

(1) ADRP X8, #classRef_CDVInvokedUrlCommand@PAGE
将 classRef_CDVInvokedUrlCommand 类的引用地址的高16位存储到 X8 中

  • ADRP 用于将指定的绝对地址的高16位(即地址的页索引)左移12位(乘以4096,页大小)后存储到目标寄存器中
  • # 表示后面的操作数是一个立即数
  • classRef_CDVInvokedUrlCommand@PAGE 是一个标签,表示类的引用地址的高16位
    • PAGE 表示取地址的高16位

(2) LDR X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF]
从基址为X8,偏移量为 classRef_CDVInvokedUrlCommand 的低16位的地址处,加载一个值到 X0

  • LDR 从地址取值
  • classRef_CDVInvokedUrlCommand@PAGEOFF 是一个标,表示类的引用地址的低16位
    • PAGEOFF 表示取地址的低16位

完整的使用例如:

;00000001002FE1D8
ADRP            X8, #classRef_CDVInvokedUrlCommand@PAGE
LDR             X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF] 
MOV             X2, X21
BL              sub_101FFCD40
MOV             X20, X0

其中,此时X1是当前函数的Selector(记作selector2), X2来自X21 是一个局部变量(记作ScriptMessage_body2),X20记作v16
那么这里就相当于

v16 = sub_101FFCD40(&OBJC_CLASS___CDVInvokedUrlCommand, selector2, ScriptMessage_body2);

我们G到101FFCD40处看看sub_101FFCD40是什么

;0000000101FFCD40
ADRP            X1, #selRef_commandFromJson_@PAGE
LDR             X1, [X1,#selRef_commandFromJson_@PAGEOFF]
ADRP            X16, #_objc_msgSend_ptr@PAGE
LDR             X16, [X16,#_objc_msgSend_ptr@PAGEOFF]
BR              X16

同上,不再赘述,这里相当于

return _objc_msgSend(&OBJC_CLASS___CDVInvokedUrlCommand, "commandFromJson:", ScriptMessage_body2);

(貌似传给sub_101FFCD40的参数2 selector2直接被弃用了,没用上,我猜是编译器优化时发现没必要动X1,所以就直接传下来了)

类似于

return [CDVInvokedUrlCommand commandFromJson:ScriptMessage_body2];

也就是

return CDVInvokedUrlCommand.commandFromJson(ScriptMessage_body2);

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

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

相关文章

InFusion:通过从扩散先验学习深度完成来修复3D高斯

InFusion: Inpainting 3D Gaussians via Learning Depth Completion from Diffusion Prior InFusion:通过从扩散先验学习深度完成来修复3D高斯 Zhiheng Liu * 刘志恒 *1144Hao Ouyang * 欧阳浩 *2233Qiuyu Wang 王秋雨33Ka Leong Cheng 郑家亮2233Jie Xiao 街小…

Elasticsearch常用查询语法及RestClient操作

DSL Query基本语法 1,查询所有数据matchall(当然并不是会显示所有数据) #查询所有数据 GET /索引名/_search {"query": {"查询类型": {"查询条件":"条件值"}} }2,全文搜索检索-分词搜索…

从零实现诗词GPT大模型:实现Transformer架构

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 首先说明一下,跟其他文章不太一样,在本篇文章中不会对Transformer架构中的自注意力机制进行讲解,而是后面单独1~2篇文章详细讲解自注意力机制,我认为由浅入深的先了解Transformer整体架构和其中比较简单…

IDEA JAVA项目如何设置JVM参数

问题背景: 有时候项目在本地启动时会报参数引用不到,如果确实找不到在哪里添加的话,我们可以先加JVM参数来暂时解决本地环境的调试。 解决方案: 编辑配置Edit Configurations 选择需要配置的项目,点击Modify options 选…

React基础知识大汇总

函数组件和类组件 函数组件与类组件有什么区别呢? function getName(params:{name:string}){const count 0;return params.name -count; } getName({name:"test"}) getName({name:"哈哈哈"})getName是一个纯函数,不产生任何副作用…

mfc140.dll丢失如何修复,分享多种有效的修复方法

在日常操作和使用电脑的过程中,我们可能会遇到一种较为常见的问题,即在尝试启动或运行某个应用程序时,系统突然弹出一个错误提示窗口,明确指出“mfc140.dll文件丢失”。这个mfc140.dll实际上是一个动态链接库文件(DLL&…

mysql基础19——日志

日志 mysql的日志种类非常多 通用查询日志 慢查询日志 错误日志 与时间有关联 二进制日志 中继日志 与主从服务器的同步有关 重做日志 回滚日志 与数据丢失有关 通用查询日志 记录了所有用户的连接开始时间和截至时间 以及给mysql服务器发送的所有指令 当数据异常时&…

计算机体系结构

体系结构 CPU:运算器和控制器 运算器:进行算术和逻辑运算控制器: 输入设备:鼠标、键盘、显示器、磁盘、网卡等输出设备:显卡,磁盘、网卡、打印机等存储器:内存,掉电易失总线&#xf…

借助 NVivo 彻底改变业务创新

在收集定性数据时,通常很难确定信息的情感底蕴。尤其是在金融行业,当涉及到经济金融状况和股票走势等问题时,通过文章、社交媒体和其他消费者平台了解市场的真实整体感受至关重要。这就是对数据应用情绪分析可以提供帮助的地方。 在德勤 针对…

代码随想录第42天|416. 分割等和子集

416. 分割等和子集 416. 分割等和子集 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集_哔哩哔哩_bilibili 给你一个 只包含正整数 的 非空 数组…

软件测试之【软件测试概论一】

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言软件生命周期软件项目开发过程软件项目组织架构软件开发相关模型 软件测试…

深入理解与实践“git add”命令的作用

文章目录 **git add命令的作用****git add命令的基本作用****高级用法与注意事项** git add命令的作用 引言: 在Git分布式版本控制系统中,git add命令扮演着至关重要的角色,它是将本地工作区的文件变动整合进版本控制流程的关键步骤。本文旨…

JVM 引用的分类

引用计数算法和根搜索算法都需要通过判断引用的方式判断对象是否可回收。 JDK1.2 之前,Java 中引用的定义很传统:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。 在 JDK 1.2 之后,…

每周一算法:负环判断

题目链接 负环 题目描述 给定一个 n n n 个点的有向图,请求出图中是否存在从顶点 1 1 1 出发能到达的负环。 负环的定义是:一条边权之和为负数的回路。 输入格式 本题单测试点有多组测试数据。 输入的第一行是一个整数 T T T,表示测…

《乱弹篇(30)厌战的杜诗》

时下地球村有一伙成天叫嚣着“打打杀杀”、鼓吹快快发动战争的狂人,他们视老百姓的生命如草芥,毫不珍惜。没有遭受过战火焚烧的人,也跟着成天吠叫“快开战吧”。然而中国唐朝大诗人却是个“厌战派”,他对战争的厌恶集中表现在诗《…

[系统安全] 五十七.恶意软件分析 (9)利用MS Defender实现恶意样本家族批量标注(含学术探讨)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

WebRTC的3A和SpeexDSP如何选择

SpeexDSP 是一个专门用于语音处理的开源库,它是从 Speex 项目中分离出来的。SpeexDSP 提供了多种音频处理功能,包括回声消除(AEC)、噪声抑制(ANS)、自动增益控制(AGC)以及声音的预处…

基于单目相机的标靶三维定位——编程实现

上一章内容中我们描述了基于单目相机实现标靶三维定位的原理,关键步骤为1)计算得到相机的内参和畸变系数;2)计算得到标靶角点的世界坐标和像素坐标;3)计算标靶坐标系到相机坐标系的变换矩阵。 第一点我们通过相机标定得到;第二点的核心功能我们可以借助cv::findChessboa…

放大器DC参数测试(1)

放大器DC参数测试(1) Hi,uu们,最近在忙啥呢?想好5.1,端午去哪里玩了吗? 咱们直接开始正题,放大器的DC参数还挺多,在Bench测试中,需要自动化测试,通常需要很多Relay去切换不同的配置去测量不同的参数,在这里瑞萨给出了测试参考电路.如图1所示. 图1:直流关键参数测试电路 Re…

近期分享学习心得4

1、带有多的条件的if的语句 逻辑 || 的简写 if (x true || x 2523 || x 小明) {}// 简化操作if ([true, 2523, 小明].includes(x)) {}2、查找两个数组的交集 var numOne [0, 2, 4, 6, 8, 8]; var numTwo [1, 2, 3, 4, 5, 6]; var cross [...new Set(numOne)].filter(item…