iOS逆向安防從入門到禿頭--MachO中的符號

小谷禿頭合集c++

  • 小谷最近生病了幾天,藉此機會也研究了下符號~bootstrap

  • 今天來小敘一下符號。(這個東西你們應該都不會陌生~)緩存

1. 符號的定義

1.1. 什麼是符號

  • 小谷說下本身的理解吧~安全

    • 其實符號的概念比較廣,咱們開發中,編寫的函數、變量等等均可以成爲符號
  • 這個時候不得不提一下符號表markdown

    • 咱們經過爛蘋果(MachOView)能夠知道:MachO中有個總表·Symbol Table·(符號表),符號都被保存在這裏.閉包

    • 還有個他的子集,叫·Indirect Symbol Table·(間接符號表),保存的是間接符號(咱們一般使用的NSLog就屬於間接符號,有時候咱們也稱他爲外部符號).函數

    • 還有String table ,保存的是符號的名稱.工具

1.png

這幾張表的聯繫,我一會會說~post

2. 符號綁定

說到綁定,不得不提一嘴dyldui

2.1. dyld的加載流程(應用程序的啓動~)

不知道你們有沒有看過dyld的加載流程(我直接就闡述下吧。兄弟們有時間能夠去看看,驗證下

  • 首先, dyld(dynamic linker,動態連接器)最開始的地方,_dyld_start

  • 而後經過 dyldbootstrap::start進入dyldmain函數

  • 主要流程開始了~

  1. 配置所需環境、重定向dyld(因爲應用程序運行時都在內存中(磁盤中的鏡像(因此咱們一般都會說image)),因爲蘋果的安全協議,出現了一個ASLR,因此須要重定向
  1. 加載共享緩存(這個其實不用多說了。咱們用到了系統的庫,有可能以前已經加載過了~)
  1. 實例化主程序(以前會判斷是dyld或者dyld3.都是同樣的。dyld3是蘋果爲了提升效率新增的,採用的是回調函數模式(一般也成爲閉包模式))
  1. 加載動態庫(以前一篇博客,動態庫的注入,你們也已經瞭解了,其實首先加載的是注入的動態庫。)
  1. 連接主程序,綁定符號(這個是很關鍵的~,這個操做的主要是非懶加載中的符號,一會說到的,dyld_stub_binder就是這一步操做綁定的,在load方法以前)
  1. 而後就是初始化方法:initializeMainExecutable(剩下的就是調用,連接objc_init之類的了,而後調用load,而後c++,而後main了,這就很少說了~)
  • 原本想給你們展現代碼的,感受其實不重要,這流程就夠用了~

2.2. 符號綁定

    1. 咱們用NSLog舉例吧(直接寫代碼)
// 咱們都知道NSLog是外部符號,在間接符號表裏面~
    
    NSLog(@" 第一次調用外部符號~ ");
    
    NSLog(@" 第二次調用外部符號~ ");
複製代碼
    1. 我直接畫了個簡易的流程圖(要是一步步寫,文章就太長了,圖片解決一切~)

2.png

因爲dyld_stub_binder是在很早以前就加載好了(上面提到的~).外部符號的綁定看來是經過dyld_stub_binder,下次再調用時候就不須要在次綁定了

    1. 咱們從MachOView中觀察到:在綁定以前NSLog中已經有值了,這個稱爲NSLog的樁

3.png

3. 經過字符串查找符號

兄弟們應該都用過fishhook技術

4.png

fishhook有一句:log.name = "NSLog";

  • 那麼經過字符串,如何找到的這個函數呢?

  • 咱們先看看fishhook的官方解釋

5.png

是否是有點小懵逼。小谷陪兄弟們看一下~

  • 我經過MachOView。以NSLog舉例~(他用的close,其實流程差很少~)

6.png

這樣是否是清楚不少了~

4. 脫符號

關於脫符號和恢復符號,我就簡單說一下。

7.png

5. 恢復符號

恢復符號的原理主要是經過OC方法的動態性

  • 雖然符號去掉了,可是保存在methodlist裏面的方法,用到都會存在的(若是沒有就麼有辦法調用了~)

8.png

有個工具叫作,restore-symbol就是經過方法名和類名稱,而後生成符號表插入到MachO的。

6. 總結

    1. 其實作逆向安防的話,大多數都是用的工具-比較方便,可是我感受仍是要稍微懂一點原理比較好點~
    1. 這篇博客可能不是特別的細,就當給兄弟們開個口子。
    1. 最後但願和兄弟們共同進步~😆
相關文章
相關標籤/搜索