iOS Swift5逆向——Demangle过程中的偏移计算

当Swift进入ABI稳定时代和后ABI稳定时代之后,编译器都将遵守mangle编码规则。这个规则是复杂的,具体可以参考Swift的ABI相关文档:https://github.com/swiftlang/swift/blob/main/docs/ABI/Mangling.rst


让我们先看一下IDA里面经常出现的一个函数: swift_getTypeByMangledNameInContext

 这个函数的声明如下:

const void * _Nullable swift_getTypeByMangledNameInContext(
                        const char * _Nullable typeNameStart,
                        int typeNameLength,
                        const void * _Nullable context,
                        const void * _Nullable const * _Nullable genericArgs);

在实际的逆向过程中,碰到好多函数最开始都会调用这个函数,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;
}

  

第一个基本块里还有TBNZ指令判断是否只有一个问号,这个问号是为空类型。用python模拟这两条指令,

NEG             X1, X0,ASR#32
ADD             X0, X19, W0,SXTW

我们根据第二个基本块前面两个指令计算,实现De-Mangle,这样就可以给sub开头的方法做备注了。

以下面这个ref为例:

v8 = sub_1000B6ED0(&unk_1039839C0);
__data:00000001039839C0 unk_1039839C0   DCB 0x1C                ; DATA XREF: sub_1000219E0+34
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值