【iOS安全】iOS ARM汇编

news/2024/9/24 2:50:44/

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.ppmy.cn/news/1429152.html

相关文章

mac tcp实现客户端与服务端进行图像传输及处理

客户端发送图像到服务端&#xff0c;服务端对图像进行处理&#xff0c;在将处理后的图像发送到客户端&#xff0c;并且服务端持续监听客户端。 客户端 #include <iostream> #include <fstream> #include <vector> #include <unistd.h> #include <…

Jackson知识点记录

文章目录 一.Jackson模块说明 二.ObjectMapper基本功能使用ObjectMapper的一些核心方法&#xff1a;示例代码1. 序列化示例2. 反序列化示例3. JsonNode 处理示例 高级配置 三.各种Node1. ObjectNode2. ArrayNode3. ValueNode4. MissingNode示例 一.Jackson Jackson 库主要分为…

Cjson 库使用

1. JSON简介 JSON全称 JavaScript Object Notation&#xff0c;即 JS对象简谱&#xff0c;是一种轻量级的数据格式。 它采用完全独立于编程语言的文本格式来存储和表示数据&#xff0c;语法简洁、层次结构清晰&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成…

耀斑层-如何在Unity中实现耀斑亮光效果

在Unity中实现耀斑亮光效果可以通过以下步骤来实现&#xff1a; 创建一个空物体作为光源&#xff1a;在场景中创建一个空物体&#xff0c;并将其放置在需要发出耀斑亮光效果的位置上。 添加光源组件&#xff1a;选中空物体&#xff0c;在Inspector面板中点击"Add Compone…

利用Django中的缓存系统提升Web应用性能

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在构建现代Web应用时&#xff0c;性能通常是至关重要的考虑因素之一。为了提高用户体验和应…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c…

视频教程下载:用ChatGPT的 API 开发AI应用指南

通过这门关于 OpenAI API 和 ChatGPT API 的全面课程&#xff0c;在您的应用中释放人工智能的力量。随着人工智能技术的快速发展&#xff0c;比以往任何时候都更重要的是保持领先地位&#xff0c;并为您的项目利用这些尖端工具。在本课程中&#xff0c;您将深入了解人工智能驱动…

云服务器安装docker环境

文章目录 1. Docker安装2. Portainer安装 可以使用termins连接服务器 1. Docker安装 查看系统的内核版本&#xff1a; uname -ryum 更新到最新版本 sudo yum update看到显示 Complete 就代表完成了&#xff0c;整个过程需要 5-10 分钟左右 安装Docker所需的依赖包 sudo yum…