iOS MachO文件

一憎瘸、MachO文件概述

Mach-O(Mach Object)是mac以及iOS上的格式攻人, 類似于windows上的PE格式 (Portable Executable )煮落,linux上的elf格式 (Executable and Linking Format)膳灶。

Mach-O是一種用于可執(zhí)行文件目標代碼赃磨、動態(tài)庫的文件格式筝家。作為a.out格式的替代,Mach-O提供了更強的擴展性邻辉。

1.1 MachO格式的常見文件

  • 目標文件.o
  • 庫文件
  • .a
  • .dylib
  • Framework
  • 可執(zhí)行文件
  • dyld
  • .dsym

1.2 格式驗證

1.2.1 .o溪王、.out、可執(zhí)行文件

新建test.c文件值骇,內(nèi)容如下:

#include <stdio.h>

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

驗證.o文件:

clang -c  test.c
//clang -c  test.c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk

不指定-c默認生成a.out莹菱,如果報找不到'stdio.h' file not found,則可以指定-isysroot雷客。文章最后有具體的解決方案芒珠,
通過file指令查看文件格式:

file test.o
test.o: Mach-O 64-bit object x86_64

驗證a.out可執(zhí)行文件:

clang test.o
file a.out
a.out: Mach-O 64-bit executable x86_64
./a.out
test

驗證可執(zhí)行文件:

clang -o test2 test.c 
file test2
test2: Mach-O 64-bit executable x86_64
./test2
test

至此再生成一個test3可執(zhí)行文件:

clang -o test3 test.o

那么生成的a.outtest2搅裙、test3一樣么皱卓?

image.png

可以看到生成的可執(zhí)行文件md5相同。

??原則上test3md5應該和test2a.out相同部逮。源碼沒有變化娜汁,所以應該相同的。在指定-isysroot后生成的可能不同兄朋,推測和CommandLineTools有關(系統(tǒng)中一個掐禁,Xcode中一個)。

再創(chuàng)建一個test1.c文件颅和,內(nèi)容如下:

#include <stdio.h>

void test1Func() {
    printf("test1 func \n");
}

修改test.c:

#include <stdio.h>

void test1Func();

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

這個時候相當于有多個文件了傅事,編譯生成可執(zhí)行文件demodemo1峡扩、demo2:

clang -o demo  test1.c test.c 
clang -c test1.c test.c 
clang -o demo1 test.o test1.o
clang -o demo2 test1.o test.o

image.png

這里demo1demo2``md5不同是因為test.otest1.o順序不同蹭越。

objdump --macho -d demo查看下macho:

image.png

這也就解釋了md5不同的原因。這里很像XcodeBuild Phases -> Compile Sources中源文件的順序教届。

??源文件順序不同响鹃,編譯出來的二進制文件不同( 大小相同),二進制排列順序不同案训。

1.2.2.a文件

直接創(chuàng)建一個library庫查看:

//find /usr -name "*.a"
file libTestLibrary.a
libTestLibrary.a: current ar archive random library

1.2.3. .dylib

 file /usr/lib/libprequelite.dylib
/usr/lib/libprequelite.dylib: Mach-O 64-bit dynamically linked shared library x86_64

1.2.4 dyld

cd /usr/lib
file dyld
dyld: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamic linker x86_64] [i386:Mach-O dynamic linker i386]
dyld (for architecture x86_64): Mach-O 64-bit dynamic linker x86_64
dyld (for architecture i386):   Mach-O dynamic linker i386

這里需要注意的是dyld不是可執(zhí)行文件买置,是一個dynamic linker。系統(tǒng)內(nèi)核觸發(fā)强霎。

1.2.5 .dsym

file TestDsym.app.dSYM
TestDsym.app.dSYM: directory

cd TestDsym.app.dSYM/Contents/Resources/DWARF

file TestDsym
TestDsym: Mach-O 64-bit dSYM companion file arm64

二忿项、可執(zhí)行文件

image.png

創(chuàng)建一個工程,默認生成的文件就是可執(zhí)行文件城舞,查看對應的MachO:

file TestDsym
TestDsym: Mach-O 64-bit executable arm64

可以看到是一個單一架構的可執(zhí)行文件(??11以上的系統(tǒng)都只支持64位架構轩触,所以默認就沒有32位的)。將Deployment Info改為iOS 10編譯再次查看MachO

file TestDsym
TestDsym: Mach-O universal binary with 2 architectures: [arm_v7:Mach-O executable arm_v7] [arm64:Mach-O 64-bit executable arm64]
TestDsym (for architecture armv7):  Mach-O executable arm_v7
TestDsym (for architecture arm64):  Mach-O 64-bit executable arm64

這個時候就有多個架構了椿争。
當然也可以在Xcode中直觀的看到支持的架構:

image.png

Xcode中架構設置在Build Settings -> Architectures中:

image.png

  • Architectures:支持的架構怕膛。
  • Build Active Architecture Only:默認情況下debug模式下只編譯當前設備架構,release模式下需要根據(jù)支持的設備秦踪。
  • $(ARCHS_STANDARD):環(huán)境變量褐捻,代表當前支持的架構。

如果我們要修改架構直接在Architectures中配置(增加armv7s):

image.png

編譯再次查看MachO:

file TestDsym
TestDsym: Mach-O universal binary with 3 architectures: [arm_v7:Mach-O executable arm_v7] [arm_v7s:Mach-O executable arm_v7s] [arm64:Mach-O 64-bit executable arm64]
TestDsym (for architecture armv7):  Mach-O executable arm_v7
TestDsym (for architecture armv7s): Mach-O executable arm_v7s
TestDsym (for architecture arm64):  Mach-O 64-bit executable arm64

2.1通用二進制文件(Universal binary

  • 蘋果公司提出的一種程序代碼椅邓,能同時適用多種架構的二進制文件柠逞。
  • 同一個程序包中同時為多種架構提供最理想的性能。
  • 因為需要儲存多種代碼景馁,通用二進制應用程序通常比單一平臺二進制的程序要大板壮。
  • 由于多種架構有共同的非執(zhí)行資源(代碼以外的),所以并不會達到單一版本的多倍之多(特殊情況下合住,只有少量代碼文件的情況下有可能會大于多倍)绰精。
  • 由于執(zhí)行中只調(diào)用一部分代碼撒璧,運行起來不需要額外的內(nèi)存。

當我們將通用二進制文件拖入Hopper時笨使,能夠看到讓我們選擇對應的架構:

image.png

2.2lipo命令

lipo是管理Fat File的工具卿樱,可以查看cpu架構,,提取特定架構硫椰,整合和拆分庫文件繁调。

使用lipo -info 可以查看MachO文件包含的架構
lipo -info MachO文件

lipo -info TestDsym
Architectures in the fat file: TestDsym are: armv7 armv7s arm64

使用lifo –thin 拆分某種架構
lipo MachO文件 –thin 架構 –output 輸出文件路徑

lipo TestDsym -thin armv7 -output macho_armv7
lipo TestDsym -thin arm64 -output macho_arm64
file macho_armv7
macho_armv7: Mach-O executable arm_v7
file macho_arm64
macho_arm64: Mach-O 64-bit executable arm64

使用lipo -create 合并多種架構
lipo -create MachO1 MachO2 -output 輸出文件路徑

lipo -create macho_armv7 macho_arm64 -output  macho_v7_64

file macho_v7_64
macho_v7_64: Mach-O universal binary with 2 architectures: [arm_v7:Mach-O executable arm_v7] [arm64:Mach-O 64-bit executable arm64]
macho_v7_64 (for architecture armv7):   Mach-O executable arm_v7
macho_v7_64 (for architecture arm64):   Mach-O 64-bit executable arm64

三、MachO文件結構

Apple官網(wǎng)圖

Mach-O 的組成結構如圖所示:

  • Header:包含該二進制文件的一般信息靶草。

    • 字節(jié)順序蹄胰、架構類型、加載指令的數(shù)量等奕翔。
    • 快速確認一些信息裕寨,比如當前文件用于32位還是64位,對應的處理器是什么糠悯、文件類型是什么帮坚。
  • Load Commands:一張包含很多內(nèi)容的表。

    • 內(nèi)容包括區(qū)域的位置互艾、符號表试和、動態(tài)符號表等。
  • Data:通常是對象文件中最大的部分纫普。

    • 包含Segement的具體數(shù)據(jù)

通用二進制文件就是包含多個這種結構阅悍。

otool -f MachO文件查看Header信息:

otool -f TestDsym

Fat headers
fat_magic 0xcafebabe
nfat_arch 3
architecture 0
    cputype 12
    cpusubtype 9
    capabilities 0x0
    offset 16384
    size 79040
    align 2^14 (16384)
architecture 1
    cputype 12
    cpusubtype 11
    capabilities 0x0
    offset 98304
    size 79040
    align 2^14 (16384)
architecture 2
    cputype 16777228
    cpusubtype 0
    capabilities 0x0
    offset 180224
    size 79760
    align 2^14 (16384)

分析MachO最好的工具就是 MachOView了:

image.png

otool的內(nèi)容相同,對于多架構MachO會有一個Fat Header其中包含了CPU類型和架構昨稼。OffsetSize代表了每一個每一個架構在二進制文件中的偏移和大小节视。

這里有個問題是16384+79040 = 95424 < 9830498304 - 16384 = 81920假栓。81920 / 4096 / 4 = 5寻行,可以驗證這里是以頁對齊的。(iOS中一頁16K匾荆,MachO中都是以頁為單位對齊的拌蜘,這也就是為什么能在Load Commands中插入LC_LOAD_DYLIB的原因。)牙丽。

MachO對應結構如下:

image.png

3.1Header

Header數(shù)據(jù)結構:

image.png

對應dyld的定義如下(loader.h):

struct mach_header {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
};

struct mach_header_64 {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
    uint32_t    reserved;   /* reserved */
};
  • magic:魔數(shù)简卧,快速定位屬于64位還是32位。
  • cputypeCPU類型烤芦,比如ARM举娩。
  • cpusubtypeCPU具體類型,arm64armv7铜涉。
  • filetype:文件類型智玻,比如可執(zhí)行文件,具體包含類型如下:
#define MH_OBJECT   0x1     /* relocatable object file */
#define MH_EXECUTE  0x2     /* demand paged executable file */
#define MH_FVMLIB   0x3     /* fixed VM shared library file */
#define MH_CORE     0x4     /* core file */
#define MH_PRELOAD  0x5     /* preloaded executable file */
#define MH_DYLIB    0x6     /* dynamically bound shared library */
#define MH_DYLINKER 0x7     /* dynamic link editor */
#define MH_BUNDLE   0x8     /* dynamically bound bundle file */
#define MH_DYLIB_STUB   0x9     /* shared library stub for static
                       linking only, no section contents */
#define MH_DSYM     0xa     /* companion file with only debug
                       sections */
#define MH_KEXT_BUNDLE  0xb     /* x86_64 kexts */
#define MH_FILESET  0xc     /* a file composed of other Mach-Os to
                       be run in the same userspace sharing
                       a single linkedit. */
  • ncmdsNumber of Load Commands骄噪,Load Commands條數(shù)尚困。
  • sizeofcmdsSize of Load Commands蠢箩,Load Commands大小链蕊。
  • flags:標識二進制文件支持的功能,主要是和系統(tǒng)加載谬泌、鏈接有關滔韵。
  • reservedarm64特有,保留字段掌实。

3.2 LoadCommands

Load Commands指示dyld如何加載二進制文件陪蜻。
一個基本的Load Comands如下:

image.png

  • __PAGEZERO
    image.png

    空指針陷阱,目的是為了和32位指令完全分開贱鼻。(32位地址在4G以下宴卖,64位地址大于4G 0xffffffff = 4G)。
    __PAGEZERO不占用數(shù)據(jù)(file size0)邻悬,唯一有的是VM Sizearm64 4G症昏,armv7比較小)父丰。

VM Addr : 虛擬內(nèi)存地址
VM Size: 虛擬內(nèi)存大小肝谭。運行時刻在內(nèi)存中的大小,一般情況下和File size相同蛾扇,__PAGEZERO例外攘烛。
File offset:數(shù)據(jù)在文件中偏移量。
File size: 數(shù)據(jù)在文件中的大小镀首。
我們定位是看VM Addr + ASLR坟漱。

  • __TEXT__DATA更哄、__LINKEDIT:將文件中(32位/64位)的段映射到進程地址空間中芋齿。
    分為三大塊,分別對應DATA中的Section__TEXT + __DATA)竖瘾、__LINKEDIT沟突。告訴dyld占用多大空間。

  • LC_DYLD_INFO_ONLY:動態(tài)鏈接相關信息捕传。

    image.png

    Rebase:重定向(ASLR)偏移地址和大小惠拭。從Rebase Info Offset + ASLR開始加載336個字節(jié)數(shù)據(jù)。
    Binding:綁定外部符號。
    Weak Binding:弱綁定职辅。
    Lazy Binding:懶綁定棒呛,用到的時候再綁定。
    Export info:對外開放的函數(shù)域携。

  • LC_SYMTAB:符號表地址簇秒。

    image.png

  • LC_DSYMTAB:動態(tài)符號表地址。

    image.png

  • LC_LOAD_DYLINKER:使用何種動態(tài)加載器秀鞭。iOS使用的是dyld趋观。

    image.png

  • LC_UUID:文件的UUID,當前MachO文件的唯一識別標識锋边。

    image.png

  • LC_VERSION_MIN_IPHONES:支持最低的操作系統(tǒng)版本皱坛。

    image.png

  • LC_SOURCE_VERSION:源代碼版本。

    image.png

  • LC_MAIN:程序主程序的入口地址和棧大小豆巨。

    image.png

    逆向找不到切入點的時候一般找main入口切入剩辟。(做了防護,運行就閃退的情況下)往扔。

  • LC_ENCRYPTION_INFO_64:加密信息贩猎。

    image.png

  • LC_LOAD_DYLIB:依賴的三方庫。

  • LC_RPATH@rpath萍膛。Frameworks庫的路徑吭服。

    image.png

  • LC_FUNCTION_DYLIB:函數(shù)起始地址表。

  • LC_DATA_IN_CODE:定義在代碼段內(nèi)的非指令的表卦羡。

  • LC_DATA_SIGNATURE:代碼簽名噪馏。

3.3Data

Data包含Section__TEXT + __DATA)、__LINKEDIT绿饵。

image.png

3.3.1__TEXT

__TEXT代碼段欠肾,就是我們的代碼。

  • __text:主程序代碼拟赊。開始是代碼起始位置刺桃,和Compile Sources中文件順序有關。

    image.png

  • __stubs & __stub_helper:用于符號綁定吸祟。

    image.png

image.png

這里65a0就是325a0瑟慈,這里是循環(huán)做符號綁定。

  • __objc_methname:方法名稱

  • __objc_classname:類名稱

  • __objc_methtype:方法類型

  • __cstring:字符串常量

3.3.2__DATA

__DATA數(shù)據(jù)段屋匕。

  • __got & __la_symbol_ptr:外部符號有兩張表Non-LazyLazy葛碧。
    image.png

調(diào)用外部的函數(shù),只有運行的時候才能找到过吻。
Non-Lazy啟動時刻就綁定:

image.png

Lazy懶加載表进泼,表中的指針一開始都指向 __stub_helper

image.png

  • __cfstring:程序中使用的 Core Foundation 字符串(CFStringRefs)蔗衡。

  • __objc_classlist:類列表。

  • __objc_protolist: 原型乳绕。

  • __objc_imageinfo:鏡像信息

  • __objc_selrefsself 引用

  • __objc_classrefs:類引用

  • __objc_superrefs:超類引用

  • __data:初始化過的可變數(shù)據(jù)绞惦。

3.3.3 __LINKEDIT

  • Dynamic Loader Info:動態(tài)加載信息

  • Function Starts:入口函數(shù)

  • Symbol Table:符號表

  • Dynamic Symbol Table:動態(tài)庫符號表

  • String Table:字符串表

  • Code Signature:代碼簽名

總結

  • MachO屬于一種文件格式。
    • 包含:可執(zhí)行文件洋措、靜態(tài)庫济蝉、動態(tài)庫、dyld等菠发。
    • 可執(zhí)行文件:
      • 通用二進制文件(Fat):集成了多種架構王滤。
      • lipo命令:-thin拆分架構,-creat合并架構雷酪。
  • MachO結構:
    • Header:快速確定該文件的CPU類型淑仆,文件類型等。
    • Load Commands:知識加載器(dyld)如何設置并加載二進制數(shù)據(jù)哥力。
    • Data:存放數(shù)據(jù),代碼墩弯、數(shù)據(jù)吩跋、字符串常量、類渔工、方法等锌钮。

問題處理

1.fatal error: 'stdio.h' file not found
方案一:

export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

https://developer.apple.com/forums/thread/123997

導入后警告處理,可以在終端加入以下符號去除警告
-Wno-nullability-completeness,-Wno-expansion-to-defined

https://stackoverflow.com/questions/58429844/c-multiple-warnings-pointer-is-missing-a-nullability-type-specifier-when-com?noredirect=1

方案二:
傳遞參數(shù)-isysroot

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk

方案三(推薦):
拷貝頭文件到/usr/local/include/目錄:

sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

這種方式?jīng)]有警告引矩,推薦這么處理梁丘。如果/usr/local/include/目錄中有文件可以先刪除(記的備份)。

有時候代碼格式化會配置clang-format的路徑旺韭,可以使用which clang查看使用的是哪個clang檢查路徑是否正確氛谜。/usr/bin/clang

https://stackoverflow.com/questions/58278260/cant-compile-a-c-program-on-a-mac-after-upgrading-to-catalina-10-15
https://akrabat.com/installing-pillow-on-macos-10-15-calatalina/

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市区端,隨后出現(xiàn)的幾起案子值漫,更是在濱河造成了極大的恐慌,老刑警劉巖织盼,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杨何,死亡現(xiàn)場離奇詭異,居然都是意外死亡沥邻,警方通過查閱死者的電腦和手機危虱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唐全,“玉大人埃跷,你說我怎么就攤上這事。” “怎么了捌蚊?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵集畅,是天一觀的道長。 經(jīng)常有香客問我缅糟,道長挺智,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任窗宦,我火速辦了婚禮赦颇,結果婚禮上,老公的妹妹穿的比我還像新娘赴涵。我一直安慰自己媒怯,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布髓窜。 她就那樣靜靜地躺著扇苞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寄纵。 梳的紋絲不亂的頭發(fā)上鳖敷,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音程拭,去河邊找鬼定踱。 笑死,一個胖子當著我的面吹牛恃鞋,可吹牛的內(nèi)容都是我干的崖媚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼恤浪,長吁一口氣:“原來是場噩夢啊……” “哼畅哑!你這毒婦竟也來了?” 一聲冷哼從身側響起资锰,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤敢课,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绷杜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體直秆,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年鞭盟,在試婚紗的時候發(fā)現(xiàn)自己被綠了圾结。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡齿诉,死狀恐怖筝野,靈堂內(nèi)的尸體忽然破棺而出晌姚,到底是詐尸還是另有隱情,我是刑警寧澤歇竟,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布挥唠,位于F島的核電站,受9級特大地震影響焕议,放射性物質(zhì)發(fā)生泄漏宝磨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一盅安、第九天 我趴在偏房一處隱蔽的房頂上張望唤锉。 院中可真熱鬧,春花似錦别瞭、人聲如沸窿祥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晒衩。三九已至,卻和暖如春籽慢,著一層夾襖步出監(jiān)牢的瞬間浸遗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工箱亿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弃秆。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓届惋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親菠赚。 傳聞我的和親對象是個殘疾皇子脑豹,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 定義 MachO是一種文件格式,內(nèi)部包換:可執(zhí)行文件,動態(tài)庫衡查,靜態(tài)庫瘩欺,dyld,目標文件等。其中的可執(zhí)行文件是一個...
    澤澤伐木類閱讀 1,224評論 0 1
  • 在上一篇文章中拌牲,咱們已經(jīng)簡單的提到了MachO俱饿,在用Framework做代碼注入的時候,必須先向MachO的Loa...
    螞蟻也瘋狂閱讀 1,797評論 1 4
  • [toc] MachO文件概述 Mach-O其實是Mach Object文件格式的縮寫塌忽,是mac以及iOS上可執(zhí)行...
    清風烈酒2157閱讀 659評論 0 2
  • 在上篇文章代碼注入拍埠,竊取微信密碼中咱們已經(jīng)簡單的提到了MachO,在用Framework做代碼注入的時候土居,必須先向...
    一縷清風揚萬里閱讀 13,068評論 9 89
  • 轉載:原文地址 在上篇文章代碼注入枣购,竊取微信密碼中咱們已經(jīng)簡單的提到了MachO嬉探,在用Framework做代碼注入...
    iOS猿_員閱讀 1,456評論 0 11