]iOS逆向實踐記錄-讓非6s機型在SpringBoard擁有3DTouch

首先先給我這困難的語言表達能力道個歉哈,真的盡力了。ios

最近才接觸不久的逆向工程,刷夜,爆肝,把《iOS應用逆向工程》這本書的工具,所有看了一遍,而且嘗試了一遍,感受須要點什麼。 那就是實踐!  最近6s手機出了3DTouch,無奈手中沒有這款機型,剛好最近對逆向小有心得,又據說過已經有插件能實現一樣的需求,證實確實有可行性,因而開動。根據點擊的判斷和出現,初步感受,這應該不須要多少行代碼就能搞定,應該只要添加一個手勢,或者是更改一個手勢的點擊事件,讓系統認爲發生了3DTouch點擊事件,就能夠了。git

在這裏我仍是要推薦下我本身建的iOS開發學習羣:680565220,羣裏都是學ios開發的,若是你正在學習ios ,小編歡迎你加入,今天分享的這個案例已經上傳到羣文件,你們都是軟件開發黨,不按期分享乾貨(只有iOS軟件開發相關的),包括我本身整理的一份2018最新的iOS進階資料和高級開發教程程序員

所需工具: cycript,openSSH,class-dumpgithub

測試環境:iOS9.0.2,iPhone5s微信

備註:由於自身沒有3DTouch,因此須要下載一個插件,讓機器擁有3DTouch功能,我使用的是forcy,經過覆蓋長按手勢,實現ssh

經過查閱官方文檔,獲得關鍵詞  Shortcut Menu peek pop函數

這個詞未來就是要在找關鍵方法時刻所要用到的工具

如今開始!佈局

經過ssh鏈接到手機,而後將cycript注入到SpringBoard學習

huangjipingde-iPhone:~ root# cycript -p SpringBoard

首先 先隆重介紹1個方法,2個函數

1方法 [view recursiveDescription]  該方法能夠當作是Reveal的文字版,用來查看當前頁面的佈局

2函數,原理均是runtime,可是第二個沒有怎麼看懂。。。

1. printMethods 打印出該類全部的方法,後邊接的是實現的地址,在這兒補充一下,若是想對某個方法打斷點,可是又不想使用ida查看方法偏移,能夠直接在這實現的地址處,添加斷點,雖然不知道斷在什麼地方,可是能夠確定必定是在執行該方法的時候。效果以下圖:

iOS開發學習羣:680565220

2. tryPrintIvars打印出對象全部的屬性,效果以下圖:

 

準備工做都作好了,將兩個函數都先輸入進去

由於最後的目標是應用圖標,因此,如今咱們從主界面開始着手打印它的UI佈局

1    [[UIApplication sharedApplication].keyWindow.rootViewController.view recursiveDescription]

iOS開發學習羣:680565220

而後出來了一大片,紅呦呦的代碼,看着都眼睛疼,4點鐘時看得眼睛都瞎了啊。此時應想,主界面能夠滾動,是一個scrollView,是scrollView就得有contentSize,而後一看手機的頁面,總共有5頁,因爲5s機型的寬度是320,因此這時候能夠大膽猜想它的contentSize的最大寬度是1600,而後commond+F大法

準確命中,同時,還注意到,它的contentOffset是960又此時個人頁面正是第4頁,基本鎖定目標,查找frame的座標是960,0的view,此時能夠獲得大量信息了,SBRootIconListView,這個就是用來裝一頁全部圖標的View,SBIconListModel這個裏邊,我猜是裝了該view裏邊的模型信息,注意,11 icons,正好是咱們頁面全部的圖標數,此時再看後邊SBIconView的size 62,62  這和圖標尺寸的差距只有2個點,基本鎖定,它就是咱們要找的目標

此時,讓咱們找到是什麼在處理SBIconView的事件,咱們所知道的,view通常是用來展現的,事件的發生通常都會交給代理來負責。讓咱們使用nextResponder,或者尋找他們的代理,來定位到一個controller文件,很幸運,直接一步就找到了,就是它:SBIconController!

此時,咱們能夠class-dump出SpringBoard的頭文件了,去查看一下它的裏邊都有些什麼方法和屬性,若是想偷懶,去github直接搜索也行。。。

根據關鍵詞和方法名譯的意思大體鎖定出來如下幾個方法

ps:  這兒的char 是BOOL類型

本身寫一個tweak,hook全部的這些函數,給他們全部的實現以前加上一個NSLog(),查看調用的順序,和傳進來的值的類型。 以及一次Peek事件所關聯到了哪些方法。

 

此時咱們拿手機進行一次長按操做,使其彈出ShotcutMenu菜單,而後在openSSH中查看系統日誌grep ZZT3D /var/log/syslog查看一下,該事件處理分別使用了那幾個方法。

由於是要欺騙系統,因此方法應該是在前方,初步定位到這3個方法,第一個顧名思義返回值就是能不能顯示shotcutMenu,第二個,咱們能夠看到,這裏傳進來了一個手勢,經過這手勢的信息,基本能夠推斷,這個就是插件做者用來欺騙系統的手勢,而該方法,就是手勢的target方法,第三個,根據意思能夠得知,從XXiconView,是否當即顯示。核心就在於這兒了。最後,咱們再打印一遍SBIconView的全部屬性,用來確認一下

繼續搜索關鍵詞,果真又有大收穫_shortcutMenuPeekGesture有一個如此手勢,裏邊的東西的手勢。

猜想獲得了極大的確定,下面就開始編寫tweak了

因爲是要給每個iconView都添加手勢,而且只添加一次,因此翻看了iconView頭文件,查看他的init方法,選擇了在initWithContentType中初始化。

貼上Tweak.xm的源碼

關於代碼的編寫,中間也踩過很多坑,好比_revealMenuForIconView中的yes,no的設置,還好一開始猜的時候就所有手動賦值。

至於手勢爲何傳值須要如此怪異,由於檢測發現原方法只識別長按手勢,並不識別輕掃手勢,可是由於我的習慣,不想覆蓋系統手vc輕鬆搞定,如今輕掃一下手機!出現了意想之中的彈窗!

 

 

 

至此,所有結束,感謝您看徹底部.歡迎關注微信公衆號:程序員大牛。

相關文章
相關標籤/搜索