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開始支持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、給開發(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)定、變慢,甚至白蘋果
《第四課、完美越獄和不完美越獄》1、完美:越獄之后可以正常開關(guān)機(jī)2、不完美:一旦關(guān)機(jī)后再開機(jī),出現(xiàn)白蘋果;開機(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)入軟件源找到軟件,開始安裝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】?????自定義快捷鍵打開指定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)開源實(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的開源實(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】【回車回車回車】生成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】回車后不用輸密碼會(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)開機(jī)自動(dòng)開啟)可以將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、開啟和關(guān)閉【cycript -p 進(jìn)程ID】、【cycript -p 進(jìn)程名稱】進(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使用到的所有類2、【*對(duì)象】查看對(duì)象的所有成員對(duì)象3、【UIApp.keyWindow.recursiveDescription().toString()】遞歸打印view的子控件(跟LLDB一樣,控制臺(tái))4、【choose(類名)】篩選出類名相關(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ì)象的所有類方法名
《第二十六課、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) {
// 在這里編寫內(nèi)容(注意寫法)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)用直接寫就好,但是方法的調(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ì)象類名")】查看類的所有子類
《第三十二課、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-打開想要調(diào)試的APP9、【killall SpringBoard】重啟桌面【reboot】或者重啟手機(jī)(可能需要重新越獄)10、如果上面的方法行不通,可參考http://www.itdecent.cn/p/6cac1052879da、Mac 安裝Reveal ,成功之后打開下圖對(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、代碼編寫:注入代碼到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 文件類型》1、Mach-O是Mach object的縮寫,是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文件類型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、查看文件類型【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 文件類型、目標(biāo)架構(gòu)類型等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、下載后打開Xcode工程,修改SDK版本,運(yùn)行3、open打開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用于加載以下類型的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、兩種脫殼方法:硬脫殼:將硬盤上的可執(zhí)行文件,執(zhí)行解密算法動(dòng)態(tài)脫殼:將運(yùn)行在內(nèi)存中的解密的可執(zhí)行文件,從內(nèi)存中導(dǎo)出到硬盤上3、iOS中采取硬脫殼的方式a、Clutch:https://github.com/KJCracks/Clutchb、dumpdecrypted:https://github.com/stefanesser/dumpdecrypted/
《58、LC_ENCYPTION_INFO》1、使用Mach-O打開可執(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è)是脫殼成功后的文件??梢詫⒑缶Y名去掉,是可執(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、編寫代碼?=>?deb安裝包/插件?=>?裝到手機(jī)上3、安裝簽名工具ldid【brew?install?ldid】4、下載Theos,最好是git?clone,?建議安裝到~/theos【git?clone?--recursive?https://github.com/theos.git~/theos】遞歸下載,所有依賴都下載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?代碼編寫》1、創(chuàng)建項(xiàng)目【nic.pl】????【11】iphone/tweak????【名稱】????【包名】????【需要hook的ipa的包名(使用CCAppId獲?。孔⒁猓汗こ蘨d不能與對(duì)象ipa的id一致2、使用subline打開工程3、修改Makefile文件????【export?THEOS_DEVICE_IP=127.0.0.1】【export?THEOS_DEVICE_PORT=10010】4、編寫Tweak.xm文件修改類名重寫需要修改的方法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、編寫代碼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指令寫到腳本中執(zhí)行添加make?clean?&&
《71、微信練習(xí)?Tweak?常量》1、%orig?表示實(shí)現(xiàn)本來(lái)的方法,類似于super,不建議帶參數(shù)2、[self?numberOfSection:section]3、id類型盡量使用方法的方式調(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ù)寫原對(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)目名稱的文件夾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、打開Xcode,設(shè)備信息里,可以看到手機(jī)終端的打印信息。MS開頭的便是Cydia?substrate做的事情
《79、一些疑問(wèn)》1、能不能使用Tweak破解游戲??????游戲很多都是使用C、C++編寫的,得學(xué)習(xí)怎么hook它們寫的方法。另一方面,函數(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、多文件開發(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類型,在初始化方法里返回nil
《88、去除評(píng)論廣告》1、使用reveal查找到廣告cell,檢查cell是否有數(shù)據(jù)源模型2、查找tableView,使用內(nèi)存地址訪問(wèn)到數(shù)據(jù)源dataSource3、查看dataSource類的數(shù)據(jù),查看是否有廣告模型4、查找廣告模型的初始化方法,如果沒(méi)有,則找模型的父類5、嘗試對(duì)父類的初始化方法進(jìn)行hook,發(fā)現(xiàn)其他評(píng)論也沒(méi)了,改成對(duì)廣告模型類的父類方法進(jìn)行hook
《89、其他思路》1、判斷是否是廣告cell,是的話cell高度返回02、找到數(shù)據(jù)源,hook返回單元格個(gè)數(shù)的代理方法3、獲取到原來(lái)的數(shù)據(jù)list,然后遍歷將廣告model去掉4、Tweak中找不到的方法,使用[]也訪問(wèn)不了的屬性,聲明一下就可以了,類名隨意@interface?MJMethodSet-?(id)listModel;@end然后在Tweak中就能使用[self?listModel]5、找不到類名,聲明一下對(duì)應(yīng)類6、找不到方法,那么類要寫繼承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)簽的類,發(fā)現(xiàn)并沒(méi)有初始化方法,可以考慮在他的父控件入手2、重寫父控件new標(biāo)簽的set方法3、刷新按鈕并不是自定義的view,我們又不能對(duì)UiView下手,猜想它的控制器里面是否有它這個(gè)成員變量,繼而hook控制器對(duì)應(yīng)屬性的set方法4、崩了,說(shuō)明該屬性還被用在其他地方,比如添加到數(shù)組等
5、換成hook控制器即將顯示的方法,將視圖從父視圖移除,也將屬性設(shè)置成nil
哈哈