0%

iOS攻防——(三)Cycript攻·防

简介

Cycript允许开发人员探讨和修改iOS和Mac OS X上运行的应用程序。
Cycript是一个理解Objective-C语法的javascript解释器,它能够挂钩正在运行的进程,能够在> 运行时修改应用的很多东西。

  1. 能够挂钩正在运行的进程,并且找出正被使用的类信息,例如view controllers,内部和第三方库,甚至程序的delegate的名称。
  2. 对于一个特定的类,例如View Controller, App delegate或者任何其他的类,我们能够得到所有被使用的方法名称。
  3. 能够得到所有实例变量的名称和在程序运行的任意时刻实例变量的值。
  4. 能够在运行时修改实例变量的值。
  5. 能够执行Method Swizzling,例如替换一个特定方法的实现。
  6. 可以在运行时调用任意方法,即使这个方法目前并不在应用的实际代码当中。

Cycript安装

这里下载
这里阅读所有Cycript诡计

先看看怎么用Cycript干点坏事吧

1. 给应用弹一个莫名其妙的alert

ssh登陆你的手机(如果不会,上一篇有~)

找一个app

这里我找的是以前做的一个app

1
ps aux | grep blackwidow

print

1
mobile 466 6.6 7.0 508416 36204 ?? Ss 11:22AM 0:09.65 /xxxx/blackwidow

这样知道进程号是466

hock住

1
cycript -p 466

如果你看到出现了cy#,说明你可以开始编写Cycript代码了

alert

1
2
3
4
5
6
// 找到widnow
var window = [UIApplication sharedApplication].keyWindow;
// 初始化一个alert
var alert = [[UIAlertView alloc] initWithTitle:@"hack you" message:@"hack you" window cancelButtonTitle:@"cancel" otherButtonTitles:@"yes", nil];
// 弹出来吧
[alert show];

2. 探索一个app

1
2
3
4
5
6
7
8
9
10
11
function printMethods(className) {
var count = new new Type("I");
var methods = class_copyMethodList(objc_getClass(className), 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;
}

调用一下:

1
printMethods(AppDelegate)

输出结果:

是不是觉得发生了很可怕的事情?该有的都被打印出来了。

你还可以通过试探的方式找出每一个Controller的名字,例如:

insert

1
var homeVC= [[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder];

print

1
#"<HomePageTabBarViewController: 0x156cf200>"

insert

1
var page0VC = [homeVC.childViewControllers objectAtIndex:3]

print

1
#"<BaseNavigationController: 0x156decc0>"

insert

1
var meVC = page0VC.topViewController

print

1
#"<MeViewController: 0x156de940>"

这样,我们就找到了『我的』页面所属Controller。

查看所有的方法:

1
printMethods(MeViewController)

改个标题试试:

1
[meVC setCurrentTitle:@"hack you"];

效果如下:

试想一下,如果MeViewController中或者LoginViewController中有一个方法叫getUserInfo,那么通过Cycript就可以轻而易举的拿到用户信息。

不过Cycript在这里最主要的作用还是偷窥APP和调试APP。
当然,好玩的方法还有很多。

知道了Cycript的可怕,在有重要信息藏在代码中的时候,我们也得学会如何放置Cycript修改运行时。

你可以参考这篇文章


有什么问题都可以在博文后面留言,或者微博上私信我。

博主是 iOS 妹子一枚。

希望大家一起进步。

我的微博:Lotty周小鱼