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

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

cpp 复制代码
__int64 __fastcall sub_1000B6ED0(__int64 *a1)
{
  __int64 result; // x0

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

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

以下面这个ref为例:

cpp 复制代码
v8 = sub_1000B6ED0(&unk_1039839C0);
cpp 复制代码
__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寄存器

cpp 复制代码
X0 = 0xFFFFFFF9FF4D801C
X19 = 0x1039839C0

写个python模拟计算一下:

python 复制代码
def asr(value, shift):
    # 算术右移函数
    if value & (1 << 63):
        # 如果最高位是1,表示负数,需要填充1
        return (value >> shift) | (0xFFFFFFFFFFFFFFFF << (64 - shift))
    else:
        # 否则直接右移
        return value >> shift
    
def sxtw(value):
    # 符号扩展32位到64位
    if value & (1 << 31):
        # 如果最高位是1,表示负数,需要填充1
        return value | 0xFFFFFFFF00000000
    else:
        # 否则直接返回
        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}")

输出结果:

python 复制代码
X1 = 0x0000000000000007
X0 = 0x0000000102E5B9DC

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

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

python 复制代码
swift demangle s10Foundation3URLVMn                   
$s10Foundation3URLVMn ---> nominal type descriptor for Foundation.URL
相关推荐
念九_ysl8 分钟前
Java 使用 OpenHTMLToPDF + Batik 将含 SVG 遮罩的 HTML 转为 PDF 的完整实践
java·开发语言·pdf
yaoxin52112318 分钟前
124. Java 泛型 - 有界类型参数
java·开发语言
liulilittle37 分钟前
深度剖析:OPENPPP2 libtcpip 实现原理与架构设计
开发语言·网络·c++·tcp/ip·智能路由器·tcp·通信
88号技师44 分钟前
2025年6月一区-田忌赛马优化算法Tianji’s horse racing optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
勤奋的知更鸟1 小时前
Java 编程之模板方法模式
java·开发语言·模板方法模式
上单带刀不带妹2 小时前
手写 Vue 中虚拟 DOM 到真实 DOM 的完整过程
开发语言·前端·javascript·vue.js·前端框架
-凌凌漆-2 小时前
【Qt】QStringLiteral 介绍
开发语言·qt
程序员爱钓鱼2 小时前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin
军训猫猫头3 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
真的想上岸啊3 小时前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习