iOS利器之Flex—App UI修改篇
作為一名手機愛好者,我們經常會嘗試安裝和研究一些功能強悍的App或工具,以此來讓我們的手機更加實用,實現我們所期望的更多功能。比如Root後的安卓系統,藉助Xposed框架,可以通過安裝各種插件,幫助手機實現很多平時實現不了的功能。同樣,iOS通過越獄,在Cydia Substrate框架的加持下,也能讓我們的手機突破系統限制,獲得豐富有趣的使用體驗。例如修改系統文件,增強App的使用體驗和功能。其中Flex作為iOS越獄後的經典插件之一,就是今天要給大家介紹的主題。
Flex是John Coates的作品,從推出就被大家視為越獄iOS必裝插件之一,至今已經更新到Flex3,支持至iOS11系統。通過此插件,你無需太多編程知識,也可以很容易地「操作」系統或App函數,以此來達到修改UI界面和程序功能的目的。本文主要簡單介紹如何通過Flex插件進行App可視化UI的修改,此過程需要藉助一款UI調試插件FLEXible來輔助。這兩款插件如同倚天和屠龍,配合起來有無窮的威力。
使用環境:越獄iOS(筆者使用的是yalu越獄的iOS 10.2);
插件Cydia下載源地址:
1.Flex官方源: http://getdelta.co(筆者使用的是Flex3 beta46);
2.FLEXible (BigBoss源): http://apt.thebigboss.org/repofiles/cydia/;
下面筆者將以iOS系統自帶應用App Store為例,儘力從通俗、歸納的角度,面向初級學者,簡單講述一下如何利用Flex和FLEXible兩款插件去除App Store「搜索」頁面中「熱門搜索」。
去除前後效果圖:
一、在Flex中添加要修改的目標程序:
首先打開我們從官方源下載的Flex應用,點擊右上角「+」號,進入後單擊選擇我們要去修改的程序App Store;
其中Title是此補丁的名稱,可以隨意命名。為方便直觀,筆者將此補丁命名為「App Store去搜索頁面熱門搜索」。
接下來點擊「Units」中的「Add Units..」添加修改目標。進入後Flex會展示給我們兩種操作。其中「Executable」是目標程序的可執行文件,也是最經常修改的文件,類似於Windows中的exe。而Libraries是此App所使用的「庫」文件,可以簡單理解為Windows中的dll。我們可以通過單擊條目進入,看到此可執行文件或「庫」文件所使用的函數,然後在定位函數後進行相應的修改。
二、利用UI調試插件FLEXible定位函數位置:
安裝FLEXible插件後,我們需要在「設置」中找到插件選項。進入插件界面後,點擊「Enabled Applications」,找到我們要調試的應用程序「App Store」並開啟。
返回桌面重新打開App Store,我們會發現界面上方出現了FLEXible調試工具欄。其中「menu」是工具菜單項,裡面包含了App的網路、文件、內存、函數、庫文件等信息;「view」是當前的視圖布局層次圖,用於定位函數;「select」用於選擇UI區域;「move」可以移動所選擇的區域,常用於「清除」UI干擾區域,或者確定所選區域是否為目標區域;「close」則是關閉工具欄。
我們點開App Store的「搜索」頁面,選擇調試工具欄的「select」,選中我們要去除的「熱門搜索」區域。
圖中藍色陰影區域便是我們的去除目標。接下來點擊插件工具欄中的「view」,進入當前選中區域的視圖布局層次界面,裡面包含了「搜索」頁面的可視化UI元素和其函數。其中默認選中的灰色區域是我們要去除的「熱門搜索」UI,UIStackView是其視圖容器。
點擊UIStackView視圖容器最右方的按鈕,進入到詳細信息界面。裡面包含了此視圖容器的所有屬性和函數方法,比如視圖預覽、大小、位置、可視性等。
接下來我們點擊「View Controller For Ancestor」,進入控制此視圖的「最高」父級視圖控制器函數界面,從「根源」找到我們要去除的區域UI及其函數方法。
一般而言,一個函數方法的屬性中往往包含了比較重要的信息。我們常用的定位方式就是先從屬性中尋找我們想要的結果。此視圖控制器函數包含的重要屬性主要有兩個,分別是*resultsView和*template,根據字面翻譯,我們首先應該懷疑*resultsView。點擊此屬性,進入resultsView視圖控制器的函數。
點擊「Preview image」預覽圖片進行驗證,發現此視圖就是我們要去除的內容。
即我們如果要去除此「熱門搜索」區域,只需將控制*resultsView變數的函數方法hook掉,不讓其生效即可。
點擊左上角返回父級控制器函數SKUITrendingSearchDocumentViewController界面,下拉找到此函數的方法。
根據iOS Objective-C語言特點,一個成員變數屬性通常有setter和getter兩種。以*resultsView為例,其中getter為–(id)resultsView,setter為–(void)setResultsView:(id)。如果hook一個成員變數,我們只需hook掉getter或setter其中之一的方法即可。即只需讓–(id)resultsView和–(void)setResultsView:(id)任意一個函數方法不生效。
三、利用Flex實現函數方法的hook
Flex hook函數是通過Cydia Substrate框架來實現的。面對初級學者,我們在此不做深入討論。大家只需要記住一下幾條基本規律即可:
1.如果hook的是id方法,只需要將此方法的Return Value(返回值)設為null,此方法即不執行;
2.如果hook的是沒有返回值的void方法,只需要選擇添加上此方法即可;
3.如果hook的是其它返回值的方法,比如int、bool等,只需要在方法的返回值里填入要設置的值。
下面我們回到Flex程序中,接著第一步驟,選擇我們要hook的文件和Target Method(目標函數方法)。上文中我們提到過,hook一個App主要是hook它Executable(主執行程序)里的函數方法。但是SKUITrendingSearchDocumentViewController隸屬於Libraries中的StoreKitUI庫(App Store中搜索不到此函數,且根據函數開頭SK推測後驗證得出)。
在「Choose Library」中點擊「Libraries」中的StoreKitUI庫。進入後在上端搜索框中輸入我們要定位的函數SKUITrendingSearchDocumentViewController。
點擊「SKUITrendingSearchDocumentViewController「,進入後我們會看到此函數下的所有方法。其中–(id)resultsView和–(void)setResultsView:(id)就是我們要hook的目標。點擊選擇兩者中任意一個方法(筆者選擇的前者),然後返回到此補丁的「Patch Editor」界面。可以看到「Units」下方多出了我們要hook的函數方法
–(id)resultsView。
根據前文提到過的,如果hook的是id方法,只需要將此方法的Return Value設為null,此方法即不執行。
點擊–(id)resultsView項,在「Edit Unit」界面將其「Return Value」的值選為「null」。然後返回到Flex的首頁補丁列表界面,將此補丁的開關開啟,並重新打開App Store進行驗證。
根據效果圖可以看到,「搜索」界面的「熱門搜索」區域已經被我們成功去除。
四、總結:
此文主要簡單介紹了Flex和FLEXible的基本用法,以及如何利用兩者定位UI類函數的位置。目的是給初學者起一個拋磚引玉的作用。在不同App中,函數方法的定位略有不同,但是大概的思路基本相同:
先利用FLEXible選擇要修改的UI區域,利用「view」視圖布局層次圖找到視圖的「父級」視圖控制器函數。然後通過推測、排除、驗證等方法確定成員變數及其函數方法;
在Flex中搜索定位到的函數方法,通過修改返回值(id,int,bool等)或選定的方式(void類)起到hook的效果。
返回App進行驗證。
結尾:Flex是一款功能強大的iOS越獄插件,通過它我們可以根據自己需要,修改UI視圖的函數方法,擁有更加個性化的App體驗。但是Flex也不是萬能的,比如它修改不了視圖的大小、位置、可視性等UI元素屬性。此時,就需要功能更強大豐富,但知識技能要求也更高的Theos越獄開發工具包來幫我們完成了。
想看到更多這類內容?去APP商店搜IT之家,天天都有小歡喜。
TAG:IT之家 |