iOS逆向?qū)W習(xí)【1~32】
【chechra1n孤荣、Cydia甸陌、sshopen、vim盐股、Cycript钱豁、adv-cmds、afc2】
《第一課疯汁、課程簡(jiǎn)介》1牲尺、學(xué)習(xí)越獄對(duì)工作有哪些好處
《第二課、學(xué)習(xí)條件》1幌蚊、完美越獄http://jailbreak.25pp.com/ios2谤碳、建議至少iPhone?5S(5S開(kāi)始支持arm64架構(gòu))
《第三課、越獄的優(yōu)點(diǎn)和缺點(diǎn)》·優(yōu)點(diǎn)1溢豆、Jailbreak利用iOS漏洞估蹄,獲取iOS最高權(quán)限2、可安裝很多插件沫换、主題、App3最铁、修改系統(tǒng)App的一些默認(rèn)行為4讯赏、自由安裝非App?store來(lái)源App5、付費(fèi)變免費(fèi)1129484756冷尉、靈活管理文件系統(tǒng)7漱挎、給開(kāi)發(fā)者提供了逆向工程的環(huán)境·缺點(diǎn)1、不予保修2雀哨、費(fèi)電3磕谅、iOS固件出來(lái)不能及時(shí)更新每個(gè)新版本都會(huì)修復(fù)上個(gè)版本的漏洞需要等新的版本支持越獄才能更新4私爷、不再受iOS安全保護(hù),容易受攻擊膊夹,不要亂裝東西5衬浑、如果安裝了不穩(wěn)定插件,容易出現(xiàn)不穩(wěn)定放刨、變慢工秩,甚至白蘋(píng)果
《第四課、完美越獄和不完美越獄》1进统、完美:越獄之后可以正常開(kāi)關(guān)機(jī)2助币、不完美:一旦關(guān)機(jī)后再開(kāi)機(jī),出現(xiàn)白蘋(píng)果螟碎;開(kāi)機(jī)后已安裝的破解軟件無(wú)法正常使用眉菱,需要將設(shè)備與PC連接,使用軟件引導(dǎo)才能使用3掉分、不完美先發(fā)布俭缓,完美才發(fā)布4、越獄方法推薦a叉抡、PP助手b尔崔、愛(ài)思助手5、判斷越獄成功a褥民、桌面是否有Cydiab季春、PP助手顯示已越獄
《第五課、Cydia》1消返、可認(rèn)為是越獄后的App?store2载弄、作者:Jay?Freeman(saurik)3、安裝軟件步驟:a撵颊、添加軟件源b宇攻、進(jìn)入軟件源找到軟件,開(kāi)始安裝c倡勇、搜索會(huì)在已添加的軟件源里搜索4逞刷、重啟SpringBoard(iOS桌面)
《第六課、必備軟件安裝》1妻熊、Apple?File?Conduit?“2”在Mac上可訪問(wèn)整個(gè)iOS設(shè)備文件系統(tǒng)Mac?iPhone?Box2夸浅、AppSync?Unified可以繞過(guò)系統(tǒng)驗(yàn)證,隨意安裝扔役、運(yùn)行破解的ipa安裝包3帆喇、iFile在iPhone上可訪問(wèn)整個(gè)iOS文件系統(tǒng)4、PP助手自由安裝App5亿胸、Cydia安裝包是deb格式(插件)坯钦,結(jié)合軟件包管理工具apt6预皇、PP助手安裝的是IPA格式(應(yīng)用)7、安裝失敗先在網(wǎng)上下載deb(搜索ifile?deb)婉刀,然后將deb拖到/var/root/Media/Cydia/AutoInstall吟温,重啟手機(jī),會(huì)自動(dòng)安裝8路星、【iPhone安裝afc2插件溯街,電腦安裝愛(ài)思助手,就可以訪問(wèn)所有文件了】
《第七課洋丐、怎么判斷設(shè)備是否已經(jīng)越獄》1呈昔、使用代碼,判斷設(shè)備是否已經(jīng)安裝Cydia??????搜索iOS代碼判斷越獄??????if?([[NSFileManager?default]?fileExistsAtPath:@"/Applications/Cydia.app"])
《第八課友绝、提高工作效率的工具》1堤尾、Alfred:便捷搜索、工作流【good】?????自定義快捷鍵打開(kāi)指定App2迁客、XtraFinder:增強(qiáng)型Finder【shit】3郭宝、iTerm2:完爆Terminal的命令行工具4、Go2Shell:從Finder快速定位到命令行工具?????點(diǎn)擊Finder的笑臉掷漱,直接進(jìn)入終端對(duì)應(yīng)位置【good】
《第九課粘室、SSH01-簡(jiǎn)介》1、Mac遠(yuǎn)程登錄到iPhone卜范,使用命令行操作iPhone衔统、Mac與iPhone建立遠(yuǎn)程連接2、SSH?????Secure?Shell?安全外殼協(xié)議?可以為遠(yuǎn)程登陸提供安全保障的協(xié)議?????SSH可以把所有傳輸?shù)臄?shù)據(jù)進(jìn)行加密海雪,“中間人”攻擊方式不可能實(shí)現(xiàn)锦爵,防止DNS欺騙和ID欺騙3、OpenSSH?????SSH協(xié)議的免費(fèi)開(kāi)源實(shí)現(xiàn)?????可以通過(guò)OpenSSH的方式讓Mac遠(yuǎn)程登錄到iPhone
《第十課奥裸、SSH02-Mac遠(yuǎn)程登錄到IP》1险掀、在iPhone上通過(guò)Cydia安裝OpenSSH工具2、SSH是通過(guò)TCP協(xié)議通信湾宙,要確保Mac和iPhone在同一局域網(wǎng)樟氢,比如鏈接同一個(gè)WiFi3、在Mac終端輸入?ssh?賬戶名@域名主機(jī)地址????【ssh?root@10.1.1.192】【yes】【默認(rèn)密碼alpine】【cd?/】【ls?-l】4侠鳄、登陸成功后埠啃,就可以使用終端命令操作iPhone5、退出命令exit
《第十一課畦攘、SSH03-root、mobile》1十电、iOS下兩個(gè)常用賬戶:?????root:最高權(quán)限賬戶?/var/root【#】?????mobile:普通權(quán)限賬戶知押,只能操作一些普通文件叹螟,不能操作系統(tǒng)級(jí)別文件?/var/mobile?【$】2、修改賬戶密碼?????登錄root賬戶之后?passwd台盯、passwd?mobile
《第十二課罢绽、SSL和SSH》?????SSL:Secure?Sockets?Layer?是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議,再傳輸層對(duì)網(wǎng)絡(luò)鏈接進(jìn)行加密?????OpenSSL:SSL的開(kāi)源實(shí)現(xiàn)静盅,絕大數(shù)HTTPS請(qǐng)求等價(jià)于:HTTP+OpenSSL良价,OpenSSH的加密就是通過(guò)OpenSSL完成的
《第十三課、SSH05-安全連接》1蒿叠、SSH版本:SSH-1明垢、SSH-22、SSH-2使用較多市咽,客戶端和服務(wù)器版本要一致才能通信3痊银、查看SSH版本(查看配置文件的Protocol字段)
?????客戶端ssh_config?????服務(wù)端sshd_config4、SSH通信過(guò)程三大主要階段?????a施绎、建立安全連接:服務(wù)器提供身份證明溯革、公鑰私鑰?????b、客戶端驗(yàn)證?????c谷醉、數(shù)據(jù)傳輸
《第十四課致稀、服務(wù)器公鑰的保存和更變》1、修改公鑰信息?~/.ssh/known_hosts?????vim?known_hosts?????找到對(duì)應(yīng)的公鑰俱尼,刪除抖单,保存退出,重新登錄2号显、ssh-keygem?-R?10.1.1.193?????即可刪除服務(wù)器公鑰信息
《第十五課臭猜、SSH-07客戶端認(rèn)證》1、基于賬號(hào)密碼的認(rèn)證2押蚤、基于密鑰的認(rèn)證(默認(rèn)方式)3蔑歌、客戶端生成公鑰私鑰,將公鑰內(nèi)容追加到服務(wù)器的授權(quán)文件尾部揽碘,然后登陸驗(yàn)證(cat?~/.ssh/authorized_keys)4次屠、【ssh-keygen】【回車(chē)回車(chē)回車(chē)】生成id_rsa、id_rsa.pub5雳刺、【ssh-copy-id?root@10.1.1.193】會(huì)自動(dòng)操作行不通劫灶,換成【ssh-copy-id ~/id_rsa.pub?root@192.168.1.102】即可6、【ssh?root@10.1.1.193】回車(chē)后不用輸密碼會(huì)自動(dòng)登錄(注意只是root生效掖桦,如果mobile也要生效本昏,同理)
《第十六課、SSH-08遠(yuǎn)程拷貝-文件權(quán)限》1枪汪、scp是基于SSH登陸進(jìn)行安全的遠(yuǎn)程文件拷貝命令涌穆,可將一個(gè)文件拷貝到遠(yuǎn)程另一臺(tái)主機(jī)上【scp ~/.ssh/id_rsa.pub?root@10.1.1.193:~/.ssh】【登錄服務(wù)器怔昨,進(jìn)入~/.ssh】【cat id_rsa.pub >> authorized_keys】【重新登錄試試】2、給文件或文件夾配置權(quán)限【chmod 755 ~】【chmod 755 ~/.ssh】【chmod 644 ~/.ssh/authorized_keys】
《第十七課宿稀、SSH-09端口》1趁舀、端口【0~65535 2^16】2、21端口:提供FTP服務(wù)3祝沸、80端口:HTTP服務(wù)4矮烹、22端口:SSH服務(wù)(/etc/ssh/sshd_config的Port字段)(TCP協(xié)議)
《第十八課、SSH-10 USB連接》1罩锐、速度會(huì)更快2奉狈、usbmuxd (默認(rèn)開(kāi)機(jī)自動(dòng)開(kāi)啟)可以將Mac數(shù)據(jù)通過(guò)USB傳給iPhone3、Mac先ssh登錄到自己的本地端口10010唯欣,(非預(yù)留端口即可)再使用usbmuxd進(jìn)行端口數(shù)據(jù)傳輸10010->22
《第十九課嘹吨、SSH-11 usbmuxd01使用》1、下載usbmuxd境氢,只留下python的腳本tcprelay.py2蟀拷、將iPhone的22端口映射到Mac本地的10010端口【python tcprelay.py 22:10010】(卡住即代表OK,可另起一個(gè)終端操作其他)(-t 可支持多個(gè))3萍聊、Mac登錄本地10010端口【ssh root@localhost -p 10010】(127.0.0.1 虛擬網(wǎng)卡ip地址)
《第二十課问芬、SSH-12 usbmuxd01總結(jié)》1、拷貝數(shù)據(jù)【scp ~/.ssh/id_rsa.pub root@localhost:~ -P 10010】
《第二十一課寿桨、SSH-13 sh腳本》1此衅、將經(jīng)常使用的命令行放到shell腳本2、執(zhí)行腳本【sh usb.sh】【bash usb.sh】shell會(huì)啟動(dòng)一個(gè)子進(jìn)程來(lái)執(zhí)行亭螟,完成后回到父進(jìn)程環(huán)境【source usb.sh】(可以用 . 來(lái)表示)在當(dāng)前進(jìn)程執(zhí)行shell
《第二十二課挡鞍、SSH-14 iPhone終端中文輸入》1、iPhone默認(rèn)不支持中文2预烙、直接新建一個(gè)文件~/.inputrc不再將中文轉(zhuǎn)義序列【set convert-meta off】允許終端輸出中文【set output-meta on】允許終端輸入中文【set meta-flag on】【set input-meta on】3墨微、默認(rèn)iPhone是沒(méi)有安裝vim的,需要使用Cydia安裝vim
《第二十三課扁掸、Cycipt-01 基本使用》1翘县、Object-C++、EX6(JavScript)谴分、Java等語(yǔ)法的混合物2锈麸、可以用來(lái)探索、修改牺蹄、調(diào)試正在運(yùn)行的Mac/iOS App3忘伞、使用Cydia安裝Cycript(安裝失敗的話,重裝new curses再試,即可)4氓奈、開(kāi)啟和關(guān)閉【cycript -p 進(jìn)程ID】匿刮、【cycript -p 進(jìn)程名稱(chēng)】進(jìn)入【ctrl + D】退出【ctrl + C】取消輸入5、ps命令(process status)使用Cydia安裝adv-cmds【ps -A】查看所有進(jìn)程【ps -A | grep 關(guān)鍵詞】關(guān)鍵詞搜索6探颈、常用cycript語(yǔ)法(等價(jià)于)UIApp [UIApplication sharedApplication]7、定義變量var app = UIApp.keyWindowsvar redView = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)] // 報(bào)錯(cuò)8训措、用內(nèi)存地址獲取對(duì)象【#內(nèi)存地址】
《第二十四課伪节、Cycipt-02 常用語(yǔ)法》1、【ObjectiveC.classes】查看當(dāng)前App使用到的所有類(lèi)2绩鸣、【*對(duì)象】查看對(duì)象的所有成員對(duì)象3怀大、【UIApp.keyWindow.recursiveDescription().toString()】遞歸打印view的子控件(跟LLDB一樣,控制臺(tái))4呀闻、【choose(類(lèi)名)】篩選出類(lèi)名相關(guān)的對(duì)象
《第二十五課化借、Cycipt-03 定位登錄方法》1、基于Cycript封裝的工具庫(kù)MJTool.js【scp -P 10010 ~/MJTool.js root@localhost:/usr/lib/cycript0.9/MJTool.cy】2捡多、進(jìn)入cy環(huán)境后蓖康,導(dǎo)入庫(kù)【@import MJTool】3、使用案例【MJTopVc()】 獲取最前面的控制器【MJInstanceMethodName(對(duì)象)】打印出某個(gè)對(duì)象的所有對(duì)象方法名【MJInstanceMethodName(對(duì)象, /login/)】篩選出帶login的方法名【MJClassMethodName(對(duì)象)】打印出某個(gè)對(duì)象的所有類(lèi)方法名
《第二十六課垒手、Cycipt-04 定位文本輸入框》1蒜焊、【MJSubview(視圖對(duì)象)】遞歸打印該視圖的所有子視圖2、cycript環(huán)境下的漢字都以u(píng)nicode形式顯示科贬,可以利用python得到漢字的unicode【python】終端輸入即可進(jìn)入python環(huán)境【unicode('登錄', 'UTF-8')】獲取“登錄”的unicode值
《第二十七課泳梆、Cycipt-05 小結(jié)》1、去廣告so esay
《第二十八課榜掌、Cycipt-06 封裝cy頭文件》1优妙、新建文件tool.cy,使用編輯器編輯【(funtion(exports) {
// 在這里編寫(xiě)內(nèi)容(注意寫(xiě)法)export.sum = funtion(a,b) {return a+b;};
})(exports);】2憎账、將tool.cy拷貝到iPhone【scp -P 10010 ~/tool.cy root@localhost:/usr/lib/cycripy0.9】3套硼、在cycript環(huán)境中使用tool.cy(需要重啟App)【@import tool】導(dǎo)入【tool.sum(1,2)】4、exports參數(shù)名固定鼠哥,用于向外提供接口
《第二十九課熟菲、Cycipt-07 exports》1、簡(jiǎn)化【kAppId = exports.appid = [NSBundle mainBundle].bundleIdentifier;】可直接使用kAppId2朴恳、tool.cy文件里的內(nèi)容只會(huì)執(zhí)行一遍抄罕,對(duì)于某些可變的屬性,盡量不要在此處定義于颖,可以使用方法的形式// RootVCkRootVC = exports.RootVC = function() {return UIApp.keyWindow.rootViewController;};3呆贿、屬性的調(diào)用直接寫(xiě)就好,但是方法的調(diào)用,尾部記得加()【kRootVC】錯(cuò)誤【kRootVC()】正確4做入、沙盒路徑
《第三十課冒晰、Cycipt-08 全局函數(shù)》1、直接賦值竟块,即為全局的【kRootVC = function() {return UIApp.keyWindow.rootViewController;};】2壶运、為了避免與其他作者的庫(kù)沖突,可以使用多層文件夾的形式存放我們的cy庫(kù)文件【/usr/lib/cycript0.9/com/cyc666/CTool.cy】3浪秘、導(dǎo)入庫(kù)【@import com.cyc666.CTool】4蒋情、使用【CTool.appid】5、還是放在cycript0.9目錄吧耸携,比較方便
《第三十一課棵癣、Cycipt-09 Cycript庫(kù)》1、https://github.com/CoderMJLee/mjcript2夺衍、【MJLoabFrameWork("庫(kù)名")】將非UIKit庫(kù)加載到內(nèi)存里3狈谊、cmd+R,清空cycript終端信息4沟沙、【MJChildVcs(控制器對(duì)象)】查看控制器的結(jié)構(gòu)5河劝、【MJSubclasses("對(duì)象類(lèi)名")】查看類(lèi)的所有子類(lèi)
《第三十二課、Cycipt-10 微信練習(xí)》1矛紫、修改金額
哈哈
iOS逆向?qū)W習(xí)【33~60】
【chechra1n丧裁、Cydia、sshopen含衔、vim煎娇、Cycript、adv-cmds贪染、afc2】【Reveal缓呛、class-dump、Hopper杭隙、Clutch哟绊、dumpdecrypted】
《33、Reveal》1痰憎、Mac快夠快速調(diào)試正在運(yùn)行App的UI2票髓、Mac下載:https://revealapp.com/download/4版本起才支持USB調(diào)試3、iPhone通過(guò)Cydia安裝Reveal Loader源:http://apt.so/codermjlee4铣耘、重啟桌面:【killall SpringBoard】5洽沟、重啟手機(jī):【reboot】6、找到Mac的Reveal中的RevealServer文件蜗细,Reveal-help-show Reveal Librery - iOS Library7裆操、覆蓋iPhone中/Library/RHRevealLoader/RevealSServer文件(一般沒(méi)有這個(gè)目錄怒详,自己創(chuàng)建)8、手機(jī)設(shè)置-Reveal-Enabled Applications-打開(kāi)想要調(diào)試的APP9踪区、【killall SpringBoard】重啟桌面【reboot】或者重啟手機(jī)(可能需要重新越獄)10昆烁、如果上面的方法行不通,可參考http://www.reibang.com/p/6cac1052879da缎岗、Mac 安裝Reveal ,成功之后打開(kāi)下圖對(duì)應(yīng)的文件夾静尼,點(diǎn)擊 RevealServer.framework ,把 RevealServer.framework 目錄下的 RevealServer 改名為 libReveal.dylib 拷貝到手機(jī)上的 /Library/RHRevealLoader(一般沒(méi)有這個(gè)目錄传泊,自己創(chuàng)建:我是這樣創(chuàng)建的在Mac創(chuàng)建RHRevealLoader茅郎,把libReveal.dylib加到其中,然后整個(gè)RHRevealLoader文件夾copy到iOS 手機(jī)上的 /Library 目錄下) 目錄中即可或渤。b、把電腦上的RevealServer.framework 拷貝到手機(jī)上的/System/Library/Frameworks 目錄下
《34奕扣、ipa的安裝》1薪鹦、【項(xiàng)目編譯、鏈接惯豆、簽名】 -> app(Mach-O可執(zhí)行文件池磁、資源文件) ->?【zip壓縮】-> IPA2、所有代碼都在Mach-O文件里
《35楷兽、逆向App的思路》1地熄、界面分析:Cycript、Reveal2芯杀、代碼分析:對(duì)Mach-O文件的靜態(tài)分析端考,MachOView、class-dump揭厚、Hopper Disassembler却特、ida等3、動(dòng)態(tài)調(diào)試:對(duì)運(yùn)行中的APP進(jìn)行代碼調(diào)試筛圆,debugserver裂明、LLDB4、代碼編寫(xiě):注入代碼到App太援,重簽名闽晦,打包ipa
《36、class-dump01 基本使用》1提岔、作用:把Mach-O文件的class信息導(dǎo)出來(lái)仙蛉,生成.h頭文件2、官方地址:http://stevenygard.com/projects/class-dump/(官網(wǎng)下載的不支持混編)第三方:https://github.com/AloneMonkey/MonkeyDev/blob/master/bin/class-dump(需要修改權(quán)限)3碱蒙、將class-dump文件移動(dòng)到:/usr/local/bin捅儒,這樣終端就能識(shí)別4、使用方法【class-dump -H Mach-O文件路徑 -o 頭文件存放目錄】
《37、class-dump 細(xì)節(jié)》1巧还、可用subline鞭莽、Xcode等工具去查閱頭文件
《38、代碼編譯的過(guò)程》1麸祷、OC語(yǔ)言 -> 【編譯(不可逆)】 -> 匯編預(yù)語(yǔ)言 -> 【編譯(可逆澎怒,反編譯)】-> Mach-O文件(16進(jìn)制的機(jī)器語(yǔ)言)2、在同一種架構(gòu)平臺(tái)下阶牍,每一條匯編指令都有與之對(duì)應(yīng)的唯一機(jī)器指令3喷面、讓斷點(diǎn)進(jìn)入到匯編代碼【Xcode - Debug - Debug Workflow - Always ShowDisassembly】4、不同的OC代碼走孽,編譯出來(lái)的匯編代碼可能是一樣的
《39惧辈、Hopper01 使用》1、匯編不能反編譯出源代碼磕瓷,但是可以使用反編譯出個(gè)大概2盒齿、作用:將Mach-O文件的機(jī)器代碼反編譯出匯編代碼、OC代碼或swift代碼(偽代碼)
《40困食、Hopper02 UIKit偽代碼分析》1边翁、查找UIKit框架生成的Macoh-O文件【a、在Mac查找xcode系統(tǒng)庫(kù)的位置查找】【b硕盹、cycript使用MJLookFramework('UIKit')】
《41符匾、遺留問(wèn)題解決》1、【./itnl --iport 22 lport 10010】另一個(gè)連接端口的工具2瘩例、鏈接動(dòng)態(tài)庫(kù)【MJLoadFramework("Photos")】【var asset = [[PHAssets alloc] init]】3啊胶、遇到問(wèn)題a、認(rèn)真看視頻垛贤、PPTb创淡、嘗試幾次,搜索c南吮、群里交流d琳彩、私信交流
《42、dec01 簡(jiǎn)介》1部凑、動(dòng)態(tài)庫(kù)共享緩存(dyld shared cache)露乏,節(jié)省內(nèi)存/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX2、X代表ARM處理器指令集涂邀,向下兼容armv6瘟仿、armv7、armv7s比勉、armv643劳较、ida驹止、Hopper可以識(shí)別
《43、dec02 優(yōu)點(diǎn)》1观蜗、共享緩存
《44臊恋、dec03 dyld》1承耿、App運(yùn)行中加載動(dòng)態(tài)庫(kù)滩愁,使用了/usr/lib/dyld程序來(lái)加載動(dòng)態(tài)庫(kù)2、dynamic link editor 動(dòng)態(tài)鏈接編輯器3咏窿、dyld源碼https://opensource.apple.com/tarballs/dyld/
《45砖第、dec04 dec_extractor》1撤卢、編譯dec_extractor.cpp文件【clang++ -o dec_extractor dec_extractor.cpp】2、使用dec_ectractor從共享緩存中抽取動(dòng)態(tài)庫(kù)文件【./dec_extractor dyld_shares_cache_armv7s armv7s】
《46梧兼、Mach-object01 文件類(lèi)型》1放吩、Mach-O是Mach object的縮寫(xiě),是Mac/iOS上用于儲(chǔ)存程序羽杰、庫(kù)的標(biāo)準(zhǔn)格式2渡紫、Mac系統(tǒng)內(nèi)核xnu源碼,可以查看到Mach-O格式的定義https://opensource.apple.com.tarballs/xnu/3忽洛、常見(jiàn)Mach-O文件類(lèi)型a、MH_OBJECT:編譯完成的目標(biāo)文件.o环肘,靜態(tài)庫(kù)文件.ab欲虚、MH_EXECUTE:可執(zhí)行文件c、MH_DYLIB:動(dòng)態(tài)庫(kù)文件.dylib悔雹,.framework/xxd复哆、MH_DYLINKER:動(dòng)態(tài)鏈接編輯器/usr/lib/dylde、MH_DSYM:存儲(chǔ)二進(jìn)制文件符號(hào)信息的文件.dSYM/Contents/Resources/dwarf/xx(常用語(yǔ)分析App的崩潰信息)4腌零、查看文件類(lèi)型【file test.o】5梯找、查找文件【find . -name "*.a"】
《47、Mach-object03 Universal Binary》1益涧、Universal Binary 通用二進(jìn)制文件2锈锤、Fat Binary 胖二進(jìn)制文件3、【lipo -info Test】查看二進(jìn)制文件信息4闲询、【lipo Test -thin armv7 -output Test_armv7】瘦身久免,抽取出只有armv75、【lipo -create Test_arm64 Test_armv7 -output Test2】合并兩種架構(gòu)
《48扭弧、Mach-O的基本結(jié)構(gòu)01》1阎姥、Header 文件類(lèi)型、目標(biāo)架構(gòu)類(lèi)型等2鸽捻、Load commands 描述文件在虛擬內(nèi)存中的邏輯結(jié)構(gòu)呼巴、布局3泽腮、Ram segment data 原始數(shù)據(jù)
《50、Mach-O object05基本結(jié)構(gòu)02》1衣赶、otool 使用命令行模式查看Mach-O文件信息
《51诊赊、Mach-O object06 基本結(jié)構(gòu)03》1、MachOView 可視化的顯示Mach-O文件????https://github.com/gdbinit/MachOView2屑埋、下載后打開(kāi)Xcode工程豪筝,修改SDK版本,運(yùn)行3摘能、open打開(kāi)Mach-O文件
《52续崖、Mach-O object07 基本結(jié)構(gòu)04》1、使用Mach-OView查看Mach-O文件是最好的
《53团搞、Mach-O object08 dyld和Mach-O的關(guān)系》1严望、dyld用于加載以下類(lèi)型的Mach-O文件????MH_EXECUTE、MH_DYLIB逻恐、MH_BUNDLE2像吻、App的可執(zhí)行文件和動(dòng)態(tài)庫(kù)都是由dyld加載的
《54、疑難解答》1复隆、
《55拨匆、初識(shí)加殼》1、可以使用ps -A 查看應(yīng)用可執(zhí)行文件的路徑2挽拂、App Store會(huì)對(duì)可執(zhí)行文件進(jìn)行加殼操作3惭每、加殼之后的可執(zhí)行文件是解釋不了的,class-dump亏栈、Hopper無(wú)法操作4台腥、PP助手下載的ipa都是已經(jīng)解密過(guò)了
《56、加殼原理》1绒北、利用特殊的算法黎侈,對(duì)可執(zhí)行文件進(jìn)行改變(壓縮、加密)闷游,以達(dá)到保護(hù)程序的代碼的目的2峻汉、加殼前:可執(zhí)行文件---【執(zhí)行】---內(nèi)存(可執(zhí)行文件)3、加殼后:殼程序(可執(zhí)行文件(已加密))---【執(zhí)行】---內(nèi)存(殼程序(可執(zhí)行文件(已加密)))---【解密】---內(nèi)存(殼程序(可執(zhí)行文件))
《57脐往、脫殼》1俱济、將未加密的可執(zhí)行文件還原出來(lái)(也叫“砸殼”)2、兩種脫殼方法:硬脫殼:將硬盤(pán)上的可執(zhí)行文件钙勃,執(zhí)行解密算法動(dòng)態(tài)脫殼:將運(yùn)行在內(nèi)存中的解密的可執(zhí)行文件蛛碌,從內(nèi)存中導(dǎo)出到硬盤(pán)上3、iOS中采取硬脫殼的方式a辖源、Clutch:https://github.com/KJCracks/Clutchb蔚携、dumpdecrypted:https://github.com/stefanesser/dumpdecrypted/
《58希太、LC_ENCYPTION_INFO》1、使用Mach-O打開(kāi)可執(zhí)行文件酝蜒,查看Load commands中的LC_ENCYPTION_INFO誊辉,Crypt_ID 表示加密方式,非0則加過(guò)密2亡脑、【otool -l xxx | grep crypt】 查看可執(zhí)行文件的加密方式
《59堕澄、脫殼工具 01 Clutch》1、下載Clutch之后霉咨,傳到手機(jī)上去【/usr/bin/Clutch】2蛙紫、如果權(quán)限不足,可修改權(quán)限【chmod +x /usr/bin/Clutch】3途戒、【Clutch -i】羅列出所有被加殼的app4坑傅、【Clutch -d 序號(hào)/ID】將某個(gè)加密的App解密,并生成ipa喷斋,導(dǎo)出到文件夾【/private/var/mobile/Documents/....ipa】/private是引用替身的意思
《60唁毒、脫殼工具 02 dumpdecrypted》1、將源代碼編譯成動(dòng)態(tài)庫(kù)2星爪、執(zhí)行Makefile浆西,需要在當(dāng)前文件夾3、將動(dòng)態(tài)庫(kù)文件dylib顽腾,拷貝到iPhone?【/var/root】4近零、終端進(jìn)入dylib文件夾5、使用環(huán)境變量DYLD_INSERT_LIBRARIES將dylib注入到需要脫殼的可執(zhí)行文件【DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib ipa路徑】可用【ps -A】找到ipa可執(zhí)行文件的路徑6崔泵、會(huì)生成.decrypted文件秒赤,這個(gè)是脫殼成功后的文件猪瞬≡魅常可以將后綴名去掉,是可執(zhí)行文件7陈瘦、砸殼報(bào)錯(cuò)dyld: warning: could not load inserted library 'dumpdecrypted.dylib' into hardened process because no suitable image found.解決方案:使用命令【ldid -S dumpdecrypted.dylib】進(jìn)行簽名幌甘,再執(zhí)行砸殼命令
哈哈
iOS逆向?qū)W習(xí)【61~】
【Reveal、ldid痊项、Theos】
《61锅风、喜馬拉雅FM逆向?qū)崙?zhàn)01?明確需求》1、hook?修改方法實(shí)現(xiàn)2鞍泉、theos
《62皱埠、Theos?安裝》1、下載地址?https://github.com/theos.git2咖驮、編寫(xiě)代碼?=>?deb安裝包/插件?=>?裝到手機(jī)上3边器、安裝簽名工具ldid【brew?install?ldid】4训枢、下載Theos,最好是git?clone忘巧,?建議安裝到~/theos【git?clone?--recursive?https://github.com/theos.git~/theos】遞歸下載恒界,所有依賴(lài)都下載5、修改環(huán)境配置【vim?.bash_profile】export?THEOS=~/theos6砚嘴、之后就可以使用下面的方式【git?clone?--recursive?https://github.com/theos.git$THEOS】
《63十酣、Theos?配置PATH》1、將~/theos/bin添加到PATH【vim?.bash_profile】export?PATH=$THEOS/bin:$PATH????:添加以前的路徑2际长、打印環(huán)境變量【echo?$PATH】3耸采、生效【source?.bash_profile】
《64、source?命令》1也颤、使環(huán)境變量生效【source?.bash_profile】
《65洋幻、tweak?代碼編寫(xiě)》1、創(chuàng)建項(xiàng)目【nic.pl】????【11】iphone/tweak????【名稱(chēng)】????【包名】????【需要hook的ipa的包名(使用CCAppId獲瘸崛ⅰ)】注意:工程id不能與對(duì)象ipa的id一致2文留、使用subline打開(kāi)工程3、修改Makefile文件????【export?THEOS_DEVICE_IP=127.0.0.1】【export?THEOS_DEVICE_PORT=10010】4竭沫、編寫(xiě)Tweak.xm文件修改類(lèi)名重寫(xiě)需要修改的方法5燥翅、進(jìn)入項(xiàng)目目錄【make】【make?package】生成deb插件【make?install】安裝deb插件6、重新運(yùn)行App蜕提,即可看到效果7森书、make?package如果error,可參考https://www.cnblogs.com/ZhangShengjie/p/10705854.html修改打包方式為zgip8谎势、插件卸載凛膏,刪除對(duì)應(yīng)的.dylib和.plist/Library/MobileSubstrate/DynamicLibrarys
《66、總結(jié)步驟》1脏榆、安裝簽名工具ldid2猖毫、修改環(huán)境變量3、下載theos4须喂、新建項(xiàng)目5吁断、配置項(xiàng)目6、編寫(xiě)代碼7坞生、make?8仔役、make?package9、make?install
《67是己、課程安排》1又兵、
《68、Tweak練習(xí)?SpringBoard01?分析》1卒废、桌面是哪個(gè)應(yīng)用沛厨?SpringBoard2乘盼、找到SpringBoard對(duì)應(yīng)的安裝目錄,找到可執(zhí)行文件俄烁,查看是否加殼绸栅,無(wú)加密3、使用Reveal并不能顯示SpringBoard页屠。使用cycript4粹胯、憑經(jīng)驗(yàn)找到紅點(diǎn)view
《69、SpringBoard?02》1辰企、可以將這兩個(gè)配置到當(dāng)前用戶的配置文件中~/.bash_profile【export?THEOS_DEVICE_IP=127.0.0.1】??【export?THEOS_DEVICE_PORT=10010】??2风纠、可將指令拼接在一起,執(zhí)行完第一個(gè)才執(zhí)行第二個(gè)牢贸,錯(cuò)1就斷?make?&&?make?package?&&?make?install3竹观、可將make指令寫(xiě)到腳本中執(zhí)行添加make?clean?&&
《71、微信練習(xí)?Tweak?常量》1潜索、%orig?表示實(shí)現(xiàn)本來(lái)的方法臭增,類(lèi)似于super,不建議帶參數(shù)2竹习、[self?numberOfSection:section]3誊抛、id類(lèi)型盡量使用方法的方式調(diào)用
《72、返回cell》1整陌、不記得的方法拗窃,可以使用Xcode,然后拷貝
《73泌辫、頁(yè)面調(diào)整和退出》1随夸、exit(0);會(huì)卡頓一下再退出2震放、abort()宾毒;立即退出
《74、數(shù)據(jù)存儲(chǔ)》1澜搅、支持宏定義2伍俘、NSUserDefault3邪锌、可以使用Xcode查看設(shè)備信息和終端輸出信息4勉躺、%hook?-?%end?之間的方法默認(rèn)是復(fù)寫(xiě)原對(duì)象里面的方法,如果需要使用新的方法觅丰,可以在方法的上一行使用%new修飾5饵溅、為了防止與對(duì)象原來(lái)的方法重復(fù),可以添加前綴
《75妇萄、加載圖片資源》1蜕企、imageName?在main?bundle查找圖片資源2咬荷、contentOfFile?需要指定全路徑3、theos規(guī)定轻掩,加載圖片需要在項(xiàng)目中添加layout文件夾幸乒,然后圖片放到layout中,才會(huì)跟隨插件打包唇牧。layout相當(dāng)于手機(jī)根目錄4罕扎、建議:??????a、layout添加文件夾/preferenceLoader/preference??????b丐重、為了避免重名腔召,再新建一個(gè)項(xiàng)目名稱(chēng)的文件夾5、圖片最終的訪問(wèn)/Library/preferenceLoader/preference/MJWeChat/haha.png
《76扮惦、宏定義資源路徑》1臀蛛、#define?MJFile(path)?@"Library/preferenceLoader/preference/MJWeChat/"?#path#jjj.png會(huì)自動(dòng)轉(zhuǎn)成"jjj.png"
《77、Tweak原理?01》1崖蜜、make?編譯生成dylib動(dòng)態(tài)庫(kù)2浊仆、make?package?打包生成deb安裝包/插件3、make?install?遠(yuǎn)程登錄手機(jī)豫领,將deb傳給手機(jī)氧卧,cydia會(huì)自動(dòng)將deb包中的dylib動(dòng)態(tài)庫(kù)和plist安裝到Library/MobileSuntrate/CynamicLibraries4、其實(shí)是由cydia?subtrate插件操作的氏堤,cydia自帶
《78沙绝、Tweak原理?02》1、當(dāng)點(diǎn)擊app啟動(dòng)鼠锈,cydia?substrate會(huì)檢測(cè)plist中的ID是否跟app一致闪檬,若是一致便會(huì)加載對(duì)應(yīng)的dylib動(dòng)態(tài)庫(kù),會(huì)將運(yùn)行中的app放在內(nèi)存中的代碼做改變2购笆、本質(zhì):只是修改了內(nèi)存中的東西粗悯,并沒(méi)有對(duì)原本的可執(zhí)行文件做修改3、打開(kāi)Xcode同欠,設(shè)備信息里样傍,可以看到手機(jī)終端的打印信息。MS開(kāi)頭的便是Cydia?substrate做的事情
《79铺遂、一些疑問(wèn)》1衫哥、能不能使用Tweak破解游戲??????游戲很多都是使用C襟锐、C++編寫(xiě)的撤逢,得學(xué)習(xí)怎么hook它們寫(xiě)的方法。另一方面,函數(shù)名可能做過(guò)混淆蚊荣,比如beginGame初狰,class-dump出來(lái)可能變成了begin1000等,增加了破解難度
《80互例、復(fù)習(xí)總結(jié)》1奢入、Mac:?????Tweak.xm【make】dylib、plist【make?package】deb2媳叨、SSH:??????deb【make?install】3俊马、iPhone:??????【cydia】/Library/MobileSubstrate/DynamicLibraries4、卸載:??????a肩杈、在cydia中刪除插件??????b柴我、直接在目錄中刪除
《81、從匯編層面分析》1扩然、hook之后艘儒,只會(huì)調(diào)用hook中的方法,原來(lái)的方法不執(zhí)行
《82夫偶、圖片資源》1界睁、layout/Library/PreferenceLoader/Preferences/MJWeChat/kkk.png2layout/Library/Caches/MJWeChat/kkk.png
《83、多文件開(kāi)發(fā)01》1兵拢、Makefile需要指定Tweak.xm的位置2翻斟、#import?只能導(dǎo)入Tweak.xm所在目錄的文件,多層級(jí)則需要#import?"/src/MJPerson.h"3说铃、可以導(dǎo)入.h?.m文件访惜,但是.m文件必須跟Tweak.xm一樣指定路徑,用空格連接多個(gè)路徑
《84腻扇、release版本》1债热、Tweak的版本可以在Makefile中修改,但是build?是自動(dòng)打包生成的幼苛,刪掉歷史的deb窒篱,會(huì)重置build2、產(chǎn)出release版本舶沿,包相對(duì)小一些【make?package?debug=0】
《86墙杯、內(nèi)涵段子?獲取appid》1、cycript?【MjAppId】2括荡、clutch?【clutch?-i】只能獲取到加密的app3高镐、MJAppTools????a、下載地址【https://github.com/CoderMJLee/MJAppTools】????b一汽、進(jìn)入工程文件夾【make】生成release/MJAppTools????c避消、將MJAppTools拷貝到iPhone????/usr/bin/????d、修改權(quán)限【chmod?+x?/usr/bin/MJAppTools】
《87召夹、去除首頁(yè)廣告》1岩喷、直接將cell返回nil,可能會(huì)導(dǎo)致程序崩潰2监憎、可以判斷數(shù)據(jù)模型纱意,如果是廣告模型,則不添加到數(shù)據(jù)源3鲸阔、在reveal中拿到tableView的內(nèi)存地址4偷霉、進(jìn)入cycript,查看tableView的dataSource5褐筛、#tableView->_listModel->_dataList??????使用->訪問(wèn)成員變量6类少、找到廣告對(duì)應(yīng)的model類(lèi)型,在初始化方法里返回nil
《88渔扎、去除評(píng)論廣告》1硫狞、使用reveal查找到廣告cell,檢查cell是否有數(shù)據(jù)源模型2晃痴、查找tableView残吩,使用內(nèi)存地址訪問(wèn)到數(shù)據(jù)源dataSource3、查看dataSource類(lèi)的數(shù)據(jù)倘核,查看是否有廣告模型4泣侮、查找廣告模型的初始化方法,如果沒(méi)有紧唱,則找模型的父類(lèi)5活尊、嘗試對(duì)父類(lèi)的初始化方法進(jìn)行hook,發(fā)現(xiàn)其他評(píng)論也沒(méi)了漏益,改成對(duì)廣告模型類(lèi)的父類(lèi)方法進(jìn)行hook
《89酬凳、其他思路》1、判斷是否是廣告cell遭庶,是的話cell高度返回02宁仔、找到數(shù)據(jù)源,hook返回單元格個(gè)數(shù)的代理方法3峦睡、獲取到原來(lái)的數(shù)據(jù)list翎苫,然后遍歷將廣告model去掉4、Tweak中找不到的方法榨了,使用[]也訪問(wèn)不了的屬性煎谍,聲明一下就可以了,類(lèi)名隨意@interface?MJMethodSet-?(id)listModel龙屉;@end然后在Tweak中就能使用[self?listModel]5呐粘、找不到類(lèi)名满俗,聲明一下對(duì)應(yīng)類(lèi)6、找不到方法作岖,那么類(lèi)要寫(xiě)繼承7唆垃、%c(MJModel)?相當(dāng)于?NSClassFromString(@"MJModel")8、用strong數(shù)組指向數(shù)據(jù)源list痘儡,修改數(shù)據(jù)及代表修改數(shù)據(jù)源list9辕万、如果只是屬性,應(yīng)該是用set方法設(shè)置的沉删,可以hook set方法
《90渐尿、去掉new標(biāo)簽和刷新按鈕》1、找到new標(biāo)簽的類(lèi)矾瑰,發(fā)現(xiàn)并沒(méi)有初始化方法砖茸,可以考慮在他的父控件入手2、重寫(xiě)父控件new標(biāo)簽的set方法3殴穴、刷新按鈕并不是自定義的view渔彰,我們又不能對(duì)UiView下手,猜想它的控制器里面是否有它這個(gè)成員變量推正,繼而hook控制器對(duì)應(yīng)屬性的set方法4恍涂、崩了,說(shuō)明該屬性還被用在其他地方植榕,比如添加到數(shù)組等
5再沧、換成hook控制器即將顯示的方法,將視圖從父視圖移除尊残,也將屬性設(shè)置成nil
哈哈