iOS逆向之旅(越獄篇) — Cycript【優(yōu)秀的調(diào)試工具】

安裝Cycript

在Cydia中,搜索并安裝該插件,這個很簡單,就不貼流程了

7BA7F15CB6D2AF004AD712AC74A3F4E8.png

調(diào)試App

$cycript -p 可執(zhí)行文件的名字/進程ID

示例
首先通過ps -A查看進程列表

image.png

接著,可以通過兩種方式附加到WeChat上
image.png

附加上后,你就可以各種玩耍了
image.png

基礎(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文件拷貝進去

image.png

成功導(dǎo)入咯~~~

  • 接著在Cycript下可以直接引用,如果提示{}就代表成功,然后就可以調(diào)用各種函數(shù)和變量了
image.png

小小展示一下我寫的方法【ActionName】有何作用

現(xiàn)在我要找上面這個登錄按鈕是哪一個點擊事件

image.png
  • 首先我們通過$UIApp.keyWindow.recursiveDescription().toString()找到登錄按鈕的內(nèi)存地址
image.png
  • 接著$ActionName(#按鈕的內(nèi)存地址)就可以找到這個按鈕的點擊事件了,記得在內(nèi)存地址前面加一個#號
image.png

現(xiàn)在你已經(jīng)知道哪個控制器,哪個函數(shù),想hook不就是分分鐘的事嗎?

拓展

非越獄環(huán)境下,同樣也能使用我們的cy文件,由于MonkeyDev內(nèi)置了Cycript

image.png

在這里把我們的cy文件放到copy Files中

導(dǎo)入和使用的方式和上面說的方式是一樣的~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容