<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          iOS逆向 -- 逆向初探

          共 5819字,需瀏覽 12分鐘

           ·

          2021-07-07 17:29


          本文由作者 小峰子 投稿,文章來(lái)源于掘金,點(diǎn)擊閱讀原文查看作者更多文章

          https://juejin.cn/post/6963963222936256519


          由于公司的業(yè)務(wù)主要是支付方面,所以之前有動(dòng)力研究了些逆向相關(guān)的知識(shí)。

          鑒于逆向涉及到的知識(shí)面既廣且雜,而且操作流程也多,用到的工具也多。想著,不妨把操作流程和相關(guān)知識(shí)記錄一遍,以備不時(shí)之需。(主要是被人問(wèn)到了,雖然答完了,但也突然有了做這個(gè)記錄的想法)

          本來(lái)逆向的章節(jié)是打算等底層系列最后幾篇文章結(jié)束后開(kāi)始,可是既然被問(wèn)到了,就沒(méi)有不總結(jié)的道理。于是就有了這篇文章。

          需要強(qiáng)調(diào)的是,逆向的初衷絕對(duì)是保護(hù)自己的app



          逆向涉及到的知識(shí)


          涉及到的相關(guān)知識(shí)主要從我自身學(xué)習(xí)的感受出發(fā),覺(jué)得哪些重要,掌握了對(duì)逆向開(kāi)發(fā)有幫助的我就在這里提一下。以下肯定會(huì)存在一些紕漏,望指出,后續(xù)及時(shí)更新,避免誤導(dǎo)。

          ? 工具的使用(包括但不限于砸殼工具,dump工具,靜態(tài)分析工具,動(dòng)態(tài)調(diào)試工具,界面分析工具等),工具一定要會(huì)用,就算不知道對(duì)應(yīng)原理只要會(huì)用也能逆向開(kāi)發(fā)
          ? dyld,macho,符號(hào)表等包含了編譯和鏈接相關(guān)的知識(shí),需要分析macho文件內(nèi)容
          ? ARM64匯編的一些基礎(chǔ)指令看得懂,部分關(guān)鍵方法名會(huì)被混淆,需要看匯編明白它在做什么
          ? 底層知識(shí)知道越多越好,主要是hook相關(guān)的,比如Method Swizzling,F(xiàn)ishHook,InLineHook三種hook方法要懂
          ? iOS系統(tǒng)的文件結(jié)構(gòu),大概知道不同的文件目錄下存儲(chǔ)著哪些內(nèi)容就行
          ? 動(dòng)態(tài)庫(kù)的原理要知道,注入代碼都是以動(dòng)態(tài)庫(kù)的形式
          ? 基本的終端操作和一點(diǎn)點(diǎn)shell基礎(chǔ),便于使用腳本快速執(zhí)行
          ? 常見(jiàn)加解密手段和抓包工具,網(wǎng)絡(luò)傳輸數(shù)據(jù)通常會(huì)加密,獲取到秘鑰是關(guān)鍵的步驟



          逆向開(kāi)發(fā)流程


          剛開(kāi)始學(xué)的時(shí)候,也嘗試搜了些相關(guān)資料,結(jié)果發(fā)現(xiàn)里面很多專(zhuān)有名詞看的一頭霧水,很多技術(shù)手段單看覺(jué)得還好,但不知道該怎么串起來(lái)使用,很影響學(xué)習(xí)下去的興趣。

          想來(lái),大部分初學(xué)者多半也是會(huì)有這樣的感受。我就把通常的逆向開(kāi)發(fā)流程整理下來(lái),有興趣的小伙伴可以對(duì)著流程一步一步的去找相關(guān)資料來(lái)研究,思路會(huì)清晰很多。(不含工具下載配置流程,這部分網(wǎng)上內(nèi)容很多,只給出工具名和一些基本的講解)

          1.越獄

          準(zhǔn)備一臺(tái)越獄手機(jī)是逆向開(kāi)發(fā)的第一步。目前,越獄的方式眾多,都基本都是傻瓜式操作。我個(gè)人目前使用的越獄手段是通過(guò)愛(ài)思助手。

          根據(jù)手機(jī)的系統(tǒng)版本選擇對(duì)應(yīng)的選項(xiàng),如果版本較高,選擇CheckRa1n,按照提示一步步完成即可越獄。

          越獄后,屏幕上多出CheckRa1n應(yīng)用程序,打開(kāi)選擇安裝Cydia,因?yàn)槲乙呀?jīng)安裝過(guò)了,提示會(huì)不一樣。

          安裝成功后,界面多出Cydia應(yīng)用程序。

          打開(kāi)Cydia,如果正常運(yùn)行說(shuō)明已是越獄環(huán)境;如果閃退說(shuō)明是非越獄環(huán)境。

          需要注意的是,越獄分為完美越獄和非完美越獄兩種情況。

          ? 完美越獄:越獄很徹底,破解了操作系統(tǒng)的讀寫(xiě)權(quán)限,完美越獄完成以后可以自由使用,開(kāi)關(guān)機(jī)也不影響
          ? 非完美越獄:關(guān)機(jī)后會(huì)重新回到非越獄環(huán)境

          目前,完美越獄只支持到iOS9,所以大家手上的手機(jī)大部分肯定只能非完美越獄了。

          但是鑒于目前越獄流程及其簡(jiǎn)單,就算是非完美越獄關(guān)機(jī)后也只要重新再越獄一次即可回到越獄環(huán)境。所以,并非要刻意的追求完美越獄。

          然后需要去Cydia中安裝一些插件,包括但不限于:

          ? Apple File Conduit "2",可以獲得根目錄訪問(wèn)權(quán)限。
          ? AppSync Unified,可以繞過(guò)簽名檢測(cè)
          ? adv-cmds,命令行
          ? OpenSSH,遠(yuǎn)程登錄
          ? Frida,砸殼

          等..

          2. Openssh

          OpenSSH 是 SSH (Secure SHell) 協(xié)議的免費(fèi)開(kāi)源實(shí)現(xiàn)。SSH協(xié)議可以用來(lái)進(jìn)行遠(yuǎn)程控制, 或在計(jì)算機(jī)之間傳送文件

          逆向開(kāi)發(fā)一般使用到手機(jī)和電腦兩個(gè)終端,這兩者使用Openssh連接。

          Openssh的連接方式有:通過(guò)網(wǎng)絡(luò)連接和通過(guò)USB連接。

          通過(guò)USB連接會(huì)更穩(wěn)定效率也更高,所以我常用的是USB連接。這里連接的終端指令基本又臭又長(zhǎng),需要使用shell適當(dāng)簡(jiǎn)化下。

          3.砸殼

          分析應(yīng)用的前提是要先獲取應(yīng)用的安裝包。iOS主要的下載渠道是appstore,可是appstore上下載的包蘋(píng)果會(huì)對(duì)__TETX段里面的內(nèi)容進(jìn)行加密,如果不解密無(wú)法做后續(xù)操作。

          所以砸殼技術(shù)就應(yīng)運(yùn)而生了。

          砸殼分為靜態(tài)砸殼和動(dòng)態(tài)砸殼,主流的形式是動(dòng)態(tài)砸殼。

          動(dòng)態(tài)砸殼的原理主要是:

          雖然macho中的__TEXT段被蘋(píng)果加密了,但是系統(tǒng)如果要運(yùn)行程序,肯定需要對(duì)內(nèi)容進(jìn)行解密。所以就不去主動(dòng)的砸掉原有的加密殼,而是當(dāng)應(yīng)用程序運(yùn)行后,殼被系統(tǒng)砸掉后,在內(nèi)存中把砸殼后的數(shù)據(jù)取出來(lái),也就達(dá)到了砸殼的目的。

          砸殼的工具也比較多,我個(gè)人目前使用的是frida。至于安裝步驟配置啥的,網(wǎng)上教程也很多,這里就不說(shuō)明了。

          安裝完來(lái)到frida-ios-dump目錄下,

          通過(guò)dump.py腳本執(zhí)行對(duì)應(yīng)的命令。

          終端執(zhí)行

          ./dump.py -l

          會(huì)列出手上已經(jīng)安裝的app,如果是運(yùn)行狀態(tài),還有對(duì)應(yīng)的pid。

          然后通過(guò)

          ./dump.py 應(yīng)用名稱(chēng)

          即可實(shí)現(xiàn)一行代碼砸殼。

          砸完殼后的包在frida-ios-dump目錄內(nèi)。

          區(qū)分是否砸殼的標(biāo)志是macho中cryptid的值是否為0

          一般使用otool指令查看對(duì)應(yīng)的macho的段和對(duì)應(yīng)的值。

          otool -l macho路徑 | grep crypt

          可以看到,cryptid的值為0,說(shuō)明這是砸殼后的macho了。

          當(dāng)然也可以把macho拖入MachoView(查看macho的軟件)中直接查看:

          來(lái)到LC_ENCRYPTION_INFO_64段下,Crypt ID同樣是0。

          獲取到包后,可以先查看包內(nèi)容。里面有圖片文件,聲音文件,plist文件,動(dòng)態(tài)庫(kù)信息,glsl文件等,通過(guò)這些信息就可以對(duì)應(yīng)用程序有個(gè)大致的了解了。

          蘋(píng)果的加密處理在砸殼工具泛濫的今日,不僅防不住,還會(huì)增加應(yīng)用程序的包體積,是否還有存在的必要?

          4. class-dump

          class-dump就是用來(lái)dump頭文件的工具,簡(jiǎn)單好用。

          class-dump的主要原理是:

          編譯后,macho中就存放著存放著類(lèi)名和方法名等信息,通過(guò)內(nèi)存地址的偏移,可以找到它們對(duì)應(yīng)的段,然后依次輸出內(nèi)容,也就能獲得頭文件信息了。

          通過(guò)指令:

          class-dump -H app包路徑或者app可執(zhí)行文件路徑 -o 輸出的路徑

          一頓輸出后,獲取到了微信的頭文件,有20000多個(gè)..

          隨便打開(kāi)一個(gè)文件看看內(nèi)容,

          頭文件里面包括了這個(gè)類(lèi)所有的屬性,方法,協(xié)議等關(guān)鍵信息,其中很多甚至可以見(jiàn)名知意。

          有些app會(huì)對(duì)關(guān)鍵屬性名和方法名做混淆處理,這時(shí)候顯示的就是混淆后的亂碼了,遇到這種情況也不用慌,可以使用靜態(tài)分析工具大概查看它的實(shí)現(xiàn)邏輯,雖然麻煩些,但還是可以解決的。

          5. 靜態(tài)分析工具

          靜態(tài)分析工具是能夠?qū)acho文件的機(jī)器語(yǔ)言代碼反編譯成匯編代碼、OC偽代碼或者Swift偽代碼,同時(shí)可以快速查看關(guān)鍵字符串信息。

          這就很強(qiáng)大了,意味著可以通過(guò)查看方法的執(zhí)行流程,判斷條件等信息明白它在做什么,如果本地字符串未做混淆,也可以直接被獲取到(比如有些app秘鑰明文存儲(chǔ)本地,這就危險(xiǎn)了)。

          iOS主要使用的靜態(tài)分析工具有Hopper和IDA。

          IDA更強(qiáng)大,它能夠翻譯成的偽代碼更接近于高級(jí)語(yǔ)言,但是它的收費(fèi)也是昂貴的。

          Hopper雖然不如IDA強(qiáng)大,但也是夠用的了,所以我個(gè)人使用的是Hopper。

          把macho文件直接拖入Hopper,嘗試搜索你感興趣或者頭文件中存在的字符,會(huì)得到如下界面:

          如果你有匯編基礎(chǔ),能夠直接分析最好,如果沒(méi)有的話也不是束手無(wú)策。

          或者有些經(jīng)過(guò)混淆的方法名和字符串,通過(guò)靜態(tài)分析是無(wú)法直接得到,這些時(shí)候就需要?jiǎng)討B(tài)調(diào)試的幫助了。

          6. 動(dòng)態(tài)調(diào)試工具

          動(dòng)態(tài)調(diào)試就是將程序運(yùn)行起來(lái),通過(guò)打斷點(diǎn)(LLDB需要)、打印等方式,查看參數(shù)、返回值、函數(shù)調(diào)用流程等信息,通過(guò)輸出界面信息迅速定位目標(biāo)代碼,還可以動(dòng)態(tài)的修改內(nèi)存和寄存器中的參數(shù),達(dá)到繞過(guò)檢測(cè),更改執(zhí)行流程等目的。

          動(dòng)態(tài)調(diào)試主要有LLDB和CyCript兩種工具,兩種都很好強(qiáng)大,也各有各的好,建議兩種方式都需要學(xué)習(xí)。

          LLDB的原理是這樣的:

          用Xcode啟動(dòng)程序的時(shí)候,就會(huì)在自動(dòng)在手機(jī)上安裝一個(gè)debugserver程序,Xcode的LLDB工具會(huì)跟debugserver進(jìn)程進(jìn)行交互,將lldb指令傳輸給debugserver進(jìn)程,debugserver進(jìn)程又會(huì)將lldb指令傳輸給App,App執(zhí)行完之后,會(huì)將返回值傳輸給debugserver進(jìn)程,debugserver程序又發(fā)給LLDB,在控制臺(tái)顯示出結(jié)果。

          至于LLDB和CyCript的主要區(qū)別在于,LLDB需要卡住進(jìn)程進(jìn)行調(diào)試,而CyCript調(diào)試時(shí)需要進(jìn)程處于活動(dòng)狀態(tài)。

          二者也都可以提供一些高級(jí)用法,lldb可以取別名和開(kāi)發(fā)插件的形式使用,常用的指令也可以放入.lldbinit文件;而cycript也可以進(jìn)行高級(jí)封裝,對(duì)外提供簡(jiǎn)單易懂的調(diào)用名即可。

          說(shuō)實(shí)話,動(dòng)態(tài)調(diào)試占用逆向開(kāi)發(fā)的流程的時(shí)間比重是很大的。因?yàn)槟嫦蜷_(kāi)發(fā)主要的工作就是分析和查找定位關(guān)鍵代碼的行為。動(dòng)態(tài)調(diào)試的熟練程度基本決定了逆向開(kāi)發(fā)的耗時(shí)。

          當(dāng)遇到某些內(nèi)容被混淆甚至加密的情況下,掌握了動(dòng)態(tài)調(diào)試,混淆和加密基本上就失去了意義。
          因?yàn)闊o(wú)論如何混淆和加密,在內(nèi)存中總會(huì)有一個(gè)時(shí)刻需要解混淆和解密進(jìn)行調(diào)用,只要捕獲到這個(gè)時(shí)刻,通過(guò)動(dòng)態(tài)調(diào)試可以很輕松的獲取這個(gè)時(shí)刻關(guān)鍵值,混淆和加密工作即使做得再花里胡哨也起不了作用。

          退一步來(lái)說(shuō),比如app里面使用了這些值做了流程判斷,檢測(cè)之類(lèi)的,即使無(wú)法還原這些關(guān)鍵值,也完全可以動(dòng)態(tài)調(diào)試修改值查看不同的執(zhí)行流程,如果是檢測(cè)類(lèi)的代碼就更簡(jiǎn)單了,直接hook后固定返回YES。

          當(dāng)通過(guò)動(dòng)態(tài)調(diào)試定位到關(guān)鍵代碼,并且確定該如何修改后,就需要使用動(dòng)態(tài)庫(kù)寫(xiě)hook代碼并注入了。

          6. Hook

          在ios系統(tǒng)中常用的hook技術(shù)有三種:

          ? Cydia Substrate
          ? Symbol Table
          ? Method Swizzing

          Cydia Substrate的方式會(huì)修改被hook的函數(shù)的前8個(gè)字節(jié),使該函數(shù)跳轉(zhuǎn)到我們?cè)O(shè)定的新的函數(shù)地址,這種方式叫做inline hook,是在運(yùn)行期間hook的,對(duì)應(yīng)的框架是Dobby。

          Symbol Table符號(hào)表的hook是修改符號(hào)表所指向的內(nèi)存地址,在編譯期就進(jìn)行了交換,對(duì)應(yīng)的框架是FaceBook發(fā)布的fishHook框架。

          Method Swizzing是ios開(kāi)發(fā)常用的記錄,但是逆向開(kāi)發(fā)的 Method Swizzing是有別于開(kāi)發(fā)過(guò)程所使用的。開(kāi)發(fā)時(shí)hook基本是hook系統(tǒng)已存在的類(lèi),而逆向開(kāi)發(fā)hook的一般是他人所寫(xiě)的方法,直接方法交換存在崩潰的風(fēng)險(xiǎn),所以逆向開(kāi)發(fā)底層一般使用getimp和setimp的處理方式。對(duì)應(yīng)的是使用Theos寫(xiě)tweak的logos語(yǔ)法。

          iOS的代碼一般包含:

          ? oc方法
          ? 系統(tǒng)c函數(shù)
          ? 自定義c函數(shù)

          這三種方式剛好對(duì)應(yīng)使用上面三種hook方式。

          寫(xiě)好hook代碼的動(dòng)態(tài)庫(kù),需要注入到原目標(biāo)應(yīng)用里才能生效。

          7. 代碼注入

          代碼注入也有三種方式:

          ? 將動(dòng)態(tài)庫(kù)上傳到DynamicLibraries目錄下
          ? 使用dyld中的DYLD_INSERT_LIBRARIES環(huán)境變量
          ? 使用optool或者yololib工具給macho新增Load command

          需要注意的是,前兩種方式必須在越獄環(huán)境才能使用;而對(duì)應(yīng)用進(jìn)行重簽名后,就可以在非越獄環(huán)境下使用第三種方法了。



          總結(jié)


          逆向開(kāi)發(fā)的流程可以總結(jié)如下:

          準(zhǔn)備一臺(tái)越獄手機(jī),對(duì)目標(biāo)應(yīng)用進(jìn)行砸殼,然后class-dump出頭文件,使用靜態(tài)分析工具對(duì)應(yīng)用進(jìn)行初步分析和關(guān)鍵內(nèi)容提取,使用動(dòng)態(tài)調(diào)試工具通過(guò)界面信息等迅速定位目標(biāo)代碼,修改和調(diào)試關(guān)鍵值和流程,然后使用動(dòng)態(tài)庫(kù)寫(xiě)hook代碼,注入目標(biāo)應(yīng)用,重簽應(yīng)用。

          越獄 --> 砸殼 --> class-dump --> 靜態(tài)分析 --> 動(dòng)態(tài)調(diào)試 --> hook --> 注入 --> 重簽(非必須)

          最后,介紹一款工具叫MonKeyDev。它是對(duì)以上眾多逆向開(kāi)發(fā)工具和步驟的整合,可很快捷的實(shí)現(xiàn)上述一系列操作。

          直接把目標(biāo)應(yīng)用包丟進(jìn)TargetApp目錄下,寫(xiě)對(duì)應(yīng)的logos,就可以一步到位實(shí)現(xiàn)重簽,注入,然后下載到手機(jī)的步驟。

          以上是對(duì)逆向開(kāi)發(fā)流程和部分原理,所涉及到的相關(guān)知識(shí)點(diǎn)的整理。而涉及到具體的工具下載,配置和使用就不展開(kāi)了,這些展開(kāi)也有不少內(nèi)容且網(wǎng)上教程也很多,本文的定位也只是逆向初探,了解逆向是在做什么即可,后續(xù)的章節(jié)可能會(huì)對(duì)這些內(nèi)容做適當(dāng)?shù)难a(bǔ)充。



          推薦閱讀

          ?  打造一個(gè)通用、可配置、多句柄的數(shù)據(jù)上報(bào) SDK
          ?  京東APP中Flutter探索及優(yōu)化
          ?  iOS Pod 構(gòu)建緩存方案


          分享,收藏,點(diǎn)贊,在看四連,就差您了 ??????

          瀏覽 122
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本色情A片网址 | 无码白浆| 日本素人在线 | 欧美一级三级 | www.1区2区 |