iOS逆向:Mach-O文件

目錄
一,APP從開發(fā)到安裝的過程
二啦膜,class-dump
三,Hopper Disassembler
四淌喻,動態(tài)庫共享緩存
五僧家,Mach-O文件類型
六,Mach-O基本結(jié)構(gòu)

一裸删,APP從開發(fā)到安裝的過程

1八拱,打包
  • 圖解
  • 說明

1>代碼會被編譯為可執(zhí)行文件
2>可執(zhí)行文件的格式為Mach-O

2,安裝
  • 圖解
  • 說明

1>有證書才能安裝
2>手機(jī)版本不低于目標(biāo)版本才能安裝

二烁落,class-dump

1乘粒,介紹
2,使用
  • class-dump可執(zhí)行文件添加到Mac的/usr/local/bin目錄下
  • 用愛思助手安裝APP
  • 在下載中心中找到ipa文件并解壓
  • 在包內(nèi)容中找到Mach-O文件并拷貝到桌面上
  • class-dump導(dǎo)出.h文件:class-dump -H [Mach-O文件路徑] -o [.h文件存放路徑]

1>從App Store下載的是經(jīng)過加密的伤塌,暫時無法導(dǎo)出(需要先脫殼)

2>自己打的包沒有加密,可以導(dǎo)出

三轧铁,Hopper Disassembler

1每聪,代碼編譯過程
  • 圖解
  • 說明

1>Mach-O文件中的是機(jī)器代碼
2>匯編代碼和機(jī)器代碼是一一對應(yīng)的,所以機(jī)器代碼能夠完全反編譯為匯編代碼
3>不同的OC代碼編譯出來的匯編代碼可能是一樣的齿风,所以匯編代碼不能完全反編譯為OC代碼

2药薯,Hopper工具
  • 介紹

1>它能將Mach-O文件的機(jī)器代碼反編譯為匯編代碼和OC偽代碼
2>下載地址:http://www.sdifen.com/hopperdisassembler408.html

  • 使用

1>將Mach-O文件拖入其中并選擇arm64

2>從App Store下載的是經(jīng)過加密的,基本無法閱讀(需要先脫殼)

3>自己打的包沒有加密救斑,可以閱讀

4>機(jī)器代碼童本,匯編代碼,OC偽代碼

四脸候,動態(tài)庫共享緩存

1穷娱,動態(tài)庫存放位置
  • /System/Library/Frameworks中只有動態(tài)庫的描述文件
  • 動態(tài)庫的Mach-O文件存放在/System/Library/Caches/com.apple.dyld中的共享緩存文件里
  • 共享緩存文件是所有APP共用的绑蔫,這樣能夠節(jié)省內(nèi)存開銷
  • ARM處理器指令集架構(gòu)

1>四種架構(gòu):armv6armv7泵额,armv7s配深,arm64
2>從iPhone5s開始使用arm64架構(gòu)
3>架構(gòu)具有向下兼容的特性

2,動態(tài)庫加載
  • 我們傳的是/System/Library/Frameworks路徑嫁盲,系統(tǒng)是如何加載共享緩存文件中動態(tài)庫的
  • 系統(tǒng)是利用/usr/lib目錄下dyld程序來加載的
3篓叶,動態(tài)庫提取
  • Hopper能夠識別共享緩存文件,將dyld_shared_cache_arm64從iPhone中導(dǎo)出羞秤,然后拖入其中
  • 手動從共享緩存文件中提取動態(tài)庫

1>將dsc_extractor.cpp文件中#if 0上面的代碼和#endif注釋掉

2>進(jìn)入dsc_extractor.cpp文件所在的目錄缸托,執(zhí)行:clang++ -o dsc_extractor dsc_extractor.cpp,會生成一個可執(zhí)行文件

3>將可執(zhí)行文件和dyld_shared_cache_arm64文件放入同一個目錄下瘾蛋,進(jìn)入該目錄執(zhí)行:./dsc_extractor dyld_shared_cache_arm64 arm64

4>抽取arm64報錯俐镐,因為從Xcode10開始不能使用dsc_extractor.bundle,但不影響armv7s

五瘦黑,Mach-O文件類型

1京革,介紹
  • 在Xcode中查看targetMach-O類型(一般無需修改)
2幸斥,常見文件類型
  • MH_OBJECT

1>目標(biāo)文件(.o

2>靜態(tài)庫(.a

  • MH_EXECUTE:可執(zhí)行文件
  • MH_DYLIB:動態(tài)庫

1>.dylib

2>.framework

  • MH_DYLINKER:動態(tài)鏈接編輯器
  • MH_DSYM:符號信息文件(.dSYM
3匹摇,dyld用于加載以下文件
  • MH_EXECUTE:可執(zhí)行文件

  • MH_DYLIB:動態(tài)庫

  • MH_BUNDLE:包文件

4,通用二進(jìn)制文件(universal binary)
  • 介紹

1>不同的設(shè)備架構(gòu)是不一樣的甲葬,比如:iPhone4是armv7廊勃,iPhone5是armv7s,iPhone6是arm64

2>為了讓我們開發(fā)的APP能夠運(yùn)行在不同的設(shè)備上经窖,生成的可執(zhí)行文件必須包含不同架構(gòu)的二進(jìn)制文件坡垫,該可執(zhí)行文件就稱為通用二進(jìn)制文件

3>在設(shè)備上運(yùn)行時只會執(zhí)行對應(yīng)架構(gòu)的代碼,不會增加內(nèi)存的開銷

4>因為比單一架構(gòu)的文件大画侣,所以也被稱為“胖二進(jìn)制文件”(fat binary

  • 在Xcode中查看target的架構(gòu)類型(一般無需修改)
  • 將通用二進(jìn)制文件拆分為不同架構(gòu)的二進(jìn)制文件:lipo [通用文件名] -thin [架構(gòu)名稱] -output [輸出文件名]
  • 將不同架構(gòu)的二進(jìn)制文件合并為通用二進(jìn)制文件:lipo -create [單一文件名1] [單一文件名2] -output [輸出文件名]
  • Hopper能夠識別通用二進(jìn)制文件
ting_64
ting2

六冰悠,Mach-O基本結(jié)構(gòu)

1,結(jié)構(gòu)
  • 說明

1>Header:文件類型配乱、架構(gòu)類型等信息
2>Load commands:描述文件數(shù)據(jù)在內(nèi)存中是如何分布的
3>Raw segment data:文件數(shù)據(jù)在內(nèi)存中的具體分布

2溉卓,用otool命令查看結(jié)構(gòu)信息
3,用MachOView工具查看結(jié)構(gòu)信息

下載地址:https://sourceforge.net/projects/machoview

本文章僅供學(xué)習(xí)交流搬泥,如有侵權(quán)桑寨,請聯(lián)系刪除,謝謝忿檩!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尉尾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子燥透,更是在濱河造成了極大的恐慌沙咏,老刑警劉巖辨图,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芭碍,居然都是意外死亡徒役,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門窖壕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忧勿,“玉大人,你說我怎么就攤上這事瞻讽≡” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵速勇,是天一觀的道長晌砾。 經(jīng)常有香客問我,道長烦磁,這世上最難降的妖魔是什么养匈? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮都伪,結(jié)果婚禮上呕乎,老公的妹妹穿的比我還像新娘。我一直安慰自己陨晶,他們只是感情好猬仁,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著先誉,像睡著了一般湿刽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褐耳,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天诈闺,我揣著相機(jī)與錄音,去河邊找鬼铃芦。 笑死买雾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杨帽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嗤军,長吁一口氣:“原來是場噩夢啊……” “哼注盈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叙赚,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤老客,失蹤者是張志新(化名)和其女友劉穎僚饭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧砰,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鳍鸵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尉间。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偿乖。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哲嘲,靈堂內(nèi)的尸體忽然破棺而出贪薪,到底是詐尸還是另有隱情,我是刑警寧澤眠副,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布画切,位于F島的核電站,受9級特大地震影響囱怕,放射性物質(zhì)發(fā)生泄漏霍弹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一娃弓、第九天 我趴在偏房一處隱蔽的房頂上張望典格。 院中可真熱鬧,春花似錦忘闻、人聲如沸钝计。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽私恬。三九已至,卻和暖如春炼吴,著一層夾襖步出監(jiān)牢的瞬間本鸣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工硅蹦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留荣德,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓童芹,卻偏偏與公主長得像涮瞻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子假褪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354