1. 程式人生 > >ios逆向- 02Mach-O檔案簡介.o.a動態庫

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檔案。