iOS逆向編程
我不敢說(shuō)我這篇文章是最全的逆向工程解說(shuō),但是我可以肯定的告訴你,你圍繞我這篇文章,無(wú)論是逆向的方法、工具的選擇,你可以少走很多彎路,逆向道路千千條,我為你開辟一道陽(yáng)關(guān)大道。
前言:
還記得搞iOS逆向編程已經(jīng)是去年的事情了,趁現(xiàn)在還有點(diǎn)印象,趕緊打開了簡(jiǎn)書寫下自己的學(xué)習(xí)過(guò)程。
先給大家看看我的工具:
這里用到的工具 和 使用方法 更具體的可以去百度,你可以圍繞我這篇文章去百度 尋找需要的工具
1、Jason-2(面具) 用于json格式化顯示,正常iOS 開發(fā)網(wǎng)絡(luò)請(qǐng)求 header 頭返回application/json都會(huì)用到。(下次有時(shí)間再補(bǔ)圖)
2、Charles (青花瓷)? 設(shè)置代理后可進(jìn)行抓URI 便于我們分析項(xiàng)目里的數(shù)據(jù)。(下次有時(shí)間再補(bǔ)圖)
3、Reveal 這是分析項(xiàng)目節(jié)目圖層的工具,當(dāng)然前提是你得有個(gè)越獄手機(jī)才可以使用。(后面推薦個(gè)更好的FLEXLoader)
越獄手機(jī) cydia下載Reveal 后
選中需要查看圖層的app,這里我選擇了最后一個(gè)
再打開app ,進(jìn)去手機(jī)頁(yè)面
這時(shí)候Mac端的Reveal 就能同步看到圖層關(guān)系了,便于我們分析程序使用了哪些控件。
效果如下:
其實(shí)還有一種更好的方法:截圖你可能也看到了!沒錯(cuò),那就是FLEXLoader
和手機(jī)端打開Reveal一樣,我們選擇項(xiàng)目 后,再進(jìn)去 FLEXLoader 效果是這樣的:
多了一個(gè)工具條一樣的東西,我們點(diǎn)select 試試
一樣可以查看到圖層之間的關(guān)系,當(dāng)然只是沒有Reveal 看到的更令人愉悅而已。
4、iFUNBox 是連接手機(jī) 后 方便我們查看 手機(jī)文件的工具。(下次有時(shí)間再補(bǔ)圖)
5、iResign 是用來(lái)重新簽名app的工具(之前簽名繞了好多個(gè)彎子,使用了很多命令,雖然也成功了,但是用了這個(gè)工具,我真的是愛不釋手)(下面有用到)
6、go2shell 是在當(dāng)前文件位置打開終端的一個(gè)小工具(避免了使用cd到當(dāng)前文件位置,就相當(dāng)于window里面的shift+右鍵 打開終端一個(gè)意思)(可選)
7、machOview? 這是用來(lái)查看可執(zhí)行文件的結(jié)構(gòu)的(查看MachO文件格式信息,IOS系統(tǒng)中可執(zhí)行程序?qū)儆贛ach-O文件格式)其實(shí)你不用也能逆向(下次有時(shí)間再補(bǔ)圖)
8、IDA ,我下載了兩種:hopper Disassembiler v4 和? IDA、? IDA 64 (將二進(jìn)制翻譯成為代碼的工具,前提是 你的二進(jìn)制已經(jīng)砸殼成功)。(下次有時(shí)間再補(bǔ)圖)
9、最后就是Xcode了 ,我們需要給他安裝一個(gè)插件:monkeyDev
你可能會(huì)百度看到網(wǎng)上教程說(shuō)到iOSOpenDev,iOSOpenDev也能做到,但是那玩意太久遠(yuǎn)了,monkeyDev讓我更親近點(diǎn)。你可以選擇這個(gè)插件。
這玩意是干嘛的呢,告訴你,你逆向?qū)懙拇a,就是在這里創(chuàng)建新的項(xiàng)目里面寫的!(和我們正常創(chuàng)建iOS項(xiàng)目一樣)
網(wǎng)上有很多種寫法,但是對(duì)于iOS開發(fā)者是不是更喜歡使用Xcode的呢???答案是肯定的!!!
準(zhǔn)備逆向前說(shuō)明一下:裝逼神器
cycript是什么?
網(wǎng)上很多講到了cycript,其實(shí)這個(gè)沒啥大用,說(shuō)白了就是調(diào)試用的。也能看看效果
因?yàn)閯?dòng)態(tài)調(diào)試嘛!!!
你可以選擇不用他,反正可以爽爽。用法筆記:http://www.lxweimin.com/p/aeaf9c956d1c
=============================================================
?????????????????????????
我要強(qiáng)調(diào)的是:這個(gè)改了只是調(diào)試,真正的逆向是:
Xcode用monkeyDev 創(chuàng)建的項(xiàng)目運(yùn)行得到一個(gè)可執(zhí)行的dylib文件(再使用yololib注入到咂過(guò)殼的app里面去,重新簽名,生成新的ipa)
??????????????????????????
yololib:這個(gè)就是個(gè)可執(zhí)行文件,具體的百度,后面我會(huì)再詳細(xì)說(shuō)明。
番外:非本文內(nèi)容:
下載得到線上ipa
你可以使用windows 系統(tǒng)安裝的愛思助手下載得到安裝包
好了,工具也介紹了,現(xiàn)在開始我們的逆向之旅
? 越獄手機(jī)手機(jī)客戶端下載愛思助手,安裝一款你需要砸殼的app
? 基本都是加過(guò)密的,需要砸殼,怎么砸殼呢? 下面我給大家列一下我記得筆記:
//Clutch砸殼
? ? //? ? 拷貝到手機(jī)里面
? ? //? ? scp Clutch root@192.168.1.94:/usr/bin/
? ? //連接手機(jī)
? ? //? ? ssh root@192.168.1.94
? ? //Clutch -i 查看安裝的bundleID
? ? //Clutch -d bundleID
你需要準(zhǔn)備:
第一:Clutch :GitHub下載最新版Clutch,https://github.com/KJCracks/Clutch/releases
下載得到的Clutch 拷貝到手機(jī)/usr/bin/里面(記住要cd到Clutch 的位置,為了方便你可以使用我推薦的go2shell工具)
第二:ssh? Mac 終端自帶ssh,手機(jī)需要cydia里面安裝插件ssh (不會(huì)的去百度)
root@后面的是Mac 電腦的IP地址
砸殼步驟:(下次有時(shí)間再補(bǔ)圖)
Clutch拷進(jìn)手機(jī)
ssh連接手機(jī),
手機(jī)就有了Clutch 功能,
Clutch -i 命令可以查看所以安裝的app的bundleID(省的你去用machoview 查看了)
Clutch -d bundleID? 砸對(duì)應(yīng)bundleID 的app
這時(shí)候終端會(huì)有砸殼的進(jìn)度,最后會(huì)告訴你砸完殼后的存儲(chǔ)路徑
第三: 怎么拿到咂過(guò)的可執(zhí)行文件呢? 用命令行???? no no no!!!? 真的用命令行,那得多枯燥,這時(shí)候就用到我給你推薦的工具了:iFunbox (自己百度)
第四:使用我推薦的兩種IDA ,打開IDA? 導(dǎo)入剛才的可執(zhí)行文件,這時(shí)候就可以分析整個(gè)項(xiàng)目了!!!記住這個(gè)是分析!
這時(shí)候你的準(zhǔn)備工作已經(jīng)做了一大半了,oc項(xiàng)目都有.h 和 .m文件,.h 是暴露出來(lái)的,當(dāng)然也就能獲取到。使用Class-dump獲取(下次有時(shí)間再補(bǔ)圖)
第五:Class-dump (自行百度下載安裝)
class-dump的下載地址:http://stevenygard.com/download/class-dump-3.5.tar.gz
使用方法:(方法很簡(jiǎn)單,你也別去百度了,下面的筆記足夠了)
//? ? Class-dump 的使用
//? 1、 cd 到app位置
//? 2、 class-dump -H xxx.app -o test(備注:xxx.app 是app名稱? test是放頭文件的文件夾 這個(gè)名字你隨便起 )
這時(shí)候你的test文件夾就有了所有頭文件了,下面開始我們的逆向之旅:monkeyDev 創(chuàng)建項(xiàng)目
Xcode 的monkeyDev 插件自行百度安裝
你可能要疑惑,我新建的hook項(xiàng)目 和我砸殼的怎么關(guān)聯(lián)呢?我們帶著疑惑慢慢看。
1、新建
2、將剛才 Class-dump 的頭文件headers 也拖進(jìn)項(xiàng)目,Xcode 開發(fā)著 當(dāng)然用Xcode看更讓人愉悅啦!
3、修改配置文件plist,位置在如圖所示地方?
修改:
改成你砸殼的Bundles id :(為了你們方便 我復(fù)制一下代碼)
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<dict>
Filter
Bundles
<string>xingfu.XFExpressCameraDemo</string>
</dict>
</plist>
4、.mm文件編寫我們的hook 代碼,咋一看還挺像oc的呢!!!
先截個(gè)圖看看:
我們來(lái)分析一下:
CHDeclareClass(UIViewControllerWrapperView);
括號(hào)里面是你要hook的對(duì)象 UIViewControllerWrapperView 這個(gè)類是我砸殼的app里面的一個(gè)類
CHOptimizedMethod(1, self, void, UIViewControllerWrapperView, btnClick,id,arg1)
括號(hào)里面是你要在UIViewControllerWrapperView 這個(gè)類 hook的方法 (btnClick 是方法名),參數(shù)是id? !!!?
我是怎么找到的呢????
1、還記得我給你們提到的工具Reveal和FLEXLoader 嗎???UIViewControllerWrapperView 類 (你要找的類)可以在界面層級(jí)看到。
2、還記得我給你們提到的獲取頭文件headers嗎?(Class-dump 得到),UIViewControllerWrapperView.h得到的頭文件里面的方法。(我找到的是btnClick)
? UIButton*btn = arg1;
? ? btn.backgroundColor = [UIColor redColor];
? ? // write code here ...
? ? NSLog(@"===================");
? ? NSLog(@"這是我hook植入的代碼");
? ? NSLog(@"===================");
? ? UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"hook" message:@"這是我hook的代碼"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delegate:nilcancelButtonTitle:@"好的"otherButtonTitles: nil];
? ? [alertshow];
上面的是我給他?的hook的代碼。
最后記得釋放哦
5、寫完運(yùn)行 得到一個(gè)dylib動(dòng)態(tài)庫(kù)
我們?nèi)タ纯次覀兊某晒?/i>
6、項(xiàng)目怎么注入動(dòng)態(tài)庫(kù)呢?百度一搜,網(wǎng)上資料都是一堆命令行腳本!麻煩?是的,非常麻煩!
這時(shí)候就用到 yololib 了,GitHub 自行下載
yololib不需要安裝,網(wǎng)上一堆講解,我不想說(shuō)有多好,反正我看著就頭疼。
我的方法很粗暴,我們直接拿它用
粗暴的方法:把dylib動(dòng)態(tài)庫(kù)。 yololib? 都拷貝到。XFExpressCameraDemo.decrypted(砸殼得到的那個(gè)文件)位置:
這樣就可以粗暴的使用yololib 命令了
使用yololib簡(jiǎn)單的執(zhí)行下面一句就可以成功完成注入。
注意:我們先cd到之前保存的XFExpressCameraDemo.decrypted位置,即已砸完殼的可執(zhí)行文件位置。
./yololib 目標(biāo)可執(zhí)行文件 需注入的dylib? (空格隔開)
( 目標(biāo)可執(zhí)行文件:因?yàn)槲乙呀?jīng)cd到目標(biāo)位置,直接使用名字即可)
成功效果:
7、最后我們重新簽名
你可以百度到網(wǎng)上一堆使用腳本重新簽名的方法,這些都太繁瑣太繁瑣。逆向難,很多原因是因?yàn)榉爆崳瑳]有一篇合適的文章或者教程入門。可是看我的文章你是不是覺得也不是太難啊,沒錯(cuò),就是so easy! 不廢話了,我們繼續(xù)最后一個(gè)環(huán)節(jié) 重新簽名ipa!
使用工具iResign (百度自行下載,或者去github找)
1、ipa 路徑
2、embedded.mobileprovision路徑 :這就是配置文件(iOS開發(fā)打包的pp文件)
iOS開發(fā)都知道,這個(gè)里面有你的開發(fā)者證書信息,bundleID,團(tuán)隊(duì),有效期,設(shè)備ID等等(線上的話是生產(chǎn)證書)
3、entitlements.plist的路徑:這個(gè)需要你自己用Xcode建:
(網(wǎng)上一堆資料用腳本就是搞這個(gè)的,我們粗暴點(diǎn),自己用plist建,還不會(huì)出錯(cuò)!)
(1)、key:? application-identifier? ? ? value:? 2Y2QCD75VJ.xingfu.XFExpressCameraDemo
value這是app ID,你可以這樣看到?
(2)、com.apple.developer.team-identifier:appID 前面的那部分
(3)、get-task-allow 設(shè)置NO就行了
(4)、keychain-access-groups (數(shù)組)item0: app ID
4、需要修改的appID,配置的pp證書里面是什么和它一一對(duì)應(yīng)即可
5、選擇對(duì)應(yīng)的開發(fā)者團(tuán)隊(duì)(iOS程序員都會(huì),不多說(shuō)了)
重新簽名即可得到你hook后的app啦!!!!
運(yùn)行效果(下次有時(shí)間再補(bǔ)圖)
(完結(jié))
(完結(jié))
(完結(jié))
(完結(jié))
(完結(jié))
(完結(jié))
有人疑惑了,你讓我安裝的IDA 也沒用到啊!!!是的,入門級(jí)的教程是上面的,下面番外篇才是進(jìn)階。