天天看点

IOS逆向学习-Cycipt1. Cycript

IOS逆向学习-Cycipt

  • 1. Cycript
    • 1.1 Cycript简介和安装
    • 1.2 Cycript的开启和关闭
    • 1.3 Cycript的常用语法
    • 1.4 自己的Cycript-.cy文件
    • 1.5 Reveal
    • 1.6 ipa安装过程
    • 1.7 逆向APP的思路
    • 1.8 class-dump
    • 1.9Hopper Disassmbler

1. Cycript

1.1 Cycript简介和安装

  • Cycript是Objective-C++、ES6(JavaScript)、Java等语法的混合物
  • 可以用来探索、修改、调试正在运行的Mac、IOS App
  • 官网:http://www.cycript.org/
  • 文档:http://www.cycript.org/manual/
  • 通过Cydia安装Cycript,即可在iPhone上调试运行中的APP
  • Cycript支持的语言:
    IOS逆向学习-Cycipt1. Cycript
  • Cydia中安装Cycript(如果发现失败,报错:can’t find a source to download version… 请刷新下全部的源,在安装):
    IOS逆向学习-Cycipt1. Cycript

1.2 Cycript的开启和关闭

  • 如何获取手机app的进程id和进程名称
    • 需要在手机上安装

      adv-cmds

      ,在安装Cycript的时候就已经安装了

      adv-cmds

    • ps

      命令是

      process status

      的缩写,使用ps命令可以列出系统当前的进程
    • ps -A

      : 列出所有的进程
    • ps -A | grep 关键词

      :所有关键词相关的进程
    • 查询手机上当前所有进程、根据关键字搜索进程,以网易云音乐为例:
      IOS逆向学习-Cycipt1. Cycript
  • cycript

    : 进入cycript语言编程环境
    • cycript -p 进程ID

      或则

      cycript -p 进程名称

      都进入某个app的调试状态
    • ctrl + D

      : 退出调试环境
    • 注意:建议使用进程的名称,因为进程名称只要app装在手机上,可执行文件就是不变的,所以名称不会变,而进程的id可能时刻都在变化
    • 进入某个app的调试环境(以网易云音乐为示例):
      IOS逆向学习-Cycipt1. Cycript
    • ctrl + C

      : 取消输入

1.3 Cycript的常用语法

  • UIApp

    :

    [UIApplication shareApplication]

  • 定义变量:

    var 变量名 = 变量值

  • 用内存地址获取对象:

    #内存地址

  • ObjectiveC.classes

    :已加载的所有OC类
  • 查看对象的所有成员变量:

    *对象

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

    view.recursiveDescription().toString()

    IOS逆向学习-Cycipt1. Cycript
  • 刷选出某种类型的对象:

    choose(UIViewController)

    choose(UITableViewCell)

  • 常用语法示例:
    • #对象地址

      : 获取当前对象
      IOS逆向学习-Cycipt1. Cycript
    • 获取类的所有成员变量(

      *UIApp

      ):
      IOS逆向学习-Cycipt1. Cycript
    • 递归打印所有子控件(

      UIApp.keyWindow.recursiveDescription().toString()

      ):
      IOS逆向学习-Cycipt1. Cycript
    • cycript自带函数:

      choose(xxxxx)

      筛选某种类型的对象:
      IOS逆向学习-Cycipt1. Cycript

1.4 自己的Cycript-.cy文件

  • 首先我们可以下载一个超级编辑器

    sublimetext

    • 官网:http://www.sublimetext.com
  • 我们可以将常用的Cycript代码封装在一个.cy文件
    • 首先需要编写一个

      .cy

      文件
    • .cy

      文件拷贝到iPhone端的

      usr/lib/cycript0.9

      目录下
    • 终端进入调试环境,然后导入写好的.cy文件 然后使用
    • 导入方式如下图:
      IOS逆向学习-Cycipt1. Cycript
  • exports

    参数名固定,用于向外部提供接口,如果

    .cy

    文件内部的属性和方法没有用

    exports

    来修饰,那么在外部是无发访问的,在js中在函数中声明函数属于私有
    IOS逆向学习-Cycipt1. Cycript
  • 外部调用方法是类型(文件名).函数名(变量名):
    IOS逆向学习-Cycipt1. Cycript

*如果想实现全局函数,则不需要使用exports关键字来修饰,则可以直接调用

IOS逆向学习-Cycipt1. Cycript
IOS逆向学习-Cycipt1. Cycript

由上图可知,没有使用exports关键字修饰的方法和属性 都不属于test,所以我们导入test时候,发下里面只有使用exports关键字来修饰的方法和属性

  • 如果把封装的文件没有放入到cycript的根路径下,那么在导入你自己写的库时需要带上路径
    IOS逆向学习-Cycipt1. Cycript
  • MJ封装Cycript库

1.5 Reveal

  • Reveal是一款调试IOS程序UI界面神器
  • 官网:Reveal官网下载,本人这里是在玩转苹果上下载一个Reveal24版本的
  • iPhone上安装Reveal Loader 工具,但是此版本很久了, 本人安装的是Reveal2Loader ,直接在Cydia中搜索即可:
    IOS逆向学习-Cycipt1. Cycript
  • 调试配置环境
    • 在Mac和iPhone上安装软件之后,连接之后调试APP的时候可能会报错:

      The operation couldn’t be completed. The app is linked against an older version of the Reveal library. You may need to update the Reveal library in your app.

    • 网上很多的资料是说 把

      RevealServer

      文件拷贝到iPhone的

      /Library/RHRevealLoader/RevealServer

      文件, 如果路劲不存在的话就自己创建, 这里本人试过,但是没有用。

      正确操作如下

    • 首先找到Mac的Reveal中的

      RevealServer

      文件,覆盖iPhone的

      /Device/Library/Frameworks/RevealServer.framework

      中的

      ReverServer

      文件
      IOS逆向学习-Cycipt1. Cycript
      IOS逆向学习-Cycipt1. Cycript
      IOS逆向学习-Cycipt1. Cycript
  • 经过上述文件替换之后, 我们重启Mac上的Reveal,在打开手机上的app就可以正常调试界面了,如果你的手机和电脑连着同一个wifi,会出现wifi标志的选择, 插着USB线,会出现USB线调试的选择, 一般会选择USB的选项,速度比较快
    IOS逆向学习-Cycipt1. Cycript
  • 重启SpringBoard或则重启手机,可以在iPhone上输入终端命令
    • 重启SpringBoard :

      killall SpringBoard

    • 重启手机:

      reboot

1.6 ipa安装过程

  • ipa的安装: Mach-o 文件(IOS中代码可执行文件的格式)
    IOS逆向学习-Cycipt1. Cycript

1.7 逆向APP的思路

  • 界面分析:Cycript、Reveal
  • 代码分析:对Mach-O文件的静态分析
  • MachOView、class-dump、Hopper Dosassember、ida等软件
  • 动态调试:对运行中的APP进行代码调试;

    debugserver

    LLDB

  • 代码编写:注入代码到APP中,必要时还可能需要重新签名、打包ipa

1.8 class-dump

  • class-dump

    :顾明思议,它的作用就是吧Mach-O文件的class信息给dump出来(把类信息导出来),生成对应的.h文件,官网地址:http://stevenygard.com/projects/class-dump/
  • Mac上终端编译指令为什么输入就会找到,而有些是找不到, 那是因为你执行的命令,mac会去两个地方寻找(

    user/bin

    user/local/bin

    ),
    IOS逆向学习-Cycipt1. Cycript
  • 平时所有用到的指令都在这两个文件夹下,所以我们执行

    cd

    等指令都可以直接执行,但是 在mac系统10.11 开始 usr/bin目录已经不能写数据了, 所以我们可以把

    class-dunmp

    执行文件放在

    local/bin

    目录下,这样你在执行

    class-dump

    指令时不会出现找不到该指令
  • 常用格式:

    class-dump -H Mach-O文件路径 -o 头文件存放目录

  • class-dump

    Mac-o

    文件的可执行头文件导出来,根据头文件我们可以分析app的一些类、函数。代码编译过程:
    IOS逆向学习-Cycipt1. Cycript
  • class-dump是分析机器语言,然后导出一些头文件:
    IOS逆向学习-Cycipt1. Cycript

1.9Hopper Disassmbler

  • Hopper Disassmbler能够将Mach-O文件的机器语言代码反编译成汇编代码、OC伪代码或则swift伪代码
  • 常用快捷键 : Shift + option + X()找出哪里引用了这个地方
  • 可以分析以下苹果框架的方法调用流程, 可以看一些伪代码 ,大概知道调用过程 还是比较实用的
  • 软件 百度搜索下载即可