天天看点

IOS安全、逆向、反编译3-Cycript

Cycript是Objective-C++、ES6(JavaScript)、Java等语法的混合物, 可以用来探索、修改、调试正在运行的Mac\iOS APP。我们可以通过官网和文档来学习 。

Cycript使用步骤

  1. 在iPhone上通过Cydia安装Cycript,即可在iPhone上调试运行中的APP
  2. 在Mac终端使用SSH连上iPhone
  3. 开启cycript
  4. 在iPhone的root用户目录下,输入cycript
  5. 调试iOS App

    5.1 获取需要调试的app的进程id(当然首先需要启动这个app)

    在iPhone上安装adv-cmds插件, 然后就可以使用ps -A(或者ps aux) 命令来显示当前iPhone所有的进程信息,从里面找到对应的进程id。

    如果数据太多,可以通过(ps –A | grep 关键词)来根据关键词筛选。

    注 : ps命令是process status的缩写,使用ps命令可以列出系统当前的进程。

    5.2 通过以下命令关联App进程

    cycript -p 进程ID

    或者cycript -p 进程名称

    5.3 通过cycript代码操作App, 例如

    UIApp <-> 打印UIApplication单例对象

    [UIApplication sharedApplication] <-> 打印UIApplication单例对象

    var 变量名 = 变量值 <-> 定义变量

    #内存地址 <-> 用内存地址获取对象

    ObjectiveC.classes <-> 已加载的所有OC类

    *对象 <-> 查看对象的所有成员变量

    view.recursiveDescription().toString() <-> 递归打印view的所有子控件(跟LLDB一样的函数)

    choose(UIViewController) <-> 筛选出某种类型的对象

    choose(UITableViewCell) <-> 筛选出某种类型的对象

注:

取消输入 Ctrl + C

退出 Ctrl + D

清屏 Command + R

Cycript高级使用

我们可以将常用的Cycript代码封装在一个.cy文件中,例如我们可以将获取当前app的主窗口的根视图控制器的代码封装到一个文件中。

  • 新建一个文件mycycript.cy
  • 使用文本编辑工具(vim或者Sublime Text)编辑mycycript.cy文件
  • 输入下面代码

//exports参数名固定,用于向外提供接口

(function(exports){

        exports.rootVC = function() {

                  return UIApp.keyWindow.rootViewController;

        };

        keyWin = function() {

              return UIApp.keyWindow

      }

})(exports)

那么这个mycycript.cy文件怎么使用呢?

  1. 我们可以将这个文件放到iPhone的/usr/lib/cycript0.9目录下
  2. 按照上面的Cycript的使用步骤先SSH登录iPhone,然后开启Cycript,关联上app进程
  3. 在命令行导入文件@import mycycript, 其中mycycript是自己定义的文件名。

    如果这个文件有更多的子目录,例如放在了/usr/lib/cycript0.9/com/baidu下面,那么是@import com.baidu.mycycript

  4. 使用定义的函数或者变量

    在命令行输入mycycript.rootVC()打印根视图控制器

    在命令行输入keyWin()打印主窗口对象

    注意:rootVC函数定义时前面加了exports表示这个函数属于文件,所以调用时前面需要加上文件名.函数名(), keyWin函数定义时前面什么也没有写,表示是全局函数,调用时函数名前面就 不 需要加文件名.函数名()。