iOS逆向學習筆記9(DYLD:MachO加載流程)

1.什么是DYLD

??DYLD是動態(tài)鏈接器,是用來加載所有的庫以及可執(zhí)行文件的。

??DYLD源碼 密碼:0n16

2.DYLD加載一個應用程序流程

2.1創(chuàng)建工程

??創(chuàng)建一個名為DYLDDemo的工程,iOS版本號設定為iOS13.0,在main函數(shù)打上斷點,鏈接真機,調(diào)試運行,運行到斷點的時候,使用bt查看當前函數(shù)調(diào)用棧,如下圖所示:



??上面的結果并不是我們想要的,因為上面的函數(shù)調(diào)用棧沒有顯示完全,因此我們在ViewController中的load方法中打斷點,再次查看其函數(shù)調(diào)用棧,如下所示:

 bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
    frame #0: 0x0000000104079f0c DYLDDemo`+[ViewController load](self=ViewController, _cmd="load") at ViewController.m:18:1
    frame #1: 0x00000001977bd21c libobjc.A.dylib`load_images + 928
    frame #2: 0x000000010419e320 dyld`dyld::notifySingle(dyld_image_states, ImageLoader const*, ImageLoader::InitializerTimingList*) + 496
    frame #3: 0x00000001041b0c4c dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 592
    frame #4: 0x00000001041aebb8 dyld`ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 192
    frame #5: 0x00000001041aec84 dyld`ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 96
    frame #6: 0x000000010419e7f4 dyld`dyld::initializeMainExecutable() + 220
    frame #7: 0x00000001041a3d88 dyld`dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 5500
    frame #8: 0x000000010419d258 dyld`dyldbootstrap::start(dyld3::MachOLoaded const*, int, char const**, dyld3::MachOLoaded const*, unsigned long*) + 476
  * frame #9: 0x000000010419d038 dyld`_dyld_start + 56

??還可以使用(frame select 函數(shù)調(diào)用棧編號)來切換顯示函數(shù)調(diào)用棧,如下圖所示:


切換frame

2.2 DYLD源碼分析

??我們根據(jù)工程中函數(shù)調(diào)用棧的調(diào)用結果可以知道,load方法是在工程main函數(shù)調(diào)用之前調(diào)用的,而命名空間下的dyldbootstrap_dyld_start函數(shù)是最開始調(diào)用的方法,因此我們進入DYLD源碼中去查看這個方法調(diào)用過程。

2.2.1 使用XCode打開下載的DYLD源碼工程,搜索命名空間dyldbootstrap

搜索dyldbootstrap

image.png

搜索start方法

就從這個方法分析DYLD的加載流程
loadImage并不是dyld中的方法而是libobjc中的方法



image.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容