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

iOS Swift逆向——deMangle过程中的偏移计算

碰到好多函数最开始都会调用这个函数,xref了一下,发现有上万个xref。

__int64 __fastcall sub_1000B6ED0(__int64 *a1)
{__int64 result; // x0result = *a1;if ( result < 0 ){result = swift_getTypeByMangledNameInContext((char *)a1 + (int)result, -(result >> 32), 0LL, 0LL);*a1 = result;}return result;
}

  

计算实现De-Mangle,可以给sub开头的方法做备注了。

以下面这个ref为例:

v8 = sub_1000B6ED0(&unk_1039839C0);
__data:00000001039839C0 unk_1039839C0   DCB 0x1C                ; DATA XREF: sub_1000219E0+34↑o
__data:00000001039839C0                                         ; sub_1000219E0+88↑o ...
__data:00000001039839C1                 DCB 0x80
__data:00000001039839C2                 DCB 0x4D ; M
__data:00000001039839C3                 DCB 0xFF
__data:00000001039839C4                 DCB 0xF9
__data:00000001039839C5                 DCB 0xFF
__data:00000001039839C6                 DCB 0xFF
__data:00000001039839C7                 DCB 0xFF
__data:00000001039839C8 unk_1039839C8   DCB 0xB8                ; DATA XREF: sub_10010950C+18↑o
__data:00000001039839C8                                         ; sub_1002C06B0↑o ...
__data:00000001039839C9                 DCB 0x2A ; *
__data:00000001039839CA                 DCB 0x4B ; K
__data:00000001039839CB                 DCB 0xFF
__data:00000001039839CC                 DCB 0xFA
__data:00000001039839CD                 DCB 0xFF
__data:00000001039839CE                 DCB 0xFF
__data:00000001039839CF                 DCB 0xFF

 unk_1039839C0这个整理出来,地址对应X19寄存器,值对应X0寄存器

X0 = 0xFFFFFFF9FF4D801C
X19 = 0x1039839C0

写个python模拟计算一下: 

def asr(value, shift):# 算术右移函数if value & (1 << 63):# 如果最高位是1,表示负数,需要填充1return (value >> shift) | (0xFFFFFFFFFFFFFFFF << (64 - shift))else:# 否则直接右移return value >> shiftdef sxtw(value):# 符号扩展32位到64位if value & (1 << 31):# 如果最高位是1,表示负数,需要填充1return value | 0xFFFFFFFF00000000else:# 否则直接返回return value# 初始值
X0 = 0xFFFFFFF9FF4D801C
X19 = 0x1039839C0
# 算术右移32位
shifted_value = asr(X0, 32)# 取负值并确保结果在64位范围内
X1 = (-shifted_value) & 0xFFFFFFFFFFFFFFFF# 打印结果
print(f"X1 = 0x{X1:016X}")# 符号扩展W0到64位
extended_W0 = sxtw(X0 & 0xFFFFFFFF)# 相加并确保结果在64位范围内
X0 = (X19 + extended_W0) & 0xFFFFFFFFFFFFFFFF# 打印结果
print(f"X0 = 0x{X0:016X}")

输出结果: 

X1 = 0x0000000000000007
X0 = 0x0000000102E5B9DC

 byte_102E5B9DC这个字段的长度正好是7

 这个名字IDA自动给出了Demangle之后的内容。使用命令行也可以自己解析:

swift demangle s10Foundation3URLVMn                   
$s10Foundation3URLVMn ---> nominal type descriptor for Foundation.URL

http://www.lryc.cn/news/466091.html

相关文章:

  • 国产大模型基础能力大比拼 - 计数:通义千文 vs 文心一言 vs 智谱 vs 讯飞-正经应用场景的 LLM 逻辑测试
  • YOLO11改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】
  • 0基础学java之Day11
  • python主流框架Django:ORM框架关联查询与管理器
  • 如何有效维护您的WordPress在线商店内容:提高客户参与度与转化率的实用技巧
  • 【Java】认识异常
  • 20 Shell Script输入与输出
  • HCIP-HarmonyOS Application Developer 习题(十六)
  • 没有什么可以抵达乌托邦,包括AI
  • 家庭事务管理系统|基于java和vue的家庭事务管理系统设计与实现(源码+数据库+文档)
  • doris创建异步物化视图(加速数据低频变更的复杂实时计算)
  • PhpSpreadsheet创建带复杂表头的excel数据
  • BurpSuite渗透工具的简单使用
  • 洞察云上风险,主机安全尽在掌握
  • 使用kimi编辑助手,开始搭建一个微信小程序!第一天
  • 【已解决】libev not found
  • qt QVariant详解
  • 再获殊荣!通付盾当选信息技术应用创新工作委员会技术活动单位称号
  • PostgreSQL模板数据库template0和template1的异同点
  • 手机ip切换成全局模式怎么弄
  • 前端学习笔记(1.0)
  • 推动TMS-EEG数据预处理标准化
  • 国产电脑能装win系统吗_国产电脑安装windows要求及方法
  • C#Winform的控件基类Control
  • 汽车电子行业的LIMS:提升质量与效率的关键助力
  • 移动端面试问题笔记(一)
  • 从壹开始解读Yolov11【源码研读系列】——cfg:模型配置加载功能
  • 【数据库设计】逻辑结构设计
  • uni-app之旅-day07-购物车页面
  • 【机器学习】并行计算(parallel computation)Part2