第一次寫Tweak,走進iOS逆向的世界
起因:公司的一產品由于是外包做的,代碼不知道在哪,今天老板臨時說要加個功能,但是現在沒有代碼,問我能搞不,當時說試試看,然后就開始了逆向之旅,最終很簡單解決了問題,菜鳥第一次上手,勿見笑,(其實以前我就有看逆向,只是沒時間去試驗,今天剛好有機會,接下來開始正文)
先說一下需要實現的功能,老板說要在登錄頁面加個按鈕來實現一個跳轉功能
第一步:上AppStore下載軟件
下載好了之后首先打開軟件看了一下,是原生,不是H5(不然真不會加),然后習慣性的用Reveal查看了一下App結構,這不看不知道,一看就給了我一個驚喜,原來別人已經把那個功能寫出來了,按鈕都寫在那了,只是Hidden掉了,那我的目的就成了把這個按鈕給顯示出來就行了.
第二步:砸殼(破解)
因為我們打包出來的ipa上傳到AppStroe后都是被經過加密的,被套了個殼(不知這樣表達是否準確),用class dump是導不出頭文件的(只能導出一個空的.h文件),砸殼工具是dumpdecrypted,下載后解壓(只有3個文件),放到一個好找的文件夾中,我的位置為/Users/jj/Movies/iOSRE/dumpdecrypted-master
然后cd進這個目錄執行make,結束后會多出2個文件,一個.dylib一個.o
dylib就是我們用來砸殼的錘子
- ssh連接手機(由于我的手機是10.2版本,用yalu越獄的時候自己手賤裝了openSSH,導致無法用wifi連接,經過多種方式,找到了個用USB連接的方式,大家可以用wifi或者USB,都可以),我介紹一下用USB連接的方法
打開終端輸入
brew install usbmuxd
如果你電腦上沒有安裝brew,也很簡單,也是一句話
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后再安裝usbmuxd庫就行了
安裝成功如圖
然后新開個終端輸入
iproxy 4567 22
以上命令是把當前連接設備的22端口映射到電腦的4567端口上,繼而來連接SSH
插上手機后另開終端輸入
ssh -p 4567 root@127.0.0.1
127.0.0.1也可以換成localhost,如果是直接用wifi連接的話,命令是
ssh root@xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx是你手機的IP地址(要保證與電腦在同一局域網)
如果是第一次連接,會如下圖
輸入yes,按回車后會要求你輸入密碼,默認密碼是:alpine,注意這里輸入密碼是不會顯示星號的,輸入完成后自己按回車即可(建議把默認的密碼修改了)
出現這樣就代表ssh已經連接成功了,可以開始下一步了
打開你需要砸殼的軟件,然后在終端輸入
ps -e
圖左邊紅框是進程PID,右邊畫橫線的就是我要砸殼的app路徑,可以看上面新浪微博的app,直接看名字就能看出自己要找的app
先用scp命令把我們的錘子傳到設備上(app路徑就是紅線畫的那里)
scp 路徑/dumpdecrypted.dylib root@xxx.xxx.xxx.xxx:/app路徑
這里是把錘子傳到要砸殼的app的Document目錄下(好像不一定非是這個目錄),網上大多數都這樣說。
然后cd到Document目錄輸入
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/executable
執行完成后會在當前目錄生成XXX.decrypted 可執行文件;
然后用scp再傳回電腦即可
- 這里再說一種方式,使用Clutch來破解,我寫這篇文章的時候就用的這種方式
先下載最新版的Clutch然后將其導入到手機中,可以用scp,我用pp助手直接拖拽的,比較方便,路徑是/usr/bin
然后cd到/usr/bin目錄下執行
Clutch-2.0.4 -i
如果顯示Permisson Deny,輸入chmod a+x Clutch-2.0.4提升權限然后再執行-i就可以了
然后輸入
Clutch-2.0.4 -d 43
我這里輸入43是因為我要破解的app前面的數字是43,如果百度糯米是1就輸1
如圖就是已經破解完成了,DONE后面就是破解后ipa的路徑,可以用pp助手等工具或者scp導出到電腦,至此第二步砸殼算是完成了。
第三步:導出頭文件
導出頭文件的工具是Class-dump,下載后點擊安裝把
/usr/local/bin
目錄下
然后終端輸入
class-dump
得到下圖則是安裝成功
如果上面你是用dumpdecrypted砸殼的,那么最后得到的是xxx.decrypted文件,導出頭文件的命令為
class-dump -H XXX.decrypted -o OUTPUT_PATH
OUTPUT_PATH是輸出路徑,就是你導出的頭文件放哪里!xxx.decrypted是路徑而不是名字
如果用的是Clutch破解的話,最后導出的是ipa文件,這里需要右鍵ipa選擇歸檔打開,然后解壓出個文件夾,點擊進去進入Payload文件夾,會看到一個與.app文件,與app同名,然后選擇右鍵顯示包內容,在里面找到一個執行文件,與app同名
然后終端執行導出頭文件命令
劃紅線的2個地方分別是執行文件的絕對路徑和輸入文件夾的絕對路徑,直接拖拽進終端就會自動填寫
這就是我們導出來的頭文件
第四步:寫Tweak了
- 先安裝dpkg和ldid,終端執行
brew install dpkg ldid
如果沒有安裝brew的,去上面復制命令安裝
- 安裝Thoes 終端執行
sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
/opt/theos是安裝路徑,可以自己改
然后修改/opt/theos的權限(位置不一樣的要記得改成自己的路徑)
sudo chown $(id -u):$(id -g) /opt/theos
很重要的一步,配置環境變量,在~./目錄下有個隱藏文件(開啟隱藏文件的命令請自行搜索)名字叫.bash_profile,如果你沒有這個文件,可以自己手動建立一個,在終端分別執行
cd ~ touch .bash_profile
然后在其中加上
export THEOS=/opt/theos export PATH=/opt/theos/bin/:$PATH
這里有個注意點,如果說你本身沒有.bash_profile文件,是自己新建的,要注意在終端執行
source ~/.bash_profile
這樣環境變量才會立即生效,不然輸入
nic.pl
會提示
-bash: nic.pl: command not found
安裝成功的效果是
建立Tweak,一般選擇11的iphone/tweak,有的人可能不是11,按后面的選
建立的時候cd到個空文件夾里,到時候生成文件的時候才好找
Project Name:為你的tweak名
Package Name:包名,可以直接回車
Author/Maintainer Name:也可以直接回車,會取你當前的Mac登錄用戶名
obileSubstrate Bundle filter:你的Tweak想給特定的app使用就寫那個app的Bundle id,我就直接寫com.apple.UIKit代表所有app都能調用這個Tweak
List of applications to terminate upon installation:直接回車
出現done就ok了
目錄下會出現4個文件
####想思路,怎么寫這個Tweak
* 因為按鈕其實都有了,我只需要把按鈕的hidden = NO就行了!,而這個按鈕所在的控制器我們需要
通過Reveal或者用Cycript(以后說這個)來找,先說簡單的,直接用reveal查看頁面
如圖,這就是我要找的控制器,直接去剛剛導出的頭文件里找這個控制器文件,文件內容如圖
其中的scanBtn就是被隱藏的按鈕,我要把它顯示出來,方法就很簡單了,直接在ViewDidLoad里調用一下這個btn.hidden = NO即可,我們開始寫Tweak
雙擊打開Tweak.xm文件,刪除其中所有的東西輸入
%hook XXLoginViewController
- (void)viewDidLoad {
%orig;
}
%end
其中%hook后面的就是我們要修改的控制器類
下面的就是我們要修改的函數,%orig是代表執行函數本身的功能,我們只是在其基礎上添加功能,所以不能影響程序本身的功能,不調用%orig的話相當于viewDidLoad里就沒有任何東西了,只會運行我們自己tweak里寫的方法!
由于這個類使用了synthesize,所以我用self獲取不到btn的屬性,直接寫也獲取不到btn屬性,我就將這個類給改動了一下
由于我改動了這個類,所以我需要將我改動過的這個類導入到tweak里去來保證tweak不會編譯報錯
方法是把改動的類放到和tweak.xm同一目錄下,然后在tweak.xm里導入
所以tweak.xm變成下面這樣了
#import “XXLoginViewController.h”
%hook XXLoginViewController
- (void)viewDidLoad {
self.scanBtn.hidden = NO;
%orig;
}
%end
現在Tweak目錄下是這樣的
cd進這個目錄執行
make package
如果遇到我這種報錯的話,使用sudo命令編輯這個文件(路徑不同的自己修改)
sudo vi /opt/theos/makefiles/package/deb.mk
然后重新回來打包
這次就直接打包成功了,左邊那個就是我們打包出來的deb,用pp助手等軟件傳到手機任何位置
然后用ifile這類管理軟件點擊打開安裝,然后打開我們的軟件就能看到效果了!
至此,結束!
文中如有錯誤,還望指出!
這次的東西比較淺,以后慢慢深入學習!
后面有空我會寫一下怎么將dylib打包到ipa中然后重簽名安裝到未越獄的手機上