rsp*_*eed 36
源代码刚刚在Github上提供,看起来Swift本身主要是用C++编写的,它的标准库是用Swift编写的.
有关详细信息,请参阅Apple的此新闻稿以及新的Swift.org网站.
Swift在C中实现.您可以在此处查看一个人的分析概述:https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift
随着Swift开源,我想这个问题将在那时得到更全面的回答.
我将在下面添加一部分,但如果您有兴趣,请务必阅读整个分析:
func call_function(f : () -> Int) {
let b = f()
}
func someFunction() -> Int {
return 0
}
Run Code Online (Sandbox Code Playgroud)
在Swift中我们只写call_function(someFunction).但是,不是作为call_function(&someFunction)执行调用,而是Swift编译器生成代码:
struct swift_func_wrapper *wrapper = ... /* configure wrapper for someFunction() */
struct swift_func_type_metadata *type_metadata = ... /* information about function's arguments and return type */
call_function(wrapper->trampoline, type_metadata);
Run Code Online (Sandbox Code Playgroud)
包装器具有以下结构:
struct swift_func_wrapper {
uint64_t **trampoline_ptr_ptr; // = &trampoline_ptr
uint64_t *trampoline_ptr;
struct swift_func_object *object;
}
Run Code Online (Sandbox Code Playgroud)
什么是swift_func_object类型?要创建此对象,Swift运行时使用名为metadata [N]的全局常量(对于将func作为泛型类型的参数的每个函数调用都是唯一的,因此对于此代码:
func callf(f: () -> ()) {
f();
}
callf(someFunction);
callf(someFunction);
Run Code Online (Sandbox Code Playgroud)
将创建两个常量元数据和metadata2).
元数据[N]的结构有点像这样:
struct metadata {
uint64_t *destructor_func;
uint64_t *unknown0;
const char type:1; // I'm not sure about this and padding,
char padding[7]; // maybe it's just a uint64_t too...
uint64_t *self;
}
Run Code Online (Sandbox Code Playgroud)
最初,metadataN只有两个字段集:destructor_func和type.第一个是指向函数的指针,该函数将用于释放使用swift_allocObject()创建的对象的所有内存.而后者是对象的类型标识符(函数/方法的0x40或'@'),并且(以某种方式)由swift_allocObject()用于为我们的func创建一个正确的对象:
swift_allocObject(&metadata2->type, 0x20, 0x7);
Run Code Online (Sandbox Code Playgroud)
创建func对象后,它具有以下结构:
struct swift_func_object {
uint64_t *original_type_ptr;
uint64_t *unknown0;
uint64_t function_address;
uint64_t *self;
}
Run Code Online (Sandbox Code Playgroud)
第一个字段是指向相应元数据[N] - >类型值的指针,第二个字段似乎是0x4 | 1 << 24(0x100000004),这表明可能是什么(不知道是什么).function_address是我们实际感兴趣的钩子,而self(突然)是指向self的指针(如果我们的对象代表一个普通函数,则该字段为NULL).
| 归档时间: |
|
| 查看次数: |
8054 次 |
| 最近记录: |