swift-類結(jié)構(gòu)源碼探尋(二)

緊跟 swift-類結(jié)構(gòu)源碼探尋(一)炊邦,繼續(xù) TargetClassDescriptor分析

image.png

image.png

TargetClassDescriptor 中包含了超長(zhǎng)的基類描述验残,超多的using

我們分析主干思路,重在檢索數(shù)據(jù)結(jié)構(gòu)蛇损,暫時(shí)無關(guān)的信息暫時(shí)忽略掉

先從 TargetClassDescriptor 屬性信息 整理

TargetClassDescriptor {
    var SuperclassType: TargetRelativeDirectPointer // Int32
    var MetadataNegativeSizeInWords: uint32_t
    var MetadataPositiveSizeInWords: uint32_t
    var NumImmediateMembers: uint32_t
    var NumFields: uint32_t
    var FieldOffsetVectorOffset: uint32_t
}
TargetTypeContextDescriptor {
    var Name: TargetRelativeDirectPointer // Int32
    var AccessFunctionPtr: TargetRelativeDirectPointer // Int32
    var Fields: TargetRelativeDirectPointer // Int32
}
TargetContextDescriptor {
    var Flags: ContextDescriptorFlags  // uint32
    var Parent: TargetRelativeContextPointer // Int32
}

匯總

TargetClassDescriptor {
    var Flags: ContextDescriptorFlags  // uint32
    var Parent: TargetRelativeContextPointer // Int32
    var Name: TargetRelativeDirectPointer // Int32
    var AccessFunctionPtr: TargetRelativeDirectPointer // Int32
    var Fields: TargetRelativeDirectPointer // Int32
    var SuperclassType: TargetRelativeDirectPointer // Int32
    var MetadataNegativeSizeInWords: uint32_t
    var MetadataPositiveSizeInWords: uint32_t
    var NumImmediateMembers: uint32_t
    var NumFields: uint32_t
    var FieldOffsetVectorOffset: uint32_t
}

注意FieldOffsetVectorOffset 注釋信息

image.png

結(jié)合 探尋(一) 關(guān)于 Description: TargetClassDescriptor 越界描述

大概意思是 偏移出 metadata結(jié)構(gòu) 之外琢融,還存在的一些信息

接下來就是 進(jìn)一步分析偏移出 metadata結(jié)構(gòu) 之外的信息了, 既然提到了vector疗琉,不妨看下 探尋(一) 中生成的sil文件

既然暫時(shí)線性邏輯分析 遇到阻礙业栅,進(jìn)一步猜想秒咐,根據(jù)前面的 FieldOffsetVectorOffset 注釋說明,需要找到 Descriptor 結(jié)構(gòu)之后的偏移數(shù)據(jù)

跳轉(zhuǎn)到 sil

image.png

繼續(xù)在 Metadata.h 中搜索vtable 關(guān)鍵字

image.png

發(fā)現(xiàn)了 vtable判斷邏輯碘裕,有vtable的條件下携取,獲取trailingObjects, 說白了 就是尾部的偏移邏輯了

TargetClassDescriptor 繼承父類

image.png

其中包含一個(gè) TargetVTableDescriptorHeader,繼續(xù)分析

image.png

這樣帮孔,跟前面的分析中斷處有了 銜接雷滋,VtableOffset 與 VtableSize 分別是

TargetClassDescriptor 結(jié)構(gòu)之后的 偏移結(jié)構(gòu)的 offset 與 偏移結(jié)構(gòu)大小

繼續(xù)補(bǔ)充結(jié)構(gòu)

TargetClassDescriptor {
    var Flags: ContextDescriptorFlags  // uint32
    var Parent: TargetRelativeContextPointer // Int32
    var Name: TargetRelativeDirectPointer // Int32
    var AccessFunctionPtr: TargetRelativeDirectPointer // Int32
    var Fields: TargetRelativeDirectPointer // Int32
    var SuperclassType: TargetRelativeDirectPointer // Int32
    var MetadataNegativeSizeInWords: uint32_t
    var MetadataPositiveSizeInWords: uint32_t
    var NumImmediateMembers: uint32_t
    var NumFields: uint32_t
    var FieldOffsetVectorOffset: uint32_t
    var VTableOffset: uint32_t
    var VTableSize: uint32_t
    // ......... VTable部分
}

Metadata 結(jié)構(gòu)基本梳理完

swift oc 兼容緣由

image.png

注釋很明確,所有堆開辟類型的元數(shù)據(jù) 通用結(jié)構(gòu) -- TargetHeapMetadata

全局搜索 HeapMetadata, 其中慢慢篩選過濾你弦, HeapObject.h 中有包含 HeapMetadata 屬性

image.png
image.png
image.png
struct HeapObject {
    var metadata: HeapMetadata // UnsafeRawPointer 8字節(jié)
    var refCount1 // UInt32
    var refCount2 // UInt32
}

驗(yàn)證HeapObject結(jié)構(gòu)

image.png

image.png

image.png

閱讀vtable部分源碼

全局搜索 VTableOffset

好在 結(jié)果不多惊豺,方便篩選

篩選掉明顯不需要花精力閱讀的文件及sil文件燎孟,鎖定兩個(gè)文件 GenMeta.cpp 與 MedataLayout.cpp 兩個(gè)文件

先通過 MedataLayout.cpp 中查看

找到 addVTableEntries

在GenMeta.cpp 中搜索結(jié)果定位的位置 發(fā)現(xiàn)關(guān)鍵字 VTableEntries

image.png

在 GenMeta.cpp 中搜索 addVTableEntries, 找到了調(diào)用

image.png

目光之余 發(fā)現(xiàn)了 addVTable()

通過繼承關(guān)系禽作,找到父類 layout()

image.png

通過跋涉,終于看到了直給的東西

正好對(duì)應(yīng) 前面整理的結(jié)構(gòu)

image.png

addVTable 邏輯

image.png

正好對(duì)應(yīng) TargetClassDescriptor結(jié)構(gòu)最后部分

var VTableOffset: uint32_t
var VTableSize: uint32_t
// ......... VTable部分

復(fù)習(xí)MachO驗(yàn)證

回想swift-類結(jié)構(gòu)源碼探尋(一)中的驗(yàn)證部分邏輯

image.png

這里存放的就是 clsss/struct/enumor descriptor的內(nèi)存地址信息

0x7ABC + 0xFFFFFB80 = 0x10000763C

0x10000763C - 虛擬基址0x100000000 = 0x763C

image.png

通過這里 結(jié)合 Descriptor 結(jié)構(gòu)信息 進(jìn)行地址偏移揩页,偏移13個(gè)4字節(jié)

image.png

0x7670 就是VTable部分

image.png

其中 0x7670 基址開始的第一個(gè)4字節(jié)為 method描述 Flags

0x7670 + 0x4 + offset(0xFFFFC4D0) - 虛擬基址0x100000000 + ALSR = 方法內(nèi)存地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旷偿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萍程,老刑警劉巖幢妄,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茫负,居然都是意外死亡蕉鸳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門忍法,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潮尝,“玉大人,你說我怎么就攤上這事饿序∶闶В” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵原探,是天一觀的道長(zhǎng)乱凿。 經(jīng)常有香客問我,道長(zhǎng)咽弦,這世上最難降的妖魔是什么徒蟆? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮离唬,結(jié)果婚禮上后专,老公的妹妹穿的比我還像新娘。我一直安慰自己输莺,他們只是感情好戚哎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫂用,像睡著了一般型凳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘱函,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天甘畅,我揣著相機(jī)與錄音,去河邊找鬼往弓。 笑死疏唾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的函似。 我是一名探鬼主播槐脏,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撇寞!你這毒婦竟也來了顿天?” 一聲冷哼從身側(cè)響起堂氯,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牌废,沒想到半個(gè)月后咽白,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸟缕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年晶框,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懂从。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡三妈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莫绣,到底是詐尸還是另有隱情畴蒲,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布对室,位于F島的核電站模燥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掩宜。R本人自食惡果不足惜蔫骂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牺汤。 院中可真熱鬧辽旋,春花似錦、人聲如沸檐迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)追迟。三九已至溶其,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敦间,已是汗流浹背瓶逃。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廓块,地道東北人厢绝。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像带猴,于是被迫代替她去往敵國(guó)和親昔汉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容