碰到好多函数最开始都会调用这个函数,xref了一下,发现有上万个xref。
__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为例:
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,表示负数,需要填充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}")
输出结果:
X1 = 0x0000000000000007
X0 = 0x0000000102E5B9DC
byte_102E5B9DC这个字段的长度正好是7
这个名字IDA自动给出了Demangle之后的内容。使用命令行也可以自己解析:
swift demangle s10Foundation3URLVMn
$s10Foundation3URLVMn ---> nominal type descriptor for Foundation.URL