本帖最后由 ken 于 2015-10-20 23:54 编辑
上一节中,我们学习了创建一个自签名应用和如何安装到你的设备中。这一节。我们将学会如何使用Cyript进行Method Swizzling。
首先,我们下载Xcode用来构建一个自签名的项目,上一节已经说得很清楚了。确认下是不是使用的自己创建的签名。
程序一旦运行起来,ssh进入你的设备使用Cyript来Hook正在运行的程序。你可以使用这条命令Cyript -p [App_ID]
注意看下面这幅图,这个应用有个登录框,我们将通过点击Login Method 1 button.来绕过登录而不需要密码。
输入用户名admin和密码password,它会跳转到登录成功后的页面。
如果我们输入错误的账号和密码,会出现如下账号或密码出错的提示
我们的目标是绕过这个登录页面。
So,我们先找到这个应用的root view controller。使用命令UIApp.keyWindow.rootViewController
OK, 这个登录页面是我们打开这个应用的第一个视图,从上图我们可以确定负责显示这个登录页面的view Controller(视图显示类)是导航控制(NavitionController是导航控制类,前面几节有讲过)的一部分。我们可以通过导航控制类的属性visibleViewController来找到当前显示的视图。
完美,接下来我们写一个打印这个视图的所有方法的函数。这些代码来自这里,这个网站可以找到更多cyript有用的用法。
[AppleScript] 纯文本查看 复制代码 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);
free(count);
return methodsArray;
}
接下来让我们打印这个视图的所有方法,注意参数是类名,在这里参数是ViewController。
另外,也可以使用isa.message属性来获取方法名。根据Apple的官方文档解释说,isa是一个指向类的结构。
When a new object is created, memory for it is allocated, and its instance variables are initialized. First among the object’s variables is a pointer to its class structure. This pointer, called isa, gives the object access to its class and, through the class, to all the classes it inherits from.
以上是官方的说法,意思是一个新对象被创建,分配给它一块内存并且它的实例变量被初始化,这个对象的第一个变量指向他的类结构,这个指针就是isa。给予这个对象访问这个类、父类和所以它继承的类的访问权限。也就是这个对象可以使用后者的方法和属性等。
看下图能更清晰看出这个,图来源此处
那么什么是message属性?Well,我们必须先知道什么是分发表(dispath table),打个比喻,分发表可看做一本书的目录,我们可以通过目录快速找到所需要的目标,而分发表和目录类似,我们可以通过分发表很快找到这个类的方法的selector和与之关联的地址。官方解释
|