小谷禿頭合集c++
小谷最近生病了幾天,藉此機會也研究了下符號~bootstrap
今天來小敘一下符號。(這個東西你們應該都不會陌生~)緩存
小谷說下本身的理解吧~安全
符號
的概念比較廣,咱們開發中,編寫的函數、變量
等等均可以成爲符號
。這個時候不得不提一下符號表
markdown
咱們經過爛蘋果(MachOView)
能夠知道:MachO
中有個總表·Symbol Table·(符號表)
,符號都被保存在這裏.閉包
還有個他的子集,叫·Indirect Symbol Table·(間接符號表)
,保存的是間接符號
(咱們一般使用的NSLog
就屬於間接符號
,有時候咱們也稱他爲外部符號
).函數
還有String table
,保存的是符號的名稱
.工具
這幾張表的聯繫,我一會會說~post
說到綁定,不得不提一嘴
dyld
ui
dyld
的加載流程(應用程序的啓動~)不知道你們有沒有看過
dyld的加載流程
(我直接就闡述下吧。兄弟們有時間能夠去看看,驗證下)
首先, dyld(dynamic linker,動態連接器)
最開始的地方,_dyld_start
而後經過 dyldbootstrap::start
進入dyld
的main
函數
主要流程開始了~
配置所需環境、重定向dyld
(因爲應用程序運行時都在內存中(磁盤中的鏡像(因此咱們一般都會說image
)),因爲蘋果的安全協議,出現了一個ASLR
,因此須要重定向
)
加載共享緩存
(這個其實不用多說了。咱們用到了系統的庫,有可能以前已經加載過了~)
實例化主程序
(以前會判斷是dyld
或者dyld3
.都是同樣的。dyld3
是蘋果爲了提升效率新增的,採用的是回調函數模式(一般也成爲閉包模式
))
加載動態庫
(以前一篇博客,動態庫的注入,你們也已經瞭解了,其實首先加載的是注入的動態庫。)
連接主程序,綁定符號
(這個是很關鍵的~,這個操做的主要是非懶加載中的符號
,一會說到的,dyld_stub_binder
就是這一步操做綁定的,在load
方法以前)
而後就是初始化方法:initializeMainExecutable
(剩下的就是調用,連接objc_init之類的了,而後調用load,而後c++,而後main了,這就很少說了~)
NSLog
舉例吧(直接寫代碼)// 咱們都知道NSLog是外部符號,在間接符號表裏面~
NSLog(@" 第一次調用外部符號~ ");
NSLog(@" 第二次調用外部符號~ ");
複製代碼
因爲
dyld_stub_binder
是在很早以前就加載好了(上面提到的~).外部符號的綁定看來是經過dyld_stub_binder
,下次再調用時候就不須要在次綁定了
MachOView
中觀察到:在綁定以前NSLog
中已經有值了,這個稱爲NSLog的樁
兄弟們應該都用過
fishhook
技術
fishhook
有一句:log.name = "NSLog";
那麼經過字符串,如何找到的這個函數呢?
咱們先看看fishhook
的官方解釋
是否是有點小懵逼。小谷陪兄弟們看一下~
MachOView
。以NSLog
舉例~(他用的close
,其實流程差很少~)這樣是否是清楚不少了~
關於
脫符號和恢復符號
,我就簡單說一下。
恢復符號
的原理主要是經過OC方法的動態性
。
符號
去掉了,可是保存在methodlist
裏面的方法,用到類
都會存在的(若是沒有就麼有辦法調用了~)有個工具叫作,
restore-symbol
就是經過方法名和類名稱
,而後生成符號表插入到MachO
的。
逆向安防
的話,大多數都是用的工具-比較方便,可是我感受仍是要稍微懂一點原理比較好點~