安裝Cycript
在Cydia中赴穗,搜索并安裝該插件裕菠,這個很簡單逐沙,就不貼流程了
調(diào)試App
$cycript -p 可執(zhí)行文件的名字/進程ID
示例
首先通過ps -A
查看進程列表
接著,可以通過兩種方式附加到WeChat上
附加上后偏序,你就可以各種玩耍了
基礎(chǔ)的語法和其他使用哼御,可以查閱官方文檔
編寫自定義.cy文件
我們除了使用常用的一些命令之外题山,我們編寫自定義函數(shù)來實現(xiàn)我們的特殊功能兰粉,可以提高我們逆向調(diào)試的效率
第一步:編寫一個簡單.cy文件
大部分功能我都是從網(wǎng)上copy下來的,只有最后一個是自己動手寫的顶瞳,嘿嘿
相信大家大部分都能看得懂玖姑,這里的語法有點怪怪的,js+oc慨菱,我也是模仿著寫的
(function(exports) {
APPID = [NSBundle mainBundle].bundleIdentifier,
APPPATH = [NSBundle mainBundle].bundlePath,
APPHOME = NSHomeDirectory(),
APPDOC = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0],
APPLIBRARY = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0],
APPCACHE = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]
RootVC = function(){
return UIApp.keyWindow.rootViewController;
};
KeyWindow = function(){
return UIApp.keyWindow;
};
GetCurrentVCFromRootVc = function(rootVC){
var currentVC;
if ([rootVC presentedViewController]) {
// 視圖是被presented出來的
rootVC = [rootVC presentedViewController];
}
if ([rootVC isKindOfClass:[UITabBarController class]]) {
// 根視圖為UITabBarController
currentVC = GetCurrentVCFromRootVc(rootVC.selectedViewController);
} else if ([rootVC isKindOfClass:[UINavigationController class]]){
// 根視圖為UINavigationController
currentVC = GetCurrentVCFromRootVc(rootVC.visibleViewController);
} else {
// 根視圖為非導(dǎo)航類
currentVC = rootVC;
}
return currentVC;
};
// 獲取當(dāng)前的界面的控制器
CurrentVC = function(){
return GetCurrentVCFromRootVc(RootVC());
}
// 傳入控件焰络,能獲取到他事件函數(shù)【例如能獲取點擊事件綁定的事哪個方法】
ActionName = function(control){
var ret = [control actionsForTarget:[[control allTargets] allObjects][0] forControlEvent:[control allControlEvents]];
return ret;
}
})(exports);
第二步:導(dǎo)入該文件
- 首先把我們編寫好的文件拷貝到手機的usr/lib/cycript0.9目錄下
有兩種辦法,一種直接通過工具iFunBox符喝,直接拖闪彼。第二種輸入指令
scp -P 6699 utils.cy root@localhost:/usr/lib/cycript0.9
,把寫好的cy文件拷貝進去
成功導(dǎo)入咯~~~
- 接著在Cycript下可以直接引用,如果提示{}就代表成功,然后就可以調(diào)用各種函數(shù)和變量了
小小展示一下我寫的方法【ActionName】有何作用
現(xiàn)在我要找上面這個登錄按鈕是哪一個點擊事件
- 首先我們通過
$UIApp.keyWindow.recursiveDescription().toString()
找到登錄按鈕的內(nèi)存地址
- 接著
$ActionName(#按鈕的內(nèi)存地址)
就可以找到這個按鈕的點擊事件了协饲,記得在內(nèi)存地址前面加一個#號
現(xiàn)在你已經(jīng)知道哪個控制器畏腕,哪個函數(shù),想hook不就是分分鐘的事嗎茉稠?
拓展
非越獄環(huán)境下描馅,同樣也能使用我們的cy文件,由于MonkeyDev內(nèi)置了Cycript
在這里把我們的cy文件放到copy Files中
導(dǎo)入和使用的方式和上面說的方式是一樣的~