当前位置: 首页 > news >正文

iOS Swift逆向——被编译优化后的函数参数调用约定修复

头文件导入:

typedef long long s64;
typedef unsigned long long u64;typedef s64 Int;
typedef u64 Bool;struct Swift::String
{u64 _countAndFlagsBits;void *_object;
};union Swift_ElementAny {Swift::String stringElement;
};struct Swift_Any {Swift_ElementAny element;u64 unknown;s64 type;
};struct Swift_ArrayAny {s64 length;Swift_Any *items;
};

 https://github.com/doronz88/swift_reversing

 https://github.com/doronz88/ida-scripts/blob/main/swift.py

Swift <=> OC的兼容层

小gadget(片段)

; void sub_101A34B60()
sub_101A34B60
MOV             X0, X20 ; id
B               _objc_release
; End of function sub_101A34B60

因为_objc_release的参数只要X0。修复为:

void __usercall sub_101A34B60(__int64 a1@<X20>)

根据swift官方文档,X20是self。所以这是内存引用计数-1。

https://github.com/swiftlang/swift/blob/13da4c2ad3077282f7c8922b293a74c32e79e428/docs/ABI/CallConvSummary.rst#L151


字符串操作

字符串对象由两个寄存器构成。

以String.append为例进行修复调用约定: 

X20是self。

Swift::Void __usercall String.append(_:)(void *a1@<X20>, Swift::String a2@<X0:X1>)
{__imp__$sSS6appendyySSF(a2._object, a2._countAndFlagsBits);
}
Swift::String __usercall dispatch thunk of CustomStringConvertible.description.getter@<X0:X1>(void *a1@<X20>,__int64 *a2@<X0>,__int64 *a3@<X1>)

 a=100;print("myIntVariable1= \(a)")的整理后IDA结果:

  v11 = 0xD000000000000010LL;                   // myIntVariable1= v12 = (id)0x800000010000CDF0LL;v10 = 100LL;v3 = dispatch thunk of CustomStringConvertible.description.getter(&v10,&type metadata for Int,&protocol witness table for Int);String.append(_:)(&v11, (Swift::String)__PAIR128__(v3._countAndFlagsBits, (unsigned __int64)v3._object));swift_bridgeObjectRelease(v3._object);v4 = v11;v5 = v12;*(_QWORD *)(v2 + 56) = &type metadata for String;*(_QWORD *)(v2 + 32) = v4;*(_QWORD *)(v2 + 40) = v5;v15._countAndFlagsBits = 32LL;v15._object = (void *)0xE100000000000000LL;v18._countAndFlagsBits = 10LL;v18._object = (void *)0xE100000000000000LL;print(_:separator:terminator:)((Swift_ArrayAny *)v2, v15, v18);swift_release(v2);

字符串Array

Swift::String __usercall BidirectionalCollection___joined_separator__@<X0:X1>(Swift_ArrayAny@<X20:X21>, Swift::String@<X0:X1>, __int64@<X2>, __int64@<X3>)


栈内存偏移计算相关小函数 

原先的函数点开里面是空的。 

sub_101A348B8
LDUR            X8, [X0,#-8]
LDR             X8, [X8,#0x40]
MOV             X9, SP
ADD             X8, X8, #0xF
AND             X8, X8, #0xFFFFFFFFFFFFFFF0
SUB             X19, X9, X8
MOV             SP, X19
RET
; End of function sub_101A348B8

 定义结构体:

00000000 stack_offset_struc struc ; (sizeof=0x18, copyof_7619)
00000000 offset          DCQ ?
00000008 sp              DCQ ?
00000010 addr            DCQ ?
00000018 stack_offset_struc ends

 定义调用约定。F5之后,函数体原来出现内容。

stack_offset_struc __usercall __spoils<> sub_101A348B8@<0:X8, 8:X9, 16:X19>(__int64 a1@<X0>)
{__int64 *v1; // x9__int64 v2; // x8char *v3; // x19__int64 v4; // [xsp+0h] [xbp+0h] BYREFstack_offset_struc result; // 0:x8.16,16:x19.8v1 = &v4;v2 = (*(_QWORD *)(*(_QWORD *)(a1 - 8) + 64LL) + 15LL) & 0xFFFFFFFFFFFFFFF0LL;v3 = (char *)&v4 - v2;result.addr = (__int64)v3;result.sp = (__int64)v1;result.offset = v2;return result;
}

另一个函数也进行修复:

sub_101A34B84
LDUR            X28, [X0,#-8]
LDR             X8, [X28,#0x40]
MOV             X9, SP
ADD             X8, X8, #0xF
AND             X8, X8, #0xFFFFFFFFFFFFFFF0
RET
stack_offset_struc __usercall __spoils<> sub_101A34B84@<0:X8, 8:X9, 16:X28>(__int64 a1@<X0>)
{__int64 v1; // x28__int64 *v2; // x9__int64 v3; // x8__int64 v4; // [xsp+0h] [xbp+0h] BYREFstack_offset_struc result; // 0:x8.16,16:x28.8v1 = *(_QWORD *)(a1 - 8);v2 = &v4;v3 = (*(_QWORD *)(v1 + 64) + 15LL) & 0xFFFFFFFFFFFFFFF0LL;result.addr = v1;result.sp = (__int64)v2;result.offset = v3;return result;
}

这两个小函数,其实是完全一样的。

可以发现第二个函数sub_101A34B84相比较于sub_101A348B8少了最后的SUB。其实这个SUB在上层调用者函数里面,看最后两行汇编:

STP             X28, X27, [SP,#-0x10+var_50]!
STP             X26, X25, [SP,#0x50+var_40]
STP             X24, X23, [SP,#0x50+var_30]
STP             X22, X21, [SP,#0x50+var_20]
STP             X20, X19, [SP,#0x50+var_10]
STP             X29, X30, [SP,#0x50+var_s0]
ADD             X29, SP, #0x50
SUB             SP, SP, #0x70
MOV             X20, X3
MOV             X23, X2
MOV             X24, X1
MOV             X25, X0
ADRL            X21, unk_1039839C0
MOV             X0, X21
BL              sub_1000B6ED0
BL              sub_101A348B8
BL              sub_101A34D54
MOV             X22, X0
BL              sub_101A34B84
SUB             X27, X9, X8
MOV             SP, X27

修复完成后,返回调用该函数的上层函数,在按F5。可以看到恢复之后的代码。

参考IDA官网博客里面的内容: 

 https://hex-rays.com/blog/author/igor-skochinsky

相关文章:

iOS Swift逆向——被编译优化后的函数参数调用约定修复

头文件导入&#xff1a; typedef long long s64; typedef unsigned long long u64;typedef s64 Int; typedef u64 Bool;struct Swift::String {u64 _countAndFlagsBits;void *_object; };union Swift_ElementAny {Swift::String stringElement; };struct Swift_Any {Swift_Ele…...

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning&#xff0c;在講self-supervised learning之前呢&#xff0c;就不能不介紹一下芝麻街&#xff0c;為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…...

基于RBF神经网络的双参数自适应光储VSG构网逆变器MATLAB仿真模型

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 此模型源侧部分采用光伏发电系统与混合储能系统&#xff08;蓄电池超级电容&#xff09;&#xff0c;并网逆变器采用虚拟同步发电机&#xff08;VSG&#xff09;控制&#xff0c;为系统提供惯量阻尼支撑。同…...

Openpyxl--学习记录

1.工作表的基本操作 1.1 工作表的新建打开与保存 1.1.1 创建工作簿 from openpyxl import Workbook from pathlib import Pathfile_path Path.home() / "Desktop" / "123.xlsx"# 1.创建工作簿 wb Workbook() # 2.访问默认工作簿 ws wb.active # 3.填充…...

高边坡稳定安全监测预警系统解决方案

一、项目背景 高边坡的滑坡和崩塌是一种常见的自然地质灾害&#xff0c;一但发生而没有提前预告将给人民的生命财产和社会危害产生严重影响。对高边坡可能产生的灾害提前预警、必将有利于决策者采取应对措施、减少和降低灾害造成的损失。现有的高边坡监测技术有人工巡查和利用测…...

计算机毕业设计 | vue+springboot借书管理 图书馆管理系统(附源码)

1&#xff0c;项目背景 1.1 课题背景 随着现在科学技术的进步&#xff0c;人类社会正逐渐走向信息化&#xff0c;图书馆拥有丰富的文献信息资源&#xff0c;是社会系统的重要组成部分&#xff0c;在信息社会中作用越来越重要&#xff0c;在我国图书馆计算机等 信息技术的应用…...

vue3 腾讯地图 InfoWindow 弹框

1、vue项目index.html引入地图js 2、页面使用 <script setup lang"ts"> import { useMapStore } from //store;defineOptions({ name: PageMap }); const emits defineEmits([update:area, update:address, update:latitude, update:longitude]); const prop…...

【Linux】解锁进程间通信奥秘,高效资源共享的实战技巧

管道、共享内存、消息队列、信号量 1. 进程间通信1.1. 目的1.2. 概念和本质1.3. 分类 2. 管道2.1 概念2.2. 4种情况2.3. 4种特性2.4. 匿名管道2.4.1. 原理2.4.2. 概念2.4.3. 创建 — pipe()2.4.4. 应用场景 — 进程池 2.5. 命名管道2.5.1. 概念和原理2.5.2. 创建 — mkfifo()2.…...

O1 Nano:OpenAI O1模型系列的简化开源版本

概览 O1 Nano 是一个开源项目&#xff0c;它实现了 OpenAI O1 模型系列的简化版本。O1 模型是一个高级语言模型&#xff0c;它在训练和推理过程中整合了链式思维和强化学习。这个实现版本&#xff0c;称为 O1-nano&#xff0c;专注于解决算术问题&#xff0c;以展示模型的能力。…...

浅谈人工智能之Llama3微调后使用cmmlu评估

浅谈人工智能之Llama3微调后使用cmmlu评估 引言 随着自然语言处理&#xff08;NLP&#xff09;技术的发展&#xff0c;各类语言模型如雨后春笋般涌现。其中&#xff0c;Llama3作为一个创新的深度学习模型&#xff0c;已经在多个NLP任务中展示了其强大的能力。然而&#xff0c…...

为什么需要MQ?MQ具有哪些作用?你用过哪些MQ产品?请结合过往的项目经验谈谈具体是怎么用的?

需要使用MQ的主要原因包括以下几个方面‌&#xff1a; ‌异步处理‌&#xff1a;在分布式系统中&#xff0c;使用MQ可以实现异步处理&#xff0c;提高系统的响应速度和吞吐量。例如&#xff0c;在用户注册时&#xff0c;传统的做法是串行或并行处理发送邮件和短信&#xff0c;这…...

Flutter项目打包ios, Xcode 发布报错 Module‘flutter barcode_scanner‘not found

报错图片 背景 flutter 开发的 apple app 需要发布新版本&#xff0c;但是最后一哆嗦碰到个报错&#xff0c;这个小问题卡住了我一天&#xff0c;之间的埪就不说了&#xff0c;直接说我是怎么解决的&#xff0c;满满干货 思路 这个报错 涉及到 flutter_barcode_scanner; 所…...

RWSENodeEncoder, KER_DIM_PE(lrgb文件中的encoders文件中的kernel.py)

该代码实现了一个基于核的节点编码器 KernelPENodeEncoder,用于在图神经网络中将特定的核函数编码(例如随机游走结构编码 RWSE)与节点特征相结合。通过将预先计算的核统计信息(如 RWSE 等)与原始节点特征结合,该编码器可以帮助模型捕捉图中节点的结构信息。该代码还定义了…...

技术文档:基于微信朋友圈的自动点赞工具开发

概述 该工具是一款基于 Windows 平台的自动化操作工具&#xff0c;通过模拟人工点击&#xff0c;实现微信朋友圈的自动点赞。主要适用于需频繁维护客户关系的用户群体&#xff0c;避免手动重复操作&#xff0c;提高用户的互动效率。 官方地址: aisisoft.top 一、开发背景与技术…...

kubernetes_pods资源清单及常用命令

示例&#xff1a; apiVersion: v1 kind: Pod metadata:name: nginx-podnamespace: defaultlabels:app: nginx spec:containers:- name: nginx-containerimage: nginx:1.21ports:- containerPort: 80多个容器运行示例 apiVersion: v1 kind: Pod metadata:name: linux85-nginx-…...

科目二侧方位停车全流程

科目二侧方位停车是驾考中的重要项目&#xff0c;主要评估驾驶员将车辆准确停放在道路右侧停车位的能力。以下是对科目二侧方位停车的详细解析&#xff1a; 请点击输入图片描述&#xff08;最多18字&#xff09; 一、考试要求 车辆需在库前右侧稳定停车&#xff0c;随后一次性…...

2024源鲁杯CTF网络安全技能大赛题解-Round2

排名 欢迎关注公众号【Real返璞归真】不定时更新网络安全相关技术文章&#xff1a; 公众号回复【2024源鲁杯】获取全部Writeup&#xff08;pdf版&#xff09;和附件下载地址。&#xff08;Round1-Round3&#xff09; Misc Trace 只能说题出的太恶心了&#xff0c;首先获得一…...

10.24学习

1.const 在编程中&#xff0c; const 关键字通常用来定义一个常量。常量是程序运行期间其值不能被改变的变量。使用 const 可以提高代码的可读性和可靠性&#xff0c;因为它可以防止程序中意外修改这些值。 不同编程语言中 const 的用法可能略有不同&#xff0c;以下是一…...

社交媒体与客户服务:新时代的沟通桥梁

在数字化时代&#xff0c;社交媒体已成为人们日常生活中不可或缺的一部分&#xff0c;它不仅改变了人们的沟通方式&#xff0c;也深刻影响着企业的客户服务模式。从传统的电话、邮件到如今的社交媒体平台&#xff0c;客户服务的渠道正在经历一场前所未有的变革。社交媒体以其即…...

设置虚拟机与windows间的共享文件夹

在 VMware Workstation 或 VMware Fusion 中设置共享文件夹的具体步骤如下&#xff1a; 1. 启用共享文件夹 对于 VMware Workstation 打开 VMware Workstation&#xff1a; 启动 VMware Workstation&#xff0c;找到你要设置共享文件夹的虚拟机。 设置虚拟机&#xff1a; 选…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...