先安装Cycrip
t软件,在Cydia
中,即可在iphone上调试正在运行中的App(注意app必须在手机上是运行状态)
1.先远程登录手机
sh usb.sh
sh login.sh
- Cycript的开启和关闭
cycript
cycript -p 进程ID
cycript -p 1364
cycript -p 进程名称
cycript -p WeChat
完整的进程,包括进程的ID, 安装路径,进程名称(最后一个是进程名称)
1364 ?? 0:08.08 /var/mobile/Containers/Bundle/Application/6F100B5F-CE1C-4329-886D-C60274D9C65D/WeChat.app/WeChat
取消输入:control + C
//输入完成的样子
cy# ^C
退出:control + D
清屏:control + R
获取手机上的进程
-
必须先安装adv-cmds
adv-cmds图片 - ps命令是process status的缩写,使用ps命令可以列出系统当前的进程
- 列出所有的进程
ps -A
或
ps aux
- 搜索关键词,ps –A | grep 关键词
ps -A | grep app
常用语法
[UIApplication sharedApplication]
UIApp
- 定义一个变量
var app = UIApp.keyWindow
"<iConsoleWindow: 0x137275e30; baseClass = UIWindow; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x13716dfe0>; layer = <UIWindowLayer: 0x1371eddf0>>"
- 活动根控制器
UIApp.keyWindow.rootViewController
-用内存地址获取对象(#内存地址)
#0x137275e30
"<iConsoleWindow: 0x137275e30; baseClass = UIWindow; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x13716dfe0>; layer = <UIWindowLayer: 0x1371eddf0>>"
已加载的所有OC类
ObjectiveC.classes
查看对象的所有成员变量 (对象)或(#内存地址)
*UIApp.keyWindow
*UIApp
*#0x137210dc0
递归打印view的所有子控件(跟LLDB一样的函数)
view.recursiveDescription().toString()
UIApp.keyWindow.recursiveDescription().toString()
筛选出某种类型的对象
- 筛选出控制器
choose(UIViewController)
- 筛选出cell
choose(UITableViewCell)
如果出现下面这个错误,可能是因为这个界面没有使用到cell,造成的错误,崩溃后从新连接下
cy# choose(UITableViewCell)
MS:Error: _krncall(mach_vm_read_overwrite(task, data, sizeof(*baton), reinterpret_cast<mach_vm_address_t>(baton), &error)) =268435459
*** _assert(status == 0):../Inject.cpp(143):InjectLibrary
把cy语法文件添加到手机上,放到cycript0.9
文件中
scp -P 10010 ~/Desktop/test.cy root@localhost:/usr/lib/cycript0.9
使用test的指令
导入头文件
@import test
调用test里面的函数
minus(10,20)
这样调用会报错,找不到这个变量,是test.cy文件内部的问题,因为js代码,函数调用函数,里面的函数就是私有的,造成引用不到,这个时候就得用exports
这个变量,将函数导出
throw new ReferenceError("Can't find variable: minus")
js修改前的代码
(function(exports)) {
function sum(a,b) {
return a + b;
}
function minus(a,b) {
return a - b;
}
})(exports);
js修改后的代码
(function(exports)) {
exports.sum = function(a,b) {
return a + b;
};
exports.minus = function(a,b) {
return a - b;
};
})(exports);
从新替换手机上的文件
scp -P 10010 ~/Desktop/test.cy root@localhost:/usr/lib/cycript0.9
再次调用方法
minus(20,2)
这个时候还是报错,因为使用export方法,表示就是这个方法传递给了这个test文件,得使用文件名进行访问
test.minus(20,2)
throw new TypeError("test.minus is not a function. (In 'test.minus(20,2)', 'test.minus' is undefined)")
这样还是报错,因为是手机上文件被修改了,import时候,内存中还是原来的文件,必须得把手机上软件杀掉,然后电脑从新连接,再次import
@import test
提示这个,import时候,会提示里面有一个sum函数,和一个minus函数
{sum:function (t,e){return t+e},minus:function (t,e){return t-e}}
调用方法,就成功了
test.minus(20,2)
获得程序的bundleID
[NSBundle mainBundle].bundleIdentifier
test.py的内容
(function(exports) {
exports.sum = function(a,b) {
return a + b;
};
exports.minus = function(a,b) {
return a - b;
};
exports.appId = [NSBundle mainBundle].bundleIdentifier;
exports.rootVc = function() {
return UIApp.keyWindow.rootViewController;
};
exports.docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
})(exports);
调用方法
test.appId
test.docPath
test.rootVc()
test.sum(10,20)
以上test.cy文件的内容是局部变量,使用的时候得用文件名,可以把方法修改为全局的变量
(function(exports) {
JGSum = function(a,b) {
return a + b;
};
exports.minus = function(a,b) {
return a - b;
};
exports.appId = [NSBundle mainBundle].bundleIdentifier;
exports.rootVc = function() {
return UIApp.keyWindow.rootViewController;
};
JGDocPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
})(exports);
全部变量的调用方法
JGSum(10,20)
注意:如果test.cy文件没有放在cycript0.9文件下,在引用库的时候,就得加上后面的地址,类似域名com.xx.xx
@import xx.xx.xx
利用python打印字符
- 先进入python环境
python
- 利用print打印符合
print '\xc2\xa5'
网友评论