亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

簡單分析Swift語言的一些基本特征

2020-03-09 17:50:14
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift語言的一些基本特征,本文從各語言最基礎的類與對象等方面來講,需要的朋友可以參考下
 

Swift是蘋果公司最新推出的編程語言,據很多人說,是用來”代替“Objective-C。但是沒有確切的證據。我花了一些時間對Swift二進制和運行環境實施逆向工程技術,然后我對Swift有些少許的發現。目前為止,結論就是:Swift是沒有消息機制的Objective-C。

對象

信不信由你,Swift中的對象就是Objective-C的對象。在Mach-O二進制文件中,__objc_classlist包含每個二進制文件中類的數據。其結構如下所示:
 

復制代碼代碼如下:

struct objc_class {
    uint64_t isa;
    uint64_t superclass;
    uint64_t cache;
    uint64_t vtable;
    uint64_t data;
};

 

(注:所有結構都來自64位版本)

注意data記錄,它指向了類中的一個列出方法、實例變量和協議等內容的結構體。通常,data是8個字節對齊的,但是對于Swift類,data的最后一位僅為1個字節。


Swift類的真正結構是有一點奇怪的。Swift類沒有Objective-C方法。我們將在以后實現它。Swift類的變量存儲為實例變量。Swift的getter和setter方法真正修改的是實例變量的值。奇怪的是swift類的實例變量沒有類型編碼。通常應該指向類型編碼的指針為NULL。這大概是由于事實上Objective-C運行時是不支持處理Swift變量本身。

繼承

Swift的繼承是你所期待的。在Swift中,Square是shape的子類也是Objective-C類Shape的子類。然而,在Swift類中沒有超類?

例如

 

復制代碼代碼如下:
class Shape { }

 

在這個例子中,Shape類是SwiftObject的子類。SwiftObject是一個根Objective-C類,類似于NSObject。它沒有超類,意味著isa指向自身。它的目的是使用Swift運行時方法比如allocation和deallocation代替標準的Objective-C運行時方法。例如,(void)retain不會調用objc_retain,但是它會調用swift_retain。

類方法

就像我之前提到的,Swift對象的類沒有方法,以此代替的是類似C++的函數,名稱改編和所有東西。這可能是為什么Swift聲稱比Objective-C更快的原因。不再需要為 objc_msgSend  尋找和調用方法實現。

在Objective-C里面,方法像這樣實現:

 

復制代碼代碼如下:
type method(id self, SEL _cmd, id arg1, id arg2, ...)

 

Swift 方法非常類似,但是輕微使用了不同的參數排布, self 作為最后一個參數傳遞,并且沒有選擇器。

 

復制代碼代碼如下:
type method(id arg1, id arg2, ..., id self)

 


虛表

類似C++一樣,Swift類也具有一個虛表,用于列出類中的方法。它直接被放置在二進制文件中的類數據之后,并且看起來是這樣的:
 

復制代碼代碼如下:

struct swift_vtable_header {
    uint32_t vtable_size;
    uint32_t unknown_000;
    uint32_t unknown_001;
    uint32_t unknown_002;
    void* nominalTypeDescriptor;
    // vtable pointers
}

 

據我所知,Swift類中的虛表僅在編譯期間可見時被使用。否則,它將看起來就是一堆亂糟糟的符號。

命名重整

Swift保持函數的元數據在各自的符號,這就叫做命名重整。元數據寶庫奧函數的名稱(顯而易見的),屬性,模塊名稱,參數類型,返回值類型,還有更多的數據,例如這個例子
 

復制代碼代碼如下:

class Shape{
    func numberOfSides() -> Int {
        return 5
    }
}

 

simpleDescription方法的重整命名是:

_TFC9swifttest5Shape17simpleDescriptionfS0_FT_Si。下面是詳細說明:

_T - 所有Swift符號的前綴,每一個符號都是從_T開始。

F - 函數

C - 類的函數(方法)

9swifttest - 帶有長度前綴的模塊名

5Shape - 函數所屬的類,帶有長度前綴

17simpleDescription - 函數名

f - 函數屬性。 在這個例子中它是f,這是一個普通函數。

S0_FT- 我不是特別確定這是什么意思,但是它是參數和返回類型開始的標記

‘_' - 這個下劃線分割了參數和返回值的類型。因為函數沒有帶參數,它直接跟在了S0_FT的后面

S - 返回值的開始。'S'代表Swift;返回類型是Swift的內建類型,下一個字符決定了類型

i - 這是Swift的內建類型。一個小寫的"I"代表了Int.


函數屬性

字符類型

f        普通函數

s        setter

g        getter

d        析構函數

D        釋放器

c        構造函數

C        分配器

Swift內部函數

字符類型

a        數組

b        布爾型

c        字符常量

d        雙精度浮點數

f        單精度浮點型

i        整型

u        UInt類型

Q        隱式可選

S        字符串型

除了函數之外,還有很多命名轉換機制,此處我僅給出一個簡短的概述。

掛鉤函數

受夠了語義這部分,讓我們接觸點有趣的東西!比方說我們有一個像這樣的類:
 

復制代碼代碼如下:

class Shape {
    var numberOfSides: Int;
 
    init(){
        numberOfSides = 5;
    }
}

 

比如我們想將numberOfSides的值改為4,很多種方法可以做到。我們可以使用MobileSubstrate掛到getter方法中,然后更改返回值,就像這樣:

 

復制代碼代碼如下:

int (*numberOfSides)(id self);
 
MSHook(int, numberOfSides, id self){
    return 4;
}
 
%ctor{
    numberOfSides = (int (*)(id self)) dlsym(RTLD_DEFAULT, "_TFC9swifttest5Shapeg13numberOfSidesSi");
    MSHookFunction(numberOfSides, MSHake(numberOfSides));
}

 

如果我們創建了一個形狀的實例,并且打印出numberOfSides的值,我們得到了4!看起來不錯,對不?現在,我知道你可能在想,難道我們不應該是返回一個對象而非常量4嗎?


好吧,在Swift里,許多內建類型是書面量來的。一個Int型, 舉個例子,和C語言里面的int型一樣(盡管它可以是一個長整形——不要讓我碰到這種情況)。一個小小的提示,String 類型有點古老,這是一個低位優先的UTF-16字符串,所以沒有C的字面量能用。

讓我們來做同樣的事情,但這一次,我們不是在獲取器上,而是在獲取器上設鉤。

 

復制代碼代碼如下:

void (*setNumberOfSides)(int newNumber, id self);
 
MSHook(void, setNumberOfSides, int newNumber, id self){
    _setNumberOfSides(4, self);
}
 
%ctor {
    setNumberOfSides = (void (*)(int newNumber, id self)) dlsym(RTLD_DEFAULT, "_TFC9swifttest5Shapes13numberOfSidesSi");
    MSHookFunction(setNumberOfSides, MSHake(setNumberOfSides));
}

 

再嘗試一下,然后。。。。。。還是5。怎么回事,你問?好吧,在Swift里某些地方,函數是內聯化的。類構造器就是其中一個的地方。它直接設置numberOfSides 為ivar, 設置器將僅在數值再次被頂層代碼設置的時候被調用。在那被調用,你知道么,我們得到了4。

最終,讓我們通過直接設置實例變量的值來修改numberOfSides。

 

復制代碼代碼如下:

void (*setNumberOfSides)(int newNumber, id self);
 
MSHook(void, setNumberOfSides, int newNumber, id self){
    MSHookIvar<int>(self, "numberOfSides") = 4;
}
 
%ctor {
    setNumberOfSides = (void (*)(int newNumber, id self)) dlsym(RTLD_DEFAULT, "_TFC9swifttest5Shapes13numberOfSidesSi");
    MSHookFunction(setNumberOfSides, MSHake(setNumberOfSides));
}

 

這個函數是可以實現功能的,雖然不建議這樣做,但是確實有效果。

這是目前我所要寫的內容。當然,還有很多其他的內容我正在看,包括witness表,由于我了解不多,所以這里我也沒辦法寫出總結。很多內容在這篇文章里有變更,他們僅是我目前對運行和查看用Swift語言編譯的二進制文件逆向工程操作所得到的東西。

我所發現的東西應該是非常不錯的,這意味著MobileSubstrate不會隨著Objective-C一同消亡,并且,微調仍然可以進行!我很想知道將來在越獄場景下的應用商店中將會是怎樣一番情景……難道logo可以更新用來自動銷毀命名?甚至是處理常見的 Swift 類型的庫……

如果你發現更多的關于Swift如何工作的東西,不要猶豫,請讓我知道!



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产999精品久久久影片官网| 国产精品视频在线播放| 91免费在线视频网站| 91亚洲精品久久久| 国产精品99久久久久久久久| 91av在线免费观看视频| 国产香蕉精品视频一区二区三区| 九九热最新视频//这里只有精品| 久久久免费观看视频| 国产精品一区二区久久久久| 色妞欧美日韩在线| 亚洲女人天堂成人av在线| 国产婷婷色综合av蜜臀av| 国产精品一二三视频| 亚洲国产精品视频在线观看| 国产在线日韩在线| 国产va免费精品高清在线观看| 国产在线a不卡| 欧美日韩不卡合集视频| 亚洲精品一区二区在线| 国产日本欧美在线观看| 免费不卡欧美自拍视频| 国产精品www色诱视频| 91精品久久久久久| 中文字幕无线精品亚洲乱码一区| 美乳少妇欧美精品| 亚洲国产成人爱av在线播放| 日韩美女av在线| 亚洲第一视频在线观看| 亚洲精品福利资源站| 欧美精品免费播放| 成人av资源在线播放| 97精品一区二区三区| 国产日韩欧美另类| 日韩欧美成人区| 国产精品夜色7777狼人| 欧美另类69精品久久久久9999| 欧美三级免费观看| 国产成人免费91av在线| 秋霞av国产精品一区| 欧美www视频在线观看| 91亚洲国产精品| 成人网址在线观看| 中文字幕亚洲图片| 97超级碰碰碰久久久| 亚洲片av在线| 日韩人体视频一二区| 日本精品视频在线播放| 久久精品国产欧美亚洲人人爽| 日韩高清电影免费观看完整| 国产精品成熟老女人| 国语自产精品视频在免费| www.日本久久久久com.| 午夜欧美大片免费观看| 亚洲性线免费观看视频成熟| 欧美大学生性色视频| 久久天天躁日日躁| 亚洲欧洲中文天堂| 成人激情电影一区二区| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲精品资源美女情侣酒店| 欧美日韩成人黄色| 亚洲成人激情在线| 亚洲色图国产精品| 久久视频在线观看免费| 国模gogo一区二区大胆私拍| 欧美专区在线观看| 欧美一区二区三区四区在线| 欧美一级电影久久| 精品国产区一区二区三区在线观看| 日本欧美爱爱爱| 91黄色8090| 久久久亚洲福利精品午夜| 久久不射热爱视频精品| 国产精品久久久亚洲| 色婷婷综合久久久久中文字幕1| 中文字幕国产亚洲| 亚洲性猛交xxxxwww| 精品久久久久久久久中文字幕| 精品国产成人av| 在线观看久久av| 8x海外华人永久免费日韩内陆视频| 美女av一区二区三区| 国产三级精品网站| 亚洲理论电影网| 日韩精品视频三区| 亚洲综合第一页| 欧美激情欧美激情在线五月| 国产欧美一区二区三区视频| 日本电影亚洲天堂| 日韩免费av一区二区| 国产999在线| 中国日韩欧美久久久久久久久| 国产精品jizz在线观看麻豆| 久久久国产91| 久久香蕉国产线看观看网| 成人免费视频在线观看超级碰| 国产suv精品一区二区三区88区| 成人激情视频在线| 日韩av影视综合网| 国产一区二区三区视频免费| 欧美成人在线免费| 动漫精品一区二区| 国产成人精品在线| 日韩免费高清在线观看| 国产日韩欧美黄色| 中文字幕免费精品一区高清| 欧美激情精品久久久久久变态| 欧美在线激情视频| 57pao国产成人免费| 亚洲影视九九影院在线观看| 色婷婷综合成人| 欧美猛男性生活免费| 亚洲精品日韩激情在线电影| 亚洲xxxxx性| 国产精品黄页免费高清在线观看| 日本老师69xxx| 欧美最猛性xxxxx免费| 中文精品99久久国产香蕉| 日韩禁在线播放| 国产精品久久久| 懂色av中文一区二区三区天美| 国产欧美精品一区二区| 国内精品视频在线| 亚洲精品久久久久久下一站| 国产精品一区久久| 国产精品永久免费在线| 亚洲精品一区二区久| 日韩久久精品电影| 久久久久久久久久av| 久久伊人精品一区二区三区| 国产97色在线| 欧美精品在线免费| 欧美国产精品人人做人人爱| 亚洲精品动漫100p| 国产精品第3页| 亚洲激情自拍图| 亚洲人成毛片在线播放| 97国产精品视频人人做人人爱| 91中文字幕在线| 欧美亚洲另类制服自拍| 欧美激情va永久在线播放| 成人久久久久爱| 久久精品99无色码中文字幕| 日韩av一区二区在线| 日韩欧美中文免费| 激情亚洲一区二区三区四区| 大桥未久av一区二区三区| 欧美大片免费观看| 亚洲欧美国产日韩中文字幕| 亚洲国产精品久久久久久| 欧美性色视频在线| 欧美极品在线视频| 亚洲人成人99网站| 69影院欧美专区视频| 日韩美女免费观看| 97香蕉久久夜色精品国产| 亚洲 日韩 国产第一| 欧洲亚洲妇女av| 日韩hd视频在线观看| 最近2019中文字幕一页二页| 久久精品成人欧美大片古装| 欧美乱人伦中文字幕在线| 人九九综合九九宗合|