iOS逆向(9)-Cycript,动态分析APP利器

之前文章已经对LLDB进行了介绍和使用。LLDB在我们调试应用的时候确实很爽,但他每次都要断住程序,这在分析并且修改APP的时候确实是一个优势,但是在面对一个比较大型的项目,我们需要整体分析的时候,这样调试就显得有些力不从心了。而Cycript就可以弥补上这个需求。

Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了OC、JavaScript语法的解释器,这意味着我们能够在一个命令中使用Oc或者JavaScript,甚至两者并用。它能够挂钩正在运行的进程,能够在运行时修改很多东西。

一、语言分类

  • 编译型语言(OC)
    需要将源码经过编译器编译,生成对应架构的可执行文件(二进制)

  • 解释型语言(Python)
    源码不需要编译器提前编译,而是在运行的时候,经过一套对应的解释器,临时将源码翻译成二进制让CPU识别。

编译型语言就相当于一个英语娴熟的人看一本英文书籍,不需要借助别的工具了。代价就是学英语这个过程很慢(编译时间长)。
解释型语言就相当于一个不会英语的人看一本英文书籍,这时候就需要借助工具(字典)才能正常阅读。好处的就是没有学习(编译)这么个耗时的过程。

理论上解释型语言在运行效率上会比解释型语言慢很多,但实际上现在有很多牛逼的解释器,在执行特定的代码的时候效率也非常快。原理就是在执行的的时候会将之前解释过的代码缓存起来,之后就不需要重复解释了。如:pypy3

这片文章的主角Cycript就是解释型语言!

二、安装

1、下载安装

Cycript的安装极其简单,在这里下载SDK,下载下来的就是一个可执行文件。文件不大,只有2.9M。

打开终端,CD进入Cycript目录直接运行Cycript

./cycript

不出意外这个时候会有如下报错:

Ruby报错

这是因为本地Ruby版本和Cycript要求的版本不一样导致(其实代码都一样,只是版本号换了就不认识了,真蠢)。

2、解决Ruby

Step 1 查看本地Ruby版本:
cd /System/Library/Frameworks/Ruby.framework/Versions/
ls
Ruby版本

本地显示版本号为:2.3,而Cycript要求的版本号2.0。

解决方案:
复制一本Ruby源码,将其版本号(文件夹名称)改为2.0

Step 2 关闭系统的SIP

在 OS X El Capitan 中有一个跟安全相关的模式叫 SIP(System Integrity Protection ),它禁止让软件以 root 身份来在 Mac 上运行,在升级到 OS X 10.11 中或许你就会看到部分应用程序被禁用了,这些或许是你通过终端或者第三方软件源安装。对于大多数用户来说,这种安全设置很方便,但是也有些开发者或者高级 Mac 用户不需要这样的设置。

  • 电脑重启按住command+R,进入恢复模式
  • 打开终端,输入csrutil disable,重启
  • 如果想打开SIP,重复上两步,命令改为csrutil enable
关闭安全模式
开启安全模式
Step 3 直接把2.3的复制一份,改为2.0即可

重启电脑后,运行如下命令:

sudo mkdir -p /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/
sudo ln -s /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/libruby.2.3.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib

注:根据每个人ruby版本不同,将上面第二条命令的/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/libruby.2.3.0.dylib中的2.3改成本机的ruby版本。
这里不是降级ruby,只是复制一份2.0的ruby的dylib,让cycript运行起来。

Copy
文件夹

再次运行

./cycript

如果出现 cy#即代表进入Cycript环境了。

Cycript

3、配置环境变量

Step 1 移动Cycript

/opt目录是专门放置一些额外功能包的目录,所以我们将Cycript也放在该目录下。

移动Cycript

Step 2 环境变量

进入用户的根目录,里面有个文件.bash_profile,用文本编辑器打开。

用户根目录

如果你们有这个文件,就用vim新建一个吧。注意一定要用vim新建哦!
输入如下命令:

export CY=/opt/cycript_0.9.594/
export PATH = $CY:$PATH
bash_profile

Save保存。之后就可以在任意目录下使用Cycript了。

三、简单使用

1、基本的语法

基本的语法

2、基本调试

上篇文章中已经介绍了Monkey,并且可以看出它已经帮我们集成了Cycript的动态库。所以一下就配合着Monkey来进行调试。

马不停蹄,新建一个Monkey工程,将已经砸壳成功的优酷ipa包放入对应的Target目录下。详情参考:

由于Monkey默认开放了一个端口号6666,如图:

端口号6666

所以我们就使用Cycript连接端口号6666,找到手机连接的Wifi的IP地址:

Wifi的IP

我这的是:192.168.32.113
所里在终端输入指令:

cycript -r 192.168.32.113:6666

如果你那一直停在这一步,没有进入Cycript环境


无法进入Cycript

那么有三种可能

  • 手机和电脑必须处于同一个wifi
  • wifi有问题,换一个wifi试试,或者直接使用手机开个热点,电脑连上你的热点
  • 端口号被占用,需要换一个端口(先换Monkey开放的端口,再换指令连接的端口)

一切正常后就可以开始调试了,见如下图:

基本调试

// 查看当前的KeyWindow
UIWindow.keyWindow()
// 自定义变量
var keyWindow = UIWindow.keyWindow()
keyWindow
// 隐藏状态栏
[UIApp setStatusBarHidden:YES];
// 使用地址查看
#0x108e3cd80
// 查看一个对象下的所有变量
*#0x108e3cd80
// 查看一个对象下成员变量的名字
[i for(i in *keyWindow)]
// 格式化输出当前View的层级关系
keyWindow.recursiveDescription().toString()
// 显示当前View下的所有的Button
choose(UIButton)

3、高级用法

在之前的文章 LLDB,自制LLDB脚本,窜改微信红包金额 中介绍了LLDB可以自己定义脚本以方便自己使用,同样Cycript也是可以做到自定义API。

1、新建cy文件

新建一个cy文件,取名FYTest.cy


FYTest.cy
2、定义变量和函数

在FYTest.cy中定义变量和函数

// 获取AppID
FYAPPID = NSBundle.mainBundle.bundleIdentifier;
// 获取沙盒目录
FYAPPPATH = NSBundle.mainBundle.bundlePath;

FYRootVC = function(){
    return UIApp.keyWindow.rootViewController;
};

FYGetCurrentVCFromRootVC = function(rootVC){
    var currentVC;
    if([rootVC presentedViewController]){
        rootVC = [rootVC presentedViewController];
    }
    
    if([rootVC isKindOfClass:[UITabBarController class]]){
        currentVC = FYGetCurrentVCFromRootVC(rootVC.selectedViewController);
    }else if([rootVC isKindOfClass:[UINavigationController class]]){
        currentVC = FYGetCurrentVCFromRootVC(rootVC.visibleViewController);
    }else{
        currentVC = rootVC;
    }
    return currentVC;
};

// 获取当前VC
FYCurrentVC = function(){
    return FYGetCurrentVCFromRootVC(FYRootVC());
};

Cy文件
3、导入Cy文件
导入Cy文件_1

导入Cy文件_2
4、使用Cy文件

FYTest.cy文件虽然已经在我们的APP里面了,但是我们每次使用的时候还是需要导入一次。

@import FYTest
使用Cy
5、大神们封装好的cy

Monkey默认帮我们预装好了几个cy文件,分别在一下两张图的位置:

  • MachO中的cy


    MachO中的cy
  • 通过网络加载的cy


    通过网络加载的cy

具体有哪些变量可以用,哪些函数可以用都可以在这找到哦:msmd

四、总结

到此,所有非越狱环境下的东西已经整理完了,接下来将要开启新的篇章:手机越狱、砸壳、以及汇编静态分析。如果你觉得有帮助,就点个小心心吧

参考:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容