iOS逆向課程筆記(十一)

Hook原理介紹

1.Objective-C消息傳遞(Messaging)

對(duì)于C/C++這類(lèi)靜態(tài)語(yǔ)言贴铜,調(diào)用一個(gè)方法其實(shí)就是跳到內(nèi)存中的某一點(diǎn)并開(kāi)始執(zhí)行一段代碼抑进。沒(méi)有任何動(dòng)態(tài)的特性占贫,因?yàn)檫@在編譯時(shí)就決定好了琅锻。

而在 Objective-C 中帮掉,[object foo] 語(yǔ)法并不會(huì)立即執(zhí)行 foo 這個(gè)方法的代碼咙俩。它是在運(yùn)行時(shí)給 object 發(fā)送一條叫 foo 的消息耿戚。這個(gè)消息湿故,也許會(huì)由 object 來(lái)處理,也許會(huì)被轉(zhuǎn)發(fā)給另一個(gè)對(duì)象膜蛔,或者不予理睬假裝沒(méi)收到這個(gè)消息坛猪。多條不同的消息也可以對(duì)應(yīng)同一個(gè)方法實(shí)現(xiàn)。這些都是在程序運(yùn)行的時(shí)候動(dòng)態(tài)決定的皂股。

事實(shí)上墅茉,在編譯時(shí)你寫(xiě)的 Objective-C 函數(shù)調(diào)用的語(yǔ)法都會(huì)被翻譯成一個(gè) C 的函數(shù)調(diào)用 objc_msgSend() 。比如呜呐,下面兩行代碼就是等價(jià)的:

[people TailName:@"Test" Age:18];

objc_msgSend(people, @selector(TailName:Age:), "Test", 18);

在 Objective-C 中就斤,類(lèi)、對(duì)象和方法都是一個(gè)C的結(jié)構(gòu)體蘑辑,從 objc/objc.h 和 objc/runtime.h 頭文件中洋机,我們可以找到他們的定義:

  typedef struct objc_class *Class;
  struct objc_object {
      Class isa  OBJC_ISA_AVAILABILITY;
  };
  typedef struct objc_object *id;
  
//Class 是一個(gè) objc_class 結(jié)構(gòu)類(lèi)型的指針, id是一個(gè) objc_object 結(jié)構(gòu)類(lèi)型的指針.

struct objc_class {
  Class isa  OBJC_ISA_AVAILABILITY;

  #if !__OBJC2__
      Class super_class                                        
      const char *name                                         
      long version                                             
      long info                                                
      long instance_size                                       
      struct objc_ivar_list *ivars                             
      struct objc_method_list **methodLists                    
      struct objc_cache *cache                                 
      struct objc_protocol_list *protocols                     
  #endif
} OBJC2_UNAVAILABLE;
  • isa
    是一個(gè) objective-c Class 類(lèi)型的指針. 實(shí)例對(duì)象有個(gè)isa的屬性,指向Class, 而Class里也有個(gè)isa的屬性, 指向meteClass. 這里就有個(gè)點(diǎn), 在Objective-C中任何的類(lèi)定義都是對(duì)象.

  • super_class
    指向該類(lèi)的父類(lèi), 如果該類(lèi)已經(jīng)是最頂層的根類(lèi)(如 NSObject 或 NSProxy),那么 super_class 就為 NULL.

  • name
    類(lèi)的名字

  • version
    類(lèi)的版本信息,默認(rèn)為0

  • info
    供運(yùn)行期使用的一些位標(biāo)識(shí)。

  • instance_size
    該類(lèi)的實(shí)例變量大小

  • ivars
    成員變量的鏈表

struct objc_ivar_list {
    int ivar_count                                          
    /* variable length structure */
    struct objc_ivar ivar_list[1]                           
}       
  • methodLists
    方法定義的鏈表
     struct objc_method_list {  
          struct objc_method_list *obsolete;
          int method_count;
    
          struct objc_method method_list[1];
     };
     
     struct objc_method {  
      SEL method_name;
      char *method_types;   
      IMP method_imp;
    

};


- objc_cache
指向最近使用的方法.用于方法調(diào)用的優(yōu)化  

struct objc_cache {
unsigned int mask /* total = mask + 1 */;
unsigned int occupied;
Method buckets[1];
};


- protocols
    協(xié)議的鏈表

struct objc_protocol_list {
struct objc_protocol_list *next;
long count;
Protocol *list[1];
};


objc_method_list 本質(zhì)是一個(gè)有 objc_method 元素的可變長(zhǎng)度的數(shù)組洋魂。一個(gè) objc_method 結(jié)構(gòu)體中:
- 函數(shù)名绷旗,也就是SEL
- 表示函數(shù)原型的字符串 (見(jiàn) Type Encoding) 
- 函數(shù)的實(shí)現(xiàn)IMP

#### 2. Method Swizzling示例
  以上面可知方法的名字(SEL)跟方法的實(shí)現(xiàn)(IMP,指向 C 函數(shù)的指針)一一對(duì)應(yīng)忧设。Swizzle 一個(gè)方法其實(shí)就是在程序運(yùn)行時(shí)對(duì) objc_method_list 里做點(diǎn)改動(dòng)刁标,讓這個(gè)方法的名字(SEL)對(duì)應(yīng)到另個(gè)IMP颠通。 
  
   Method Swizzling(方法調(diào)配技術(shù))址晕,僅針對(duì)Objective-C方法有效。Method Swizzling 利用 Runtime 特性把一個(gè)方法的實(shí)現(xiàn)與另一個(gè)方法的實(shí)現(xiàn)進(jìn)行替換顿锰。

//涉及到的主要方法
class_addMethod
class_replaceMethod
method_exchangeImplementations

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谨垃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子硼控,更是在濱河造成了極大的恐慌刘陶,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牢撼,死亡現(xiàn)場(chǎng)離奇詭異匙隔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)熏版,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)纷责,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人撼短,你說(shuō)我怎么就攤上這事再膳。” “怎么了曲横?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵喂柒,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)灾杰,這世上最難降的妖魔是什么蚊丐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮艳吠,結(jié)果婚禮上吠撮,老公的妹妹穿的比我還像新娘。我一直安慰自己讲竿,他們只是感情好泥兰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著题禀,像睡著了一般鞋诗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迈嘹,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天削彬,我揣著相機(jī)與錄音,去河邊找鬼秀仲。 笑死融痛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的神僵。 我是一名探鬼主播雁刷,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼保礼!你這毒婦竟也來(lái)了沛励?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炮障,失蹤者是張志新(化名)和其女友劉穎目派,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體胁赢,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡企蹭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了智末。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谅摄。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吹害,靈堂內(nèi)的尸體忽然破棺而出螟凭,到底是詐尸還是另有隱情,我是刑警寧澤它呀,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布螺男,位于F島的核電站棒厘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏下隧。R本人自食惡果不足惜奢人,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淆院。 院中可真熱鬧何乎,春花似錦、人聲如沸土辩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拷淘。三九已至各墨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間启涯,已是汗流浹背贬堵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留结洼,地道東北人黎做。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像松忍,于是被迫代替她去往敵國(guó)和親蒸殿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉挽铁,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,725評(píng)論 0 9
  • 前言 runtime其實(shí)在我們?nèi)粘i_(kāi)發(fā)過(guò)程中很少使用到伟桅,尤其是像我現(xiàn)在比較初級(jí)的程序猿就更用不到了。但是去面試很多...
    WolfTin閱讀 633評(píng)論 0 2
  • AdamLee007閱讀 232評(píng)論 1 5
  • 心里難過(guò)呢叽掘,怎么解。一直勸說(shuō)自己我會(huì)好好的玖雁「猓可是 越長(zhǎng)大越孤單,都說(shuō)人生是用來(lái)成長(zhǎng)的赫冬,可是經(jīng)歷了這么多浓镜,讓人是越來(lái)...
    Azsr閱讀 354評(píng)論 0 0
  • 如此幸福的一天 霧一早就散了,我在花園里干活 蜂鳥(niǎo)停在忍冬花上 這世上沒(méi)有一樣?xùn)|西我想占有 我知道沒(méi)有一個(gè)人值得我...
    東豐林波閱讀 213評(píng)論 0 0