揭開(kāi)iOS逆向解密的神秘面紗
前言
學(xué)習(xí)和了解逆向工程,可以幫助我們分析競(jìng)品和自己喜歡的APP的開(kāi)發(fā)架構(gòu)和某些功能的大體實(shí)現(xiàn)思路,也可以自己手動(dòng)對(duì)其它APP大刀闊斧進(jìn)行二次加工,滿(mǎn)足自己的需求。 學(xué)習(xí)iOS逆向一段時(shí)間了,這里簡(jiǎn)單做個(gè)總結(jié),揭開(kāi)iOS逆向的神秘面紗。
Mac遠(yuǎn)程登錄iPhone
iOS和Mac OS X都是基于Darwin(蘋(píng)果的一個(gè)基于Unix的開(kāi)源系統(tǒng)內(nèi)核),所以iOS中同樣支持終端的命令行操作。
在逆向工程中,我們經(jīng)常會(huì)通過(guò)命令行來(lái)操縱iPhone。為了能夠讓Mac終端中的命令行能作用在iPhone上,我們得讓Mac和iPhone建立連接。連接有兩種方式:wifi連接和usb連接。
先在越獄軟件上安裝ssh插件OpenSSH ,命令行下和應(yīng)用交互的插件Cycript
讓越獄手機(jī)和mac電腦在同一個(gè)局域網(wǎng)下(為了能夠通過(guò)ssh服務(wù)從mac電腦訪問(wèn)手機(jī))
在mac的命令行終端 通過(guò)ssh服務(wù)登錄手機(jī) 輸入ssh root@手機(jī)ip。默認(rèn)情況下的root密碼是alpine。root密碼可以自己修改。
然后在手機(jī)上運(yùn)行程序,在mac終端上利用ps -A 查看手機(jī)當(dāng)前運(yùn)行的進(jìn)程,找到進(jìn)程id后便可以利用cycript進(jìn)行一些列操作。例如:進(jìn)入當(dāng)前運(yùn)行著的微信進(jìn)程的cycript狀態(tài)cycript -p WeChat
采用wifi連接有時(shí)候會(huì)出現(xiàn)卡頓延遲的現(xiàn)象,所以我通常采用usb連接。
Mac上有個(gè)服務(wù)程序usbmuxd(它會(huì)開(kāi)機(jī)自動(dòng)啟動(dòng)),可以將Mac的數(shù)據(jù)通過(guò)USB傳輸?shù)絠Phone
我使用了兩個(gè)腳本進(jìn)行登錄:
- python ~/iOS/tcprelay.py -t 22:10010進(jìn)行端口的映射
- ssh -p 10010 root@localhost usb的登錄
Cycript的使用
Cycript是Objective-C++、ES6(JavaScript)、Java等語(yǔ)法的混合物,可以用來(lái)探索、修改、調(diào)試正在運(yùn)行的Mac\iOS APP。官網(wǎng):http://www.cycript.org
比如一些簡(jiǎn)單的使用:
// 微信進(jìn)程 cycript -p WeChat // 獲得沙盒路徑 NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)[0] // 打印當(dāng)前頁(yè)面view的層級(jí) UIApp.keyWindow.recursiveDescription().toString()
主要搭配Reveal使用,從Reveal中獲得某個(gè)界面或者view所屬的類(lèi)或控制器,然后拿到該類(lèi)或控制器利用cycript進(jìn)行調(diào)試。比如,知道了一個(gè)view對(duì)應(yīng)的類(lèi)為testView,想把該view從當(dāng)前界面移除,達(dá)到不顯示的效果:
[testView removeFromSuperview];
代碼Hook分析
如果要逆向App的某個(gè)功能少不了代碼的分析。
1.通過(guò)上面的分析,找到某個(gè)view對(duì)應(yīng)的類(lèi)后,就需要導(dǎo)出該類(lèi)對(duì)應(yīng)的頭文件進(jìn)行具體的分析了。
2.首先找到App的二進(jìn)制文件(Mach-O類(lèi)型),(使用iFunBox把該文件導(dǎo)出到Mac上)然后使用class-dump工具導(dǎo)出其中的所有頭文件,這些頭文件中可以看到其中的屬性和方法。class-dump -H Mach-O文件路徑 -o 頭文件存放目錄
3.如果要查看Mach-O文件完整信息,建議用MachOView。otool -l打印所有的 Load Commands,建議搭配grep進(jìn)行正則過(guò)濾。otool -L 可以查看使用的庫(kù)文件。
4.頭文件分析完畢后,就可以利用theos進(jìn)行越越代碼的開(kāi)發(fā)了,編譯生成Tweak插件(deb格式)。
利用nic.pl指令,選擇iphone/tweak,創(chuàng)建一個(gè)tweak工程。
在這個(gè)tweak工程中編輯Tweak.xm文件,編寫(xiě)自己的越獄代碼。
開(kāi)發(fā)完成后利用make package打包和make install安裝到手機(jī)。重啟應(yīng)用,你會(huì)發(fā)現(xiàn)對(duì)應(yīng)的功能已經(jīng)根據(jù)hook的代碼改變了。
原理:iOS在越獄后,會(huì)默認(rèn)安裝一個(gè)名叫mobilesubstrate的動(dòng)態(tài)庫(kù),它的作用是提供一個(gè)系統(tǒng)級(jí)的入侵管道,所有的tweak都可以依賴(lài)它來(lái)進(jìn)行開(kāi)發(fā)。在目標(biāo)程序啟動(dòng)時(shí)根據(jù)規(guī)則把指定目錄的第三方的動(dòng)態(tài)庫(kù)加載進(jìn)去,第三方的動(dòng)態(tài)庫(kù)也就是我們寫(xiě)的破解程序,從而達(dá)到修改內(nèi)存中代碼邏輯的目的。
5.有時(shí)候想看某個(gè)類(lèi)中的某個(gè)方法的實(shí)現(xiàn)以及調(diào)用邏輯,就需要用到Hopper Disassembler工具。
theos的常用語(yǔ)法
- %hook ,%end : hook一個(gè)類(lèi)的開(kāi)始和結(jié)束
- %log:打印方法調(diào)用詳情
- HBDebugLog:跟NSLog類(lèi)似
- %new:添加一個(gè)新的方法的時(shí)候使用
- %orig:函數(shù)原來(lái)的代碼邏輯
- %ctor:在加載動(dòng)態(tài)庫(kù)時(shí)調(diào)用
- logify.pl:可以將一個(gè)頭文件快速轉(zhuǎn)換成已經(jīng)包含打印信息的xm文件
- 如果有額外的資源文件(比如圖片),放到項(xiàng)目的layout文件夾中,對(duì)應(yīng)著手機(jī)的根路徑/
砸殼(脫殼)
如果使用越獄手機(jī)直接從pp助手下載下來(lái)的部分應(yīng)用免去了我們自己脫殼的過(guò)程。但是如果是從App Store下載下來(lái)的應(yīng)用,App Store已經(jīng)為該應(yīng)用進(jìn)行了加密,再使用class-dump是無(wú)法導(dǎo)出頭文件的,這是時(shí)候就需要對(duì)APP進(jìn)行脫殼操作了。
脫殼工具有兩種,Clutch 和 dumpdecrypted
Clutch :
在Mac終端登陸到iPhone后,利用Clutch脫殼
Clutch -i 列舉手機(jī)中已安裝的應(yīng)用中加密的應(yīng)用。
Clutch -d 應(yīng)用bundleid 對(duì)加密的應(yīng)用脫殼,脫殼成功后會(huì)生產(chǎn)新的Match-O文件。對(duì)這個(gè)新的文件進(jìn)行class-dump操作即可。
有時(shí)候使用Clutch脫殼,會(huì)出現(xiàn)失敗的情況,比如脫殼微信的時(shí)候就會(huì)出現(xiàn)錯(cuò)誤。這個(gè)時(shí)候就需要使用dumpdecrypted:
終端進(jìn)入dumpdecrypted.dylib所在的目錄 var/root
使用環(huán)境變量 DYLD_INSERT_LIBRARIES 將 dylib 注入到需要脫殼的可執(zhí)行文件(可執(zhí)行文件路徑可以通過(guò)ps -A查看獲?。?br /> 執(zhí)行命令 DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可執(zhí)行文件路徑 即可完成脫殼操作。
結(jié)語(yǔ)
了解以上逆向的流程后,你可以實(shí)現(xiàn)一些有趣的功能,比如:視頻客戶(hù)端去廣告,修改微信運(yùn)動(dòng)步數(shù),防止微信消息測(cè)回,微信自動(dòng)搶紅包等功能。同時(shí),也會(huì)在自己客戶(hù)端的開(kāi)發(fā)過(guò)程中更注重信息的安全保護(hù)。研究逆向,一定要善于利用各種工具,并且做好不斷失敗的準(zhǔn)備,愈挫愈勇,終會(huì)成功。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式
這篇文章主要介紹了IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式的相關(guān)資料,需要的朋友可以參考下2016-11-11iOS實(shí)現(xiàn)按鈕點(diǎn)擊選中與被選中切換功能
這篇文章主要介紹了iOS實(shí)現(xiàn)按鈕點(diǎn)擊選中與被選中切換功能,需要的朋友可以參考下2017-07-07iOS如何自定義控制器轉(zhuǎn)場(chǎng)動(dòng)畫(huà)push詳解
在平時(shí)開(kāi)發(fā)中,有時(shí)候需要一些轉(zhuǎn)場(chǎng)動(dòng)畫(huà)給界面調(diào)整增添一些活力,而實(shí)現(xiàn)這些動(dòng)畫(huà)相對(duì)比較繁瑣。下面這篇文章主要給大家介紹了關(guān)于iOS如何自定義控制器轉(zhuǎn)場(chǎng)動(dòng)畫(huà)push的相關(guān)資料,需要的朋友可以參考下。2017-12-12iOS開(kāi)發(fā)中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片瀏覽器的實(shí)例講解
這篇文章主要介紹了iOS開(kāi)發(fā)中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片瀏覽器的實(shí)例講解,代碼基礎(chǔ)傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01