ios逆向- 02Mach-O文件簡介.o.a動態庫

Mach-O文件

官方介紹總共有11種格式! 是 Mach Object的縮寫,是Mac\iOS 上用於存儲程序,庫的標準格式!
常見的格式:

  • 1.可執行文件
  • 2.objcet
    • .o 文件(目標文件)
    • .a 靜態庫文件.其實就是N個.o文件的集合
  • 3.DYLIB: 動態庫文件
    • dylib
    • framework
  • 4.動態連接器
  • 5.DSYM (打包上架用於監測崩潰信息)

.o文件介紹

1.cmd+n創建一個c文件,c文件輸入以下代碼:

  #include "test.h"
  #include <stdio.h>

  int main()
  {
      printf("test\n");
      return 0;
  }

2.打開終端輸入以下指令:

cd   ... //將目錄cd到c文件創建的文件夾
ls   //查看列表 會看到test.c文件
clang -c test.c  //將c轉化成.o目標文件
ls 
file test.o  //結果:test.o: Mach-O 64-bit object x86_64 即.o文件爲Mach-O文件
file weChat  //則是微信的MachO文件 結果爲:
//weChat: Mach-O universal binary with 2 architectures: [arm_v7:Mach-O executable arm_v7] [arm64]
//weChat (for architecture armv7):  Mach-O executable arm_v7
//weChat (for architecture arm64):  Mach-O 64-bit executable arm64
 clang test.o //將目標文件輸出
ls  // 出現 a.out 輸出執行文件
./a.out  //輸出結果 test 跟代碼執行結果一直
clang -o test1 test.o 
ls //  test1 出現test1可執行文件 
open .  //打開當前文件夾 可查看可執行文件
clang -o test2 test.c   //直接將c文件編譯成可執行文件
ls //test2 出現test2可執行文件 跟.o文件編譯結果一致

3.根據以上代碼可以得出以下效果,如圖:
.o文件爲Mach-O文件

4.拓展 接上面環境 創建新的.c文件代碼如下:

testSub.c //新文件名
void test()
{
    printf("testSub\n");
    return;
}

test.c //文件代碼修改 如下
#include "test.h"
#include <stdio.h>

void test();

int main()
{
    printf("test\n");
    test();
    return 0;
}

5.解析從上面代碼來看,兩個.c文件是關聯的,然後將兩個文件編譯成一個可執行文件如圖:
.o文件集合
6.可以看出文件有關聯在編譯成可執行文件後會自動關聯起來,並且關聯順序不影響程序執行結果。

.a文件介紹

1..a文件爲.o文件的集合。
2.找到系統文件查看文件類型如下:
.a文件

動態庫文件

.dylib

1.查找系統動態庫查看其屬性。
2.執行代碼如下:

find /usr/lib -name "*.dylib" //查找動態庫後綴
file /usr/lib/system/libunc.dylib //查看某一動態庫屬性

3.結果圖:
.dylib文件屬性

動態庫共享緩存

爲了提高性能,系統的動態庫文件都存在了動態庫共享緩存裏面!
動態庫是爲了,節省內存提高性能。

位置

由於ios由於沒有越獄是看不到動態共享緩存庫的,但是mac是可以看到的:

 cd /var/db/dyld
ls //得到結果如下
//dyld_shared_cache_i386        dyld_shared_cache_x86_64h     
//shared_region_roots
//dyld_shared_cache_i386.map    dyld_shared_cache_x86_64h.map

動態庫緩存在dyld_shared_cache_x86_64h 中。
**手機如果越獄找到了這個文件就能看見UIKit的框架在其中,然後用ida分析和Class-dump去導出就可以分析很多系統框架的源碼了。
所以,越獄手機可以對系統做一些逆向。**

動態緩存庫運行原理

如下圖:
動態緩存庫運行原理

動態加載器(動態鏈接器)(dyld)

  • dynamic linker
  • dynamic loader
    用於調用動態緩存庫ios同理
  • 動態加載器位置 打開終端輸入命令行:
cd /usr/lib
ls
open .

打開文件夾後看到dyld的可執行文件,查看屬性:

file dyld

獲得如下結果
動態鏈接器

可以看出動態鏈接器其實本質也是Mach-O文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章