美文网首页
动态调试之Cycript

动态调试之Cycript

作者: Code_人生 | 来源:发表于2019-10-31 18:37 被阅读0次

    一、Cycript 安装

    • 放到\opt这个路径下

    • 配置.bash_profile

    • 退出终端,再次打开。可以table 出 cycript,但是报错,如下

    • open /System/Library/Frameworks/Ruby.framework/Versions,打开Versions文件
    • 把2.3复制一份,改名为2.0,然后把/2.0/usr/lib/libruby.2.3.0.dylib改成2.0.0.dylib

    • 没法复制时,参考关闭系统完整性保护 SIP(System Integrity Protection)的方法。Mac系统一升级(10.15.1),这个方法就没用了,大爷的。

    • 新的解决方案 参考
      sudo install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib /opt/cycript_0.9.594/Cycript.lib/libcycript.dylib

    • control + d 退出cycript

    二、Cycript 使用

    • Cycript不用断住程序,就可以直接调试应用

    • Cycript主要是界面调试,没法下断点

    • 1、创建一个MonkeyApp的应用

    • 2、把准备好砸壳的ipa,拖入TargetApp文件夹中。然后就可以运行了。自己创建的Demo的.app包也可以。
    • 3、开启的端口,这里是多少,就用多少。这里是6666
    • 4、保证电脑和手机在同一个局域网内
    • 5、找到手机上对应WiFi的IP地址。这里是192.168.255.224
    • 6、保证该应用在前台运行,然后在终端输入cycript -r 192.168.255.224:6666(-r之间一定不能有空格),进行附加。如果应用在后台,附加的时候很可能附加不上。
    • *** _syscall(connect(socket_, info->ai_addr, info->ai_addrlen)):../Console.cpp(306):CYSocketRemote [errno=60] , 如果遇到这个错误,换一个wifi试试、换个手机(换ip)。还是不行的话就用手机给电脑开热点。就是ip或端口或Wi-Fi的问题。
    • *** _syscall(connect(socket_, info->ai_addr, info->ai_addrlen)):../Console.cpp(306):CYSocketRemote [errno=61],如果遇到这个错误就重启一下应用就好,如果重启应用不行就重启手机
    • UIWindow.keyWindow() 获取keyWindow
    • [UIApplication sharedApplication] 简写 UIApp 获取APPlication单例对象
    • var keyWd = UIWindow.keyWindow() 定义一个变量
    • UIWindow.keyWindow().rootViewController
    • recursiveDescription() 循环打印子视图
    • toString() 格式化打印(遇到\n换行)
    • # 对象地址。拿到该对象,相当于po这个对象,和调用这个对象是一样的,可用于调用方法
    • * 对象名。可以取出对象的成员变量
    • choose(类名) 查询当前进程中该类型的对象。

    • 以下都是Monkey工具自带。而在越狱手机Cydia安装Cycript插件是没有的
    • Monkey拉取了网络的cy文件
    • https://raw.githubusercontent.com/AloneMonkey/MDCycript/master/MS.cy
    • https://raw.githubusercontent.com/AloneMonkey/MDCycript/master/MS.cy
    • APPID
    • pviews ()
    • pvcs ()
    • pvc()
    • pactions(#0x100e16320) 查看action 和 target
    • rp(#0x100e16320) 查看响应者链条

    • 注意
    • 注意这里没有self
    • cycript 不能拿到函数地址
    • cycript 主要调试界面的
    • 只要应用装到手机上了,就可以拔掉数据线了
    • 页面一旦换了,内存地址 就不要再用了!!
    • 没有search
    • 这里有APPID,是因为Monkey集成的,而在越狱手机Cydia安装Cycript插件是没有的

    三、脚本自动链接

    四、封装cy文件

    Cy文件
    Cycript是一门脚本语言,它可以加载封装好的.cy文件。
    我们会将常见的Cycript常用功能封装到.cy文件中,便于调试。

    非越狱中导入.cy文件
    利用MonkeyDev工具导入.cy文件
    MonkeyDev本身集成了Cycript。我们只需要将.cy文件通过xcode导入Framworks目录即可。

    1、在CycriptDemo文件夹下创建一个dyz.cy空文件(后缀名一定要为.cy)

    2、dyz.cy文件中添加如下代码,然后保存一下

    3、拷贝到CycriptDemo这个targets中

    4、重新运行项目即可

    5、需要导入才可以使用哦 @import dyz

    DYZCurrentVC
    DYZCurrentVC () 才会执行

    APPIDDYZ = [NSBundle mainBundle].bundleIdentifier,
    APPPATHDYZ = [NSBundle mainBundle].bundlePath,
    
    //如果有变化,就用function去定义!!
    DYZRootvc = function(){
    return UIApp.keyWindow.rootViewController;
    };
    
    DYZKeyWindow = function(){
    return UIApp.keyWindow;
    };
    
    DYZGetCurrentVCFromRootVc = function(rootVC){
    var currentVC;
    if([rootVC presentedViewController]){
    rootVC = [rootVC presentedViewController];
    }
    
    if([rootVC isKindOfClass:[UITabBarController class]]){
    currentVC = DYZGetCurrentVCFromRootVc(rootVC.selectedViewController);
    }else if([rootVC isKindOfClass:[UINavigationController class]]){
    currentVC = DYZGetCurrentVCFromRootVc(rootVC.visibleViewController);
    }else{
    currentVC = rootVC;
    }
    
    return currentVC;
    };
    
    DYZCurrentVC = function(){
    return DYZGetCurrentVCFromRootVc(DYZRootvc());
    };
    

    相关文章

      网友评论

          本文标题:动态调试之Cycript

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