1、查看《iOS逆向 開發(fā)工具》 Theos的使用方法做準(zhǔn)備工作;
2、創(chuàng)建tweak工程,實現(xiàn)在屏幕上添加彈框(越獄手機(jī));
3、Logos語法。
完成該工程,我們可以實現(xiàn)在任意地方添加我們想要的功能。任性,吼吼。
一、給屏幕添加彈框
項目目錄:/Users/yanghaibo/Documents/iOS逆向/Theos/
1、創(chuàng)建tweak工程,進(jìn)入工程目錄執(zhí)行命令:
/opt/theos/bin/nic.pl
會出現(xiàn)列表:
NIC 2.0 - New Instance Creator
------------------------------
[1.] iphone/activator_event
[2.] iphone/application_modern
[3.] iphone/application_swift
[4.] iphone/cydget
[5.] iphone/flipswitch_switch
[6.] iphone/framework
[7.] iphone/ios7_notification_center_widget
[8.] iphone/library
[9.] iphone/notification_center_widget
[10.] iphone/preference_bundle_modern
[11.] iphone/tool
[12.] iphone/tool_swift
[13.] iphone/tweak
[14.] iphone/xpc_service
Choose a Template (required):
2、選擇13創(chuàng)建一個tweak工程;
3、輸入tweak的工程名稱Project Name: first
4、輸入deb包的名字,Package Name: com.yahibo.first
5、輸入tweak作者的名稱,Author: yahibo
6、輸入作用對象的bundle identifier: com.apple.springboard
7、安裝完成后需要重啟應(yīng)用,以進(jìn)程名表示 命令:使用空格
項目創(chuàng)建完成如下:

8、修改Tweak.xm文件
%hook SpringBoard
-(void)applicationDidFinishLaunching:(id)application{
%orig;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"我來了,哈哈哈" delegate:nil cancelButtonTitle:@"不見" otherButtonTitles:@"好的", nil];
[alert show];
}
%end
9、修改Makefile文件,指定設(shè)備IP,指定處理器架構(gòu),指定SDK版本,導(dǎo)入framework,多個framework 空格添加。
THEOS_DEVICE_IP = 192.168.0.105
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = first
first_FILES = Tweak.xm
first_FRAMEWORKS = UIKit
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
10、配置完后終端進(jìn)入工程文件執(zhí)行安裝命令:
make package install
執(zhí)行如下:

手機(jī)端顯示如下:

以上大功告成,完成了鎖屏狀態(tài)下加彈框。
11、工程被打包到:./packages/com.yahibo.first_0.0.1-23+debug_iphoneos-arm.deb中,可使用dpkg 查看deb包信息:
dpkg -I ./packages/com.yahibo.first_0.0.1-23+debug_iphoneos-arm.deb
12、在Cydia應(yīng)用中搜索syslogd to/var/log/syslog并安裝;搜索Core Utilities并安裝,安裝后可以使用tail命令查看文件。
13、項目打包成一個.dylib動態(tài)庫在越獄手機(jī)/Library/MobileSubstrate/DynamicLibraries/目錄下。
修改內(nèi)容需要清除包
make clean
rm -rf packages
重啟SpringBoard殺死進(jìn)程會自動重啟
killall -9 SpringBoard
卸載動態(tài)庫:
make package uninstall
二、常用的Logos語法簡介
1、%hook指定需要hook的類名,以%end結(jié)尾。
%hook SpringBoard
-(void)applicationDidFinishLaunching:(id)application{
%orig;//執(zhí)行原始操作
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"我來了,哈哈哈" delegate:nil cancelButtonTitle:@"不見" otherButtonTitles:@"好的", nil];
[alert show];
}
%end
示例代碼為鉤住SpringBoard類的applicationDidFinishLaunching函數(shù),先執(zhí)行原始操作,再顯示彈框。
2、%log用來打印log的,將信息輸入到syslog中,格式%log([(<type><expr>,...)])。
%hook SpringBoard
-(void)applicationDidFinishLaunching:(id)application{
%orig;//執(zhí)行原始操作
%log((NSString *)@"iOSRE",(NSString *)@"Debug");
}
%end
3、%orig執(zhí)行被hook函數(shù)的原始代碼,類似于super.method功能,如果去掉,原始代碼不會執(zhí)行。還可以使用該函數(shù)更改原始函數(shù)的參數(shù):
%hook SBLockScreenDateViewController
-(void)setCustomSubtitleText:(id)arg1 withColor:(id)arg2{
%orig(@"hello I am hibo",arg2);
}
%end
4、%group該指令用于%hook的分組,%group后邊跟的是組名,%group也是必須以%end結(jié)尾,其中可以包含多個%hook。
5、%init該指令用來初始化某個%group,一個group只有被初始化后才可生效,init必須在hook中進(jìn)行執(zhí)行。
6、%ctor tweak的構(gòu)造器,用來初始化,如果不顯式定義,Theos就會自動生成一個%ctor,并在其中調(diào)用%init(_ungrouped).如:%ctor { %init(_ungrouped)}。
7、%new該指令用來給現(xiàn)有的class添加一個新的函數(shù)。與Runtime中的class_addMethod相同。
8、%c該指令用來獲取一個類的名稱,類似于objc_getClass。
三、遇到的問題
1、編譯報錯
"_OBJC_CLASS_$_UIApplication", referenced from: objc-class-ref in Tweak.x.a7a9a55a.o
- 在
Makefile文件中引入UIKit動態(tài)庫:xxx_FRAMEWORKS = UIKit,xxx工程名稱
從越獄手機(jī)中我們可以拿到蘋果設(shè)備的桌面程序SpringBoard.app,砸殼后獲取到SpringBoard對應(yīng)的頭文件。根據(jù)頭文件我們可以大致猜測到類及類方法的作用,因此使用以上方法,我們也可以更改其他一些顯示,修改桌面時間文本、顏色、電池狀態(tài)、電量,當(dāng)然這些可能沒有實用價值,我們只是通過這種方式來進(jìn)一步了解逆向。
蘋果設(shè)備桌面頭文件