iOS逆向-day3:Cycript

作者: IIronMan | 来源:发表于2019-11-29 13:03 被阅读0次

    一、Cycript 简介

    • 1.1、Cycript 是Objective-C++、ES6(JavaScript)、Java等语法的混合物,可以用来探索、修改、调试正在运行的 Mac / iOS APP
      官网
      文档
      通过Cydia安装Cycript,即可在iPhone上调试运行中的APP
    • 1.2、Cycript的开启和关闭
      • 开启(进程的查看需要借助 PS指令,请看1.3)

        cycript
        cycript -p 进程ID
        cycript -p 进程名称
        
        • 爱奇艺的进程是 2613,那么输入:cycript -p 2613,之后的操作都是在调试爱奇艺
        • 建议使用进程名称(如爱奇艺:cycript -p iQiYiPhoneVideo),因为进程的ID一直在变
      • 取消输入:Ctrl + C

      • 退出:Ctrl + D

      • 取消输入:Command + R

    • 1.3、ps 命令
      • 安装 adv-cmds
      • ps命令是 process status的缩写,使用ps命令可以列出系统当前的进程
        • 列出所有的进程

          ps –A
          ps aux
          

          提示:输入上面的指令是在 终端连接iphone的情况下


          上图左边进程 ID右边进程的可执行文件,右边最后一个单词可以称为进程的名称,如上图的:launch、amfid、syslogd.......
        • 搜索关键词,如果是爱奇艺,可以搜索 Video

          ps –A | grep 关键词
          

    二、Cycript常用语法

    • 2.1、常用语法一

      • (1)、获取UIApplication 对象,下面等价

        UIApp
        [UIApplication sharedApplication]
        
        • 说明爱奇艺的UIApplication 就是 UIApplication,没有改名字
      • (2)、定义变量:var 变量名 = 变量值

         // 获取 app的Window
         var appWindow = UIApp.keyWindow
         // 获取根控制器
         app.rootViewController
        

        以爱奇艺为例打印的是:<RootViewController: 0x12e075600>",说明爱奇艺的根控制器就是:RootViewController

      • (3)、用内存地址获取对象:#内存地址

      • (4)、ObjectiveC.classes:已加载的所有OC类,如下查看 糗事百科的主界面

        WechatIMG45.jpeg
      • (5)、查看对象的所有成员变量:*对象,如查看 UIApplication 里面的所有成员变量,可以如下

        *UIApp
        
    • 2.2、常用语法二

      • (1)、递归打印view的所有子控件(跟LLDB一样的函数)

        view.recursiveDescription().toString()
        
      • (2)、筛选出某种类型的对象

        choose(UIViewController)
        choose(UITableViewCell)
        
    • 2.3、上面的使用太繁琐了,我们可以使用 MJ 老师的工具: mjcript,它是基于Cycript实现的一些实用函数

      • 安装
      • 步骤
      • (1)、下载mjcript库
      • (2)、将mjcript.cy文件拖到/usr/lib/cycript0.9,建议下载 funbox 来管理文件
      • (3)、SSH连接iOS设备,这个如果不会的可以参考 上一篇博客
      • (4)、使用Cycript监听APP,通过 @import导入mjcript


    • 2.4、mjcript 工具的用法

      • 一些常用属性
      • 拿到显示在最前面的控制器,下面以糗事百科为例
      • 我们可以看到 糗事百科 我的界面的控制器叫做:QBMeViewController
      • 获得某个类的 对象方法名列表,支持正则表达式查询

        MJInstanceMethodNames(控制器的名字 或者 #地址)
        // 举个正则的例子,找有关login的对象方法
        MJInstanceMethodNames(控制器的名字 或者 #地址,/login/) 
        
        • 我这里是以糗事百科的设置界面为例
      • 获得某个类的 类方法名列表,支持正则表达式查询

        MJClassMethodNames(控制器的名字 或者 #地址)
        
      • 获取界面的 view,下面以糗事百科的登录界面为例

        MJSubviews(#地址.view)
        

        接着我们可以在登录界面的文本框上动手脚,比如修改


        用: #内存地址.text = "190" 来修改手机号的输入
        #0x1443a7e00.text = "190"  
        

        我们还可以找到登录按钮 ,把它移除掉,如下


        拿到登录的按钮地址,做如下操作

        [#0x1443b9f60 removeFromSuperview]  
        
        • 这里做一个小提示:汉子与unicode码转换的方式,下面是用Python

          python
          unicode('登录','UTF-8')
          u'\u767b\u5f55'
          

    三、封装Cycript - .cy文件

    • 3.1、.cy文件 的简单写法,我的文件名是:jkcycript

      (function(exports) {
           // 这里面可以填充我们需要的东西
      
      })(exports);
      

      函数 和 常量的定义

      (function(exports) {
           //  求和
           sum = function(a,b) {
               return a + b
           };
           //  求差
           minus = function(a,b) {
               return a - b
           };
      })(exports);
      // 在使用的时候我们需要如下操作
      // 导入: @import jkcycript
      @import jkcycript
      sum(2,3) // 结果是:5
      

      上面是全局的,如果想要前缀可以写为

      (function(exports) {
           //  求和
           exports.sum = function(a,b) {
               return a + b
           };
           //  求差
           exports.minus = function(a,b) {
               return a - b
           };
      })(exports);
      // 在使用的时候我们需要如下操作
      // 导入: @import jkcycript
      @import jkcycript
      jkcycript.sum(2,3) // 结果是:5
      
      • exports 参数名固定,用于向外提供接口
      • .cy文件存放到/usr/lib/cycript0.9目录下
    • 3.2、更多的可以参考MJ老师的mjcript

    四、Reveal (UIView层级分级工具)

    Reveal
    • 4.1、Reveal是一款调试iOS程序UI界面的神器
      官网:https://revealapp.com
      下载:https://revealapp.com/download/
      破解版:提取码: y8ri
      建议下载至少Reveal4版本,支持USB连接调试,速度快。低版本的只能WiFi连接调试

      提示 :Reveal 只能识别 UIView 的层级结构,想要是识别控制器的结构,我们可以使用 mjcript

    • 4.2、Reveal 调试环境配置 (越狱设备)

      • 调试环境配置 一 :iPhone上安装Reveal Loader
        软件源:http://apt.so/codermjlee,不要安装其他源的版本,有可能不支持新版Reveal


      • 调试环境配置 二
        安装完Reveal Loader后,打开【设置】,选择需要调试的APP

      • 调试环境配置 三
        找到Mac的Reveal中的 RevealServer 文件,覆盖iPhone的/Library/RHRevealLoader/RevealServer文件,我们可以用 iFunBox 打开


        WechatIMG61.jpeg
        • 重启SpringBoard或者重启手机,可以在iPhone上输入终端命令
          重启SpringBoard:killall SpringBoard
          重启手机: reboot
    • 4.3、在上面的操作做完,我们再重新打开 Reveal ,就可以看到使用中的iphone

      选择USB方式开始调试:速度更快
      屏幕快照 2019-11-29 下午1.01.29.png

    相关文章

      网友评论

        本文标题:iOS逆向-day3:Cycript

        本文链接:https://www.haomeiwen.com/subject/bfxxwqtx.html