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文件。