iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】

安装Cycript

在Cydia中,搜索并安装该插件,这个很简单,就不贴流程了

iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】_第1张图片
7BA7F15CB6D2AF004AD712AC74A3F4E8.png

调试App

$cycript -p 可执行文件的名字/进程ID

示例
首先通过ps -A查看进程列表

image.png

接着,可以通过两种方式附加到WeChat上
iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】_第2张图片
image.png

附加上后,你就可以各种玩耍了
iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】_第3张图片
image.png

基础的语法和其他使用,可以查阅官方文档

编写自定义.cy文件

我们除了使用常用的一些命令之外,我们编写自定义函数来实现我们的特殊功能,可以提高我们逆向调试的效率

第一步:编写一个简单.cy文件

大部分功能我都是从网上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 {
            // 根视图为非导航类
            currentVC = rootVC;
        }
            return currentVC;
    };

    // 获取当前的界面的控制器
    CurrentVC = function(){
        return GetCurrentVCFromRootVc(RootVC());
    }

    // 传入控件,能获取到他事件函数【例如能获取点击事件绑定的事哪个方法】
    ActionName = function(control){
        var ret = [control actionsForTarget:[[control allTargets] allObjects][0] forControlEvent:[control allControlEvents]];
        return ret;
    }

})(exports);

第二步:导入该文件

  • 首先把我们编写好的文件拷贝到手机的usr/lib/cycript0.9目录下

有两种办法,一种直接通过工具iFunBox,直接拖。第二种输入指令scp -P 6699 utils.cy root@localhost:/usr/lib/cycript0.9,把写好的cy文件拷贝进去

image.png

成功导入咯~~~

  • 接着在Cycript下可以直接引用,如果提示{}就代表成功,然后就可以调用各种函数和变量了
iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】_第4张图片
image.png

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

现在我要找上面这个登录按钮是哪一个点击事件

iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】_第5张图片
image.png
  • 首先我们通过$UIApp.keyWindow.recursiveDescription().toString()找到登录按钮的内存地址
iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】_第6张图片
image.png
  • 接着$ActionName(#按钮的内存地址)就可以找到这个按钮的点击事件了,记得在内存地址前面加一个#号
iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】_第7张图片
image.png

现在你已经知道哪个控制器,哪个函数,想hook不就是分分钟的事吗?

拓展

非越狱环境下,同样也能使用我们的cy文件,由于MonkeyDev内置了Cycript

iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】_第8张图片
image.png

在这里把我们的cy文件放到copy Files中

导入和使用的方式和上面说的方式是一样的~

你可能感兴趣的:(iOS逆向之旅(越狱篇) — Cycript【优秀的调试工具】)