iOS逆向編程
我不敢說我這篇文章是最全的逆向工程解說,但是我可以肯定的告訴你撕蔼,你圍繞我這篇文章,無論是逆向的方法秽誊、工具的選擇鲸沮,你可以少走很多彎路,逆向道路千千條锅论,我為你開辟一道陽關(guān)大道讼溺。
前言:
還記得搞iOS逆向編程已經(jīng)是去年的事情了,趁現(xiàn)在還有點印象最易,趕緊打開了簡書寫下自己的學(xué)習(xí)過程肾胯。
先給大家看看我的工具:
這里用到的工具 和 使用方法 更具體的可以去百度,你可以圍繞我這篇文章去百度 尋找需要的工具
1耘纱、Jason-2(面具) 用于json格式化顯示敬肚,正常iOS 開發(fā)網(wǎng)絡(luò)請求 header 頭返回application/json都會用到。(下次有時間再補(bǔ)圖)
2束析、Charles (青花瓷)? 設(shè)置代理后可進(jìn)行抓URI 便于我們分析項目里的數(shù)據(jù)艳馒。(下次有時間再補(bǔ)圖)
3、Reveal 這是分析項目節(jié)目圖層的工具员寇,當(dāng)然前提是你得有個越獄手機(jī)才可以使用弄慰。(后面推薦個更好的FLEXLoader)
越獄手機(jī) cydia下載Reveal 后
選中需要查看圖層的app,這里我選擇了最后一個
再打開app 蝶锋,進(jìn)去手機(jī)頁面
這時候Mac端的Reveal 就能同步看到圖層關(guān)系了陆爽,便于我們分析程序使用了哪些控件。
效果如下:
其實還有一種更好的方法:截圖你可能也看到了扳缕!沒錯慌闭,那就是FLEXLoader
和手機(jī)端打開Reveal一樣,我們選擇項目 后躯舔,再進(jìn)去 FLEXLoader 效果是這樣的:
多了一個工具條一樣的東西搂橙,我們點select 試試
一樣可以查看到圖層之間的關(guān)系髓迎,當(dāng)然只是沒有Reveal 看到的更令人愉悅而已除抛。
4叛买、iFUNBox 是連接手機(jī) 后 方便我們查看 手機(jī)文件的工具。(下次有時間再補(bǔ)圖)
5惜互、iResign 是用來重新簽名app的工具(之前簽名繞了好多個彎子布讹,使用了很多命令琳拭,雖然也成功了,但是用了這個工具描验,我真的是愛不釋手)(下面有用到)
6白嘁、go2shell 是在當(dāng)前文件位置打開終端的一個小工具(避免了使用cd到當(dāng)前文件位置,就相當(dāng)于window里面的shift+右鍵 打開終端一個意思)(可選)
7挠乳、machOview? 這是用來查看可執(zhí)行文件的結(jié)構(gòu)的(查看MachO文件格式信息,IOS系統(tǒng)中可執(zhí)行程序?qū)儆贛ach-O文件格式)其實你不用也能逆向(下次有時間再補(bǔ)圖)
8姑躲、IDA ,我下載了兩種:hopper Disassembiler v4 和? IDA睡扬、? IDA 64 (將二進(jìn)制翻譯成為代碼的工具,前提是 你的二進(jìn)制已經(jīng)砸殼成功)黍析。(下次有時間再補(bǔ)圖)
9卖怜、最后就是Xcode了 ,我們需要給他安裝一個插件:monkeyDev
你可能會百度看到網(wǎng)上教程說到iOSOpenDev阐枣,iOSOpenDev也能做到马靠,但是那玩意太久遠(yuǎn)了,monkeyDev讓我更親近點蔼两。你可以選擇這個插件甩鳄。
這玩意是干嘛的呢,告訴你额划,你逆向?qū)懙拇a妙啃,就是在這里創(chuàng)建新的項目里面寫的!(和我們正常創(chuàng)建iOS項目一樣)
網(wǎng)上有很多種寫法俊戳,但是對于iOS開發(fā)者是不是更喜歡使用Xcode的呢揖赴??抑胎?答案是肯定的T锘!阿逃!
準(zhǔn)備逆向前說明一下:裝逼神器
cycript是什么铭拧?
網(wǎng)上很多講到了cycript,其實這個沒啥大用恃锉,說白了就是調(diào)試用的羽历。也能看看效果
因為動態(tài)調(diào)試嘛!5病秕磷!
你可以選擇不用他,反正可以爽爽炼团。用法筆記:http://www.reibang.com/p/aeaf9c956d1c
=============================================================
?????????????????????????
我要強(qiáng)調(diào)的是:這個改了只是調(diào)試澎嚣,真正的逆向是:
Xcode用monkeyDev 創(chuàng)建的項目運行得到一個可執(zhí)行的dylib文件(再使用yololib注入到咂過殼的app里面去疏尿,重新簽名,生成新的ipa)
??????????????????????????
yololib:這個就是個可執(zhí)行文件易桃,具體的百度褥琐,后面我會再詳細(xì)說明。
番外:非本文內(nèi)容:
下載得到線上ipa
你可以使用windows 系統(tǒng)安裝的愛思助手下載得到安裝包
好了晤郑,工具也介紹了敌呈,現(xiàn)在開始我們的逆向之旅
? 越獄手機(jī)手機(jī)客戶端下載愛思助手,安裝一款你需要砸殼的app
? 基本都是加過密的造寝,需要砸殼磕洪,怎么砸殼呢? 下面我給大家列一下我記得筆記:
//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 (不會的去百度)
root@后面的是Mac 電腦的IP地址
砸殼步驟:(下次有時間再補(bǔ)圖)
Clutch拷進(jìn)手機(jī)
ssh連接手機(jī),
手機(jī)就有了Clutch 功能签赃,
Clutch -i 命令可以查看所以安裝的app的bundleID(省的你去用machoview 查看了)
Clutch -d bundleID? 砸對應(yīng)bundleID 的app
這時候終端會有砸殼的進(jìn)度谷异,最后會告訴你砸完殼后的存儲路徑
第三: 怎么拿到咂過的可執(zhí)行文件呢? 用命令行???? no no no!!!? 真的用命令行锦聊,那得多枯燥歹嘹,這時候就用到我給你推薦的工具了:iFunbox (自己百度)
第四:使用我推薦的兩種IDA ,打開IDA? 導(dǎo)入剛才的可執(zhí)行文件孔庭,這時候就可以分析整個項目了\裣隆!史飞!記住這個是分析尖昏!
這時候你的準(zhǔn)備工作已經(jīng)做了一大半了,oc項目都有.h 和 .m文件构资,.h 是暴露出來的抽诉,當(dāng)然也就能獲取到。使用Class-dump獲取(下次有時間再補(bǔ)圖)
第五:Class-dump (自行百度下載安裝)
class-dump的下載地址:http://stevenygard.com/download/class-dump-3.5.tar.gz
使用方法:(方法很簡單吐绵,你也別去百度了迹淌,下面的筆記足夠了)
//? ? Class-dump 的使用
//? 1、 cd 到app位置
//? 2己单、 class-dump -H xxx.app -o test(備注:xxx.app 是app名稱? test是放頭文件的文件夾 這個名字你隨便起 )
這時候你的test文件夾就有了所有頭文件了唉窃,下面開始我們的逆向之旅:monkeyDev 創(chuàng)建項目
Xcode 的monkeyDev 插件自行百度安裝
你可能要疑惑,我新建的hook項目 和我砸殼的怎么關(guān)聯(lián)呢纹笼?我們帶著疑惑慢慢看纹份。
1、新建
2、將剛才 Class-dump 的頭文件headers 也拖進(jìn)項目蔓涧,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的呢<础!鸠姨!
先截個圖看看:
我們來分析一下:
CHDeclareClass(UIViewControllerWrapperView);
括號里面是你要hook的對象 UIViewControllerWrapperView 這個類是我砸殼的app里面的一個類
CHOptimizedMethod(1, self, void, UIViewControllerWrapperView, btnClick,id,arg1)
括號里面是你要在UIViewControllerWrapperView 這個類 hook的方法 (btnClick 是方法名)铜秆,參數(shù)是id? !O砘场羽峰!?
我是怎么找到的呢趟咆?添瓷??值纱?
1鳞贷、還記得我給你們提到的工具Reveal和FLEXLoader 嗎?虐唠?搀愧?UIViewControllerWrapperView 類 (你要找的類)可以在界面層級看到。
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、寫完運行 得到一個dylib動態(tài)庫
我們?nèi)タ纯次覀兊某晒?/i>
6处铛、項目怎么注入動態(tài)庫呢饲趋?百度一搜,網(wǎng)上資料都是一堆命令行腳本撤蟆!麻煩奕塑?是的,非常麻煩家肯!
這時候就用到 yololib 了龄砰,GitHub 自行下載
yololib不需要安裝,網(wǎng)上一堆講解讨衣,我不想說有多好寝贡,反正我看著就頭疼扒披。
我的方法很粗暴,我們直接拿它用
粗暴的方法:把dylib動態(tài)庫圃泡。 yololib? 都拷貝到碟案。XFExpressCameraDemo.decrypted(砸殼得到的那個文件)位置:
這樣就可以粗暴的使用yololib 命令了
使用yololib簡單的執(zhí)行下面一句就可以成功完成注入。
注意:我們先cd到之前保存的XFExpressCameraDemo.decrypted位置颇蜡,即已砸完殼的可執(zhí)行文件位置价说。
./yololib 目標(biāo)可執(zhí)行文件 需注入的dylib? (空格隔開)
( 目標(biāo)可執(zhí)行文件:因為我已經(jīng)cd到目標(biāo)位置,直接使用名字即可)
成功效果:
7风秤、最后我們重新簽名
你可以百度到網(wǎng)上一堆使用腳本重新簽名的方法鳖目,這些都太繁瑣太繁瑣。逆向難缤弦,很多原因是因為繁瑣领迈,沒有一篇合適的文章或者教程入門“澹可是看我的文章你是不是覺得也不是太難啊狸捅,沒錯,就是so easy! 不廢話了累提,我們繼續(xù)最后一個環(huán)節(jié) 重新簽名ipa尘喝!
使用工具iResign (百度自行下載,或者去github找)
1斋陪、ipa 路徑
2朽褪、embedded.mobileprovision路徑 :這就是配置文件(iOS開發(fā)打包的pp文件)
iOS開發(fā)都知道无虚,這個里面有你的開發(fā)者證書信息缔赠,bundleID,團(tuán)隊友题,有效期嗤堰,設(shè)備ID等等(線上的話是生產(chǎn)證書)
3、entitlements.plist的路徑:這個需要你自己用Xcode建:
(網(wǎng)上一堆資料用腳本就是搞這個的咆爽,我們粗暴點梁棠,自己用plist建,還不會出錯6饭 )
(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證書里面是什么和它一一對應(yīng)即可
5建瘫、選擇對應(yīng)的開發(fā)者團(tuán)隊(iOS程序員都會,不多說了)
重新簽名即可得到你hook后的app啦J邸拧!实夹!
運行效果(下次有時間再補(bǔ)圖)
(完結(jié))
(完結(jié))
(完結(jié))
(完結(jié))
(完結(jié))
(完結(jié))
有人疑惑了橄浓,你讓我安裝的IDA 也沒用到啊A梁健]┦怠!是的缴淋,入門級的教程是上面的准给,下面番外篇才是進(jìn)階。