我們之前在9、應(yīng)用重簽名原理和10卒暂、代碼的注入里面分別探索了應(yīng)用的重簽名和代碼的注入啄栓。這兩篇文章里面都是通過我們手動(dòng)的操作去完成的。這里推薦給大家一款自動(dòng)重簽名和代碼注入的工具:MonkeyDev
也祠。MonkeyDev的鏈接
MonkeyDev的安裝
-
MonkeyDev
是一款Xcode的插件昙楚,在逆向中幫助我們?nèi)ブ睾灻麘?yīng)用和代碼的注入。代碼的注入使用的Logos
诈嘿。下面我們來簡單介紹一下MonkeyDev
的安裝堪旧。
-
首先在
Wiki
里面有詳細(xì)的安裝教程(友好的中文文檔)。image
image -
在使用
Xcode12
奖亚,并且執(zhí)行安裝命令的時(shí)候淳梦,可能會(huì)遇到一個(gè)最常見的一個(gè)問題image
遇到的問題如下:
Creating symlink to Xcode templates...
Modifying Bash personal initialization file...
File /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Package Types.xcspec not found
遇到這個(gè)問題,可以在Issues
中的第266
個(gè)問題中找到答案:
遇到上面的問題執(zhí)行下面的指令就可以了昔字,就是做了一層映射爆袍。
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/PrivatePlugIns/IDEOSXSupportCore.ideplugin/Contents/Resources /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications
- 在安裝完畢之后,可能會(huì)遇到Xcode無法打開的情況(打開之后閃退)作郭。這個(gè)時(shí)候卸載Xcode陨囊,從新裝一個(gè)Xcode就可以了;重裝之后就會(huì)發(fā)現(xiàn)夹攒,已經(jīng)可以創(chuàng)建
Monkey
工程了:
image
MonkeyDev的使用
-
APP重簽名與安裝
在成功安裝MonkeyDev
之后蜘醋,我們馬上來使用一下。
- 首先選擇
MonkeyApp
咏尝,創(chuàng)建我們自己的MonkeyDev
工程压语。
如果此時(shí)遇到這個(gè)問題:
image
這是因?yàn)閷?duì)應(yīng)的文件夾里面缺失了對(duì)應(yīng)的文件闲先,我們只需要找到文件并拷貝進(jìn)指定的文件夾就可以了。(可以參考這里https://github.com/devdawei/libstdc-) - 將我們之前用過的
ipa包
无蜂,拷貝到TargetApp
文件夾中:
image - 然后
cmd+R
運(yùn)行工程就可以了。運(yùn)行效果如下:
image
-
MonkeyDev代碼注入
MonkeyDev
的代碼注入在Logos -> xxx.xm
文件里面code
蒙谓。但是第一次開的工程的時(shí)候斥季,會(huì)發(fā)現(xiàn)該文件無法打開;我們只需要修改右邊信息欄里面的信息就可以了:
image
注意:該文件里面使用的是Logos
語法
image
-
Logos語法
Logos
語法是CydiaSubstruct
框架提供的一組宏定義累驮。便于開發(fā)者使用宏驚醒HOOK
操作酣倾。語法簡單,功能強(qiáng)大且穩(wěn)定谤专。官網(wǎng)地址
Logos
語法很少躁锡,只有下面這么多:
image
強(qiáng)烈建議有需要的同學(xué),仔細(xì)研究一下官網(wǎng)的文檔置侍,里面講的很詳細(xì)映之。下面我們就簡單的介紹一下: -
Logos
語法分為三大類:-
Block level
這一類型的指令會(huì)開辟一個(gè)代碼塊,以%end
結(jié)束蜡坊。如:%group
杠输、%hook
、%subclass
秕衙、%end
-
Top level
這個(gè)Top level
指令不放在Block level
中蠢甲。如:%config
、%hookf
据忘、%ctor
鹦牛、%dtor
-
Function level
這一塊的指令就放在方法中。如:%init
勇吊、%class
曼追、%c
、%orig
萧福、%log
-
常用語法
-
HOOK
某個(gè)類里面的某個(gè)方法%hook ClassName //對(duì)象方法 -(void)instanceMethod{ } //類方法 +(void)classMethod{ } %end
-
為某個(gè)類添加新的方法
%hook ClassName //添加一個(gè)類方法 %new +(void)newClassMethod{ } //添加一個(gè)對(duì)象方法 %new -(void)newInstanceMethod{ } %end
%group
用來將代碼分組拉鹃。開發(fā)中HOOK
代碼會(huì)很多,這樣方便管理Logos
代碼鲫忍。
%group group1
%hook ClassName
......
......
%end
%end
-
%ctor(constructor)
構(gòu)造函數(shù)膏燕,用于確定加載哪個(gè)組。和%init
結(jié)合用 -
%init
用來初始化某個(gè)組 -
%log
能夠輸出日志悟民,輸出方法調(diào)用的詳細(xì)信息坝辫。 -
%orig(original)
這個(gè)是保持原有方法的實(shí)現(xiàn),如果原來的方法有返回值射亏,那么%orig
就有返回值近忙。 -
%new
給某個(gè)類添加方法竭业,在%hook
和%end
中間使用 -
%c
類似于getClass
函數(shù),獲得一個(gè)類對(duì)象及舍。一般用于調(diào)用類方法未辆。
Demo實(shí)戰(zhàn)
首先我們創(chuàng)建一個(gè)DemoAPP
,用于HOOK
锯玛;當(dāng)然里面也要添加一些用于HOOK
的方法咐柜。
然后創(chuàng)建我們的
Mobkey
工程,對(duì)我們的DemoAPP
進(jìn)行HOOK
攘残;注意這里使用的是DemoAPP
的APP包
拙友,而不是包里面的可執(zhí)行文件。到這里我們先運(yùn)行一下
Monkey
工程歼郭,確保HOOK
工程可以正常運(yùn)行遗契。接下里我們?cè)?code>MonkeyDemoDylib.xm文件里面去書寫我們的
HOOK
代碼。可以看到此時(shí)我們已經(jīng)
HOOK
成功了病曾。這里注意牍蜂,因?yàn)槲覀兇藭r(shí)HOOK
的是ViewController
里面的代碼,所以MonkeyDemoDylib.xm
里面也要寫成ViewController
泰涂。下面我們?nèi)?code>HOOK一下其他的類:在
DemoAPP
中增加一個(gè)類:然后我們?cè)?code>Monkey工程中去
HOOK
一下新建的類:
//HOOK ViewController
%group groupVC
@interface ViewController:UIViewController
@end
%hook ViewController
- (void)btnLoginFunc:(id)sender {
NSLog(@"HOOK成功了");
%orig;
}
%end
%end
//HOOK Jax 頁面
%group groupJaxVC
@interface JaxViewController:UIViewController
@end
%hook JaxViewController
- (void)jaxBtnFunc {
NSLog(@"Jax頁面 ---- HOOK成功了");
%orig;
}
%end
%end
%ctor {
%init(groupVC);
%init(groupJaxVC);
}
輸出結(jié)果:
這里有一點(diǎn)好主意凰浮,創(chuàng)建的
group
就一定要使用励烦,否則會(huì)報(bào)錯(cuò)夭禽。比如我們沒有使用groupVC
:
%ctor {
%init(groupJaxVC);
}
就會(huì)報(bào)下面的錯(cuò)誤:
總結(jié):以上就是
MonkeyDev
的安裝和使用城菊。整體來說使用時(shí)起非常的方便。整個(gè)的簽名和安裝的過程和我們自己手動(dòng)操作的過程是一樣的其做。在熟練使用工具的前提下還是要理解底層的操作流程的顶考。
tips:
將MachO文件中的頭文件導(dǎo)出:
///將text可執(zhí)行文件里面的所有頭文件,導(dǎo)出到headers文件夾
class-dump -H test -o headers