Qinz
蘋果系統桌面上有許多應用顯示未讀消息數量,看著讓人不是太舒服,接下來我們就自己動手寫一個插件,讓它一鍵消失。
1. 使用USB連接手機(USB連接手機操作點擊這篇文章)然后使用ps -A命令查看當前進程,根據springboard這個名稱我們很容易找到這個就是桌面,如下圖:
桌面應用
桌面應用
- 1.1 從上面的springboard.app我們就清楚,其實管理系統桌面應用的也是一個應用,所以用正常分析app的思路即可,沒啥可怕的。
2. 通過下面命令,將桌面應用拷貝到當前目錄:
scp -r -P 12345 root@127.0.0.1:/System/Library/CoreServices/SpringBoard.app .
3. 使用class-dump導出頭文件,命令如下:
class-dump -H SpringBoard -o ./SpringHeaders
4. SpringBoard的Macho文件只用7.5M,很快就完成了,這個后面分析會用到,如下圖:
SpringBoard頭文件
SpringBoard頭文件
5. 在Cydia中安裝Crcript,使用下面命令附加進程,進入cy動態調試:
cycript -p SpringBoard
6. 使用下面命令格式化打印層級結構:
UIApp.keyWindow.recursiveDescription() .toString ()
7. 可以分析得到SBIconView應該就是桌面每個應用的對象了,如下圖:
層級結構
層級結構
8. 為了確定SBIconView是不是應用圖標,我們隨便找一個對象地址,對該對象進行簡單的隱藏操作,會發現SBIconView確定就是桌面應用圖標對象,如下圖:.
隱藏應用圖標
隱藏應用圖標
9.通過Badge關鍵詞搜索,我們可以得出徽標的顯示就是SBIconParallaxBadgeView這個類:
徽標
10. 接下來使用Sublime打開之前dump出來的SpringBoard頭文件,搜索SBIconParallaxBadgeView:
定位SBIconParallaxBadgeView頭文件
定位SBIconParallaxBadgeView頭文件
11. 通過分析,我們發現有一個init方法,這里直接采用最簡單暴力的方式,就是hook這個init方法,讓其初始化失效,所以hook代碼如下:
%hook SBIconBadgeView
- (id)init{
return nil;
}
%end
12. 接下來用Monkey創建tweak
Tweak創建
Tweak創建
13. 這里的BundID默認是come.apple.SpringBoard,即對應我們的系統作用應用ID,如果要hook其他應用,對應填上其他應用BundID即可:
image.png
image.png
14. 修改對應的IP地址,端口號及密碼,默認密碼是alpine,我這里設置了免密登錄,所以不用填寫密碼:
BundID
BundID
15. 如果每次寫一個Cydia插件都去配置這個環境變量,會變得很繁瑣,我們可以直接進入vi ~/.zshrc文件配置環境變量,這樣XCode中的參數保持默認即可:
export MonkeyDevPath=/opt/MonkeyDev
MonkeyDevDeviceIP=127.0.0.1
MonkeyDevDevicePort=12345
export PATH=$PATH:$MonkeyDevPath/bin
16. 編寫hook代碼,會發現實現這個功能的代碼其實很簡單,如下圖:
hook代碼
hook代碼
17. 接下來編譯即可,運行后我們會發現桌面所有應用的徽標都消失可,看著就莫名舒暢:
一鍵清空徽標
一鍵清空徽標
18. 進入Cydia,我們發現自己寫的插件已經安裝完畢,如下圖:
清除角標插件
清除角標插件
總結:當我們要hook某個APP實現相應功能的時候,首先從分析入手,思路是關鍵,逐一定位所需hook點,找到關鍵代碼,對其進行hook。
我是Qinz,希望我的文章對你有幫助。