引言
越狱准备了那么久,到底为了什么?
当然是越狱调试、开发一些新的东西,比如将正儿八经的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文件
- 向重签名后的包里面的Framworks注入一个Cycript0.9的时候在
/opt/cycript_0.9.594/Cycript.lib/libcycript.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或者注入功能的时候就直接用你自己定义的方式去调用,哇嗄嗄!
网友评论