iOS逆向工程之Cycript
1.连接设备
打开一个终端,输入指令:
iproxy 2222 22
重新打开一个新的终端,输入指令:
ssh -p 2222 root@127.0.0.1
这时候会提示输入密码:默认密码为“alpine”。这样就可以连接到设备了。
也可直接通过如下指令连接到设备:
ssh root@10.1.200.152 -p 22
如果后面没有"-p 22",有可能会报错:
这个时候,使用如下指令修改"services"文件,把5860修改为22即可:
sudo vi /etc/services
2.获取设备进程信息
输入指令:
ps ax
也可以查看具体某个进程的PID:
ps ax | grep SpringBoard
3.勾住某个进程
输入指令:
//1236为进程ID cycript -p 1236
4.编写方法
//获取当前控制器 function currentVC() { var app = [UIApplication sharedApplication] var keyWindow = app.keyWindow var rootController = keyWindow.rootViewController var visibleController = rootController.visibleViewController if (!visibleController){ return rootController } return visibleController.childViewControllers[0] } //获取当前控制器方法调用 var vc = currentVC() //获取控制器所有方法 function printMethods(className, isa) { var count = new new Type("I"); var classObj = (isa != undefined) ? objc_getClass(className)->isa : 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; } //调用获取所有方法 printMethods(CYTabBarController, objc_getClass(CYTabBarController)) //打印成员变量 function printIvars(className, isa) { var count = new new Type("I"); var classObj = (isa != undefined) ? objc_getClass(className)->isa : objc_getClass(className); var ivars = class_copyIvarList(classObj, count); var ivarsArray = []; for(var i = 0; i < *count; i++) { var ivar = ivars[i]; ivarsArray(ivar_getName(ivar)); } free(ivars); return ivarsArray; }
无善无恶心之体,
有善有恶意之动,
知善知恶是良知,
为善去恶是格物。