ios逆向- 02Mach-O檔案簡介.o.a動態庫
阿新 • • 發佈:2019-02-07
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.根據以上程式碼可以得出以下效果,如圖:
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檔案是關聯的,然後將兩個檔案編譯成一個可執行檔案如圖:
6.可以看出檔案有關聯在編譯成可執行檔案後會自動關聯起來,並且關聯順序不影響程式執行結果。
.a檔案介紹
1..a檔案為.o檔案的集合。
2.找到系統檔案檢視檔案型別如下:
動態庫檔案
.dylib
1.查詢系統動態庫檢視其屬性。
2.執行程式碼如下:
find /usr/lib -name "*.dylib" //查詢動態庫字尾
file /usr/lib/system/libunc.dylib //檢視某一動態庫屬性
3.結果圖:
動態庫共享快取
為了提高效能,系統的動態庫檔案都存在了動態庫共享快取裡面!
動態庫是為了,節省記憶體提高效能。
位置
由於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檔案。