Cycript调试

作者: KinKen | 来源:发表于2018-12-18 18:09 被阅读69次

    一、简介

    Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了OC、JavaScript语法的解释器,这意味着我们能够在一个命令中使用Oc或者JavaScript,甚至两者并用。它能够挂钩正在运行的进程,能够在运行时修改很多东西。

    Cycript 手册

    二、简单使用

    两种使用方式:
    1.越狱手机安装Cycript插件,ssh登录到手机进行cycript

    2.使用MonkeyDev新建MonkeyApp工程,运行需要动态调试的App,Monkey默认开启了Cycript服务:

    CHConstructor{
        NSLog(INSERT_SUCCESS_WELCOME);
        
        [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
            
    #ifndef __OPTIMIZE__
            CYListenServer(6666);
    
            MDCycriptManager* manager = [MDCycriptManager sharedInstance];
            [manager loadCycript:NO];
    
            NSError* error;
            NSString* result = [manager evaluateCycript:@"UIApp" error:&error];
            NSLog(@"result: %@", result);
            if(error.code != 0){
                NSLog(@"error: %@", error.localizedDescription);
            }
    #endif
            
        }];
    }
    

    我们只需要Cycript链接到目标应用:

    cycript -r 你的设备IP:6666

    一些非常基础的命令如下:

    UIApp
    NSHomeDirectory()
    [[NSBundle mainBundle] bundleIdentifier]
    UIApp.delegate
    UIApp.keyWindow
    UIApp.keyWindow.rootViewController
    #address :获取该对象
    *#address:打印该对象成员变量
    ?exit

    简单使用

    遍历视图、控制器的一些命令:

    UIApp.keyWindow.recursiveDescription().toString()
    [[UIApp keyWindow] _autolayoutTrace].toString()

    [[[UIWindow keyWindow] rootViewController] _printHierarchy].toString()

    视图
    控制器

    Cycript默认不支持中文,将"\**\**\**\**"从Unicode转成中文即可

    三、定义函数

    单条命令可能满足不了一些快捷功能,可以写成函数,如下:

    //获取成员变量
    cy# 
    function KenPrintIvars(objc){
        var x = {};
        for(i in *objc){
            try{
                x[i] = (*objc)[i];
            }catch(e){
            }
        }
        return x;
    }
    
    获取成员变量
    //获取类的方法
    cy#
    function KenPrintMethods(className,isa) {
        var count = new new Type("I");
        var classObj = (isa != undefined) ? objc_getClass(className).constructor : objc_getClass(className);
        var methods = class_copyMethodList(classObj,count);
        var methodsArray = [];
        for(var i = 0;i < *count ; i++) {
            var method = methods[i];
            methodsArray.push({selector:method_getName(method),implementation:method_getImplementation(method)});
        }
        free(methods);
        return methodsArray;
    }
    
    获取类的方法

    四、高级用法

    Cycript支持加载脚本,这样就可以把常用的一些函数写在一个文件里,使用的时候更加方便,尝试将第三节的两个函数放在文件里(.cy),如下:

    创建脚本
    拷贝脚本到app包
    导入使用脚本

    MonkeyDev作者的工具也集成了非常好用的脚本,可以在cy#环境中直接使用,详情查看:

    MS.cy

    md.cy

    脚本封装了一些比较常用的函数如:pviews,pvcs,pactions,rp等等,效果跟之前的LLDB高级调试脚本命令一样,不再赘述。

    五、小结

    Cycript个人感觉对JS的支持力大于OC,不是很熟悉脚本语言,所以还是比较喜欢用LLDB调试,Cycript的优势可能是不用断住程序,可以直接做一些动态修改等,先mark到这里,后面有更好的玩法再更新。

    相关文章

      网友评论

        本文标题:Cycript调试

        本文链接:https://www.haomeiwen.com/subject/hwylkqtx.html