看场电影

IPhone一起玩越狱 -(七)- Cycript环境调试Ap

2018-06-08  本文已影响67人  struggle3g

引言

越狱准备了那么久,到底为了什么?
当然是越狱调试、开发一些新的东西,比如将正儿八经的App调试修改。。。。

配置Cycript环境

在你的cydia中搜索Cycript安装,也可以直接添加我给的添加源地址

用Cycript勾住IPhone打开的App直接调试

$ ps -A | grep WeChat
$ cycript -p 进程名称/进程的编号

然后就可以搞事情了

简单的命令操作

/**在cycript勾住你运行中的app的时候**/
xxx-iPhone:~ root# cycript -p XXX
cy# UIApp
#"<UIApplication: 0x13b32ec60>"

/**循环遍历打印所有使用的子控件**/
cy# UIApp.keyWindow.recursiveDescription()
/**添加层级关系**/
cy# UIApp.keyWindow.recursiveDescription().toString()

cycript中定义的方法、变量的生命周期

cycript中创建一些变量、方法方便我们使用,同时你要了解他们的生命周期,来确保不影响你的调试
1. 创建方法、变量,使用之

/**首先定义一个变量**/
cy# var NewName = "123"
cy# NewName
"123"
/**定义一个变量**/
cy# function add(a,b) {return a + b}
cy# add(1,2)
3

2. 退出勾住App进程的cycript、重新勾住

/**快捷键 control + d 退出**/
xxx-iPhone:~ root# cycript -p 进程名称/进程的编号
cy# NewName
"123"
cy# add(1,2)
3
/**证明这些方法、变量没有消失**/

3. 退出App、重新打开这个App,退出勾住App进程的cycript、重新勾住

cy# NewName
throw new ReferenceError("Can't find variable: NewName")
cy# add(1,2)
throw new ReferenceError("Can't find variable: add")
/**证明这些方法、变量消失**/

在Cycript中所有定义的变量、方法都是依附在进程当中,也就是这个App的内存,当这个进程被杀死的时候,这么函数、变量也机会被清除

cycript中定义的方法、变量不消失的方式

创建.cy文件,就好像是一些公用方法,公用类一样,每次勾住App只要import name.cy就能使用你以前封装的方法、变量

/**在IPhone的/usr/lib/cycript0.9/创建一个.cy文件**/
/**或者在Mac的桌面创建一个.cy文件,copy到IPhone的/usr/lib/cycript0.9/**/
/**tools.cy**/
rootvc = function(){
    return UIApp.keyWindow.rootViewController;
}

/**Mac  Copy 到IPhone  USB连接模式**/
$ scp -P 3456 tools.cy root@本机ip:/usr/lib/cycript0.9

/**第一种**/
cy# @import tools
{}
/**第二种加载方式**/
cycript -p 进程名称/进程的编号  路径/你的.cy文件
/**第三种加载方式**/
/**这种方式有种好处是可以在你勾住App的时候修改.cy文件,可以直接动态的去调试,就是不用kill 进程重启直接使用**/
cycript -p 进程名称/进程的编号  路径/你的.cy文件 ; cycript -p 进程名称/进程的编号


cy# rootvc()
#"<MMUINavigationController: 0x1068a7800>"

非越狱加载.cy文件

require.resolve = function(name) {
    if (StartsWith(name, '/')) {
        let path = ResolveEither(name);
        if (path != null)
            return path;
    } else {
        let cwd = *new (typedef char[1024]);
        cwd = getcwd(cwd, cwd.length).toString();
        cwd = cwd.split('/');

        if (StartsWith(name, './') || StartsWith(name, '../')) {
            let path = ResolveEither(cwd + '/' + name);
            if (path != null)
                return path;
        } else {

            for (let i = cwd.length; i != 0; --i) {
                let modules = cwd.slice(0, i).concat("node_modules").join('/');
                let path = ResolveEither(modules + "/" + name);
                if (path != null)
                    return path;
            }

            let library = GetLibraryPath();
            let path = ResolveFile(true, library + "/" + name + ".cy");
            if (path != null)
                return path;

            //添加下面方法,在注入cyript的时候直接将Your.py文件也注入进去
            let document = GetDocumentPath();
            path = ResolveFile(true, document + "/cycript/" + name + ".cy");
            if (path != null)
                return path;
        }
    }

    throw new Error("Cannot find module '" + name + "'");
};

OK,这样在调试App或者注入功能的时候就直接用你自己定义的方式去调用,哇嗄嗄!

上一篇 下一篇

猜你喜欢

热点阅读