当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

最低0.47元/天 解锁文章
1256

被折叠的 条评论
为什么被折叠?



