iOS逆向-用Cycript进行运行时分析(微信应用)

用Cycript进行实时修改
本文,我们将使用微信应用来执行所有的测试。一旦微信应用应用被安装好,请确保它运行在前台。这是因为如果应用在后台,那它就会被暂停,你也不能对它做啥。

1)使用ssh命令连接手机

(SSH怎么用在简书搜索哈!)

wanggangdeMacBook-Pro:~ wanggang$ ssh root@192.168.1.100
//输入ssh 密码
root@192.168.1.100's password: 

2)勾住进程

一旦应用跑起来,你可以先找到其进程id,然后用cycript -p挂钩其进程。

//连接手机
wanggangdeMacBook-Pro:~ wanggang$ ssh root@192.168.1.100
//输入密码
root@192.168.1.100's password: 
shujinokinakenkou:~ root# ps aux | grep "weather"
mobile   15312   0.0  2.2   897008  21904   ??  Us    6:50PM   0:07.76 /var/mobile/Containers/Bundle/Application/A402E082-7FA0-40DC-9423-ADA502E06CE2/com.yahoo.weather-35524-distribution.app/yweather
root     15352   0.0  0.0   538432    496 s000  R+    7:04PM   0:00.02 grep weather
shujinokinakenkou:~ root# cy#
-sh: cy#: command not found

//勾住we chat 列出 mobile id
shujinokinakenkou:~ root# ps aux | grep WeChat
root     15361   7.1  0.1   538432    536 s000  S+    7:08PM   0:00.05 grep WeChat
mobile   15323   1.1  4.5  1041712  45096   ??  Ss    6:50PM   0:12.23 /var/mobile/Containers/Bundle/Application/B02EC742-D61A-4F7B-B5DC-9598FF2DD165/WeChat.app/WeChat
shujinokinakenkou:~ root# cycript 15312
*** _assert(!stream->fail()):../Console.cpp(1098):Main

//勾住进程id 微信的进程id 是15323 mobile 后面的就是
shujinokinakenkou:~ root# cycript -p 15323

//下面使用cy语言愉快的调试了
cy# var delegate = UIApp.delegate
#"<MicroMessengerAppDelegate: 0x13f76f8f0>"
cy# var window = delegate.window
#"<iConsoleWindow: 0x13f68b6d0; baseClass = UIWindow; frame = (0 0; 414 736); autoresize = W+H; gestureRecognizers = <NSArray: 0x13f68d020>; layer = <UIWindowLayer: 0x13f68b6b0>>"
cy# var rootVC = windown.rootViewController
throw new ReferenceError("Can't find variable: windown")

出现下面代码说明勾住进程成功

root     15361   7.1  0.1   538432    536 s000  S+    7:08PM   0:00.05 grep WeChat
mobile   15323   1.1  4.5  1041712  45096   ??  Ss    6:50PM   0:12.23/var/mobile/Containers/Bundle/Application/B02EC742-D61A-4F7B-B5DC-9598FF2DD165/WeChat.app/WeChat

如果挂钩成功,你可以得到一个Cycript解释器。你可以通过Objective-C的语法 [UIApplication sharedApplication].来得到实例。

3)实战

执行隐藏和显示状态栏的命令

cy# var delegate
cy# [[UIApplication sharedApplication] setStatusBarHidden:YES]
cy# [[UIApplication sharedApplication] setStatusBarHidden:NO]
cy# [[UIApplication sharedApplication] setStatusBarHidden:YES]
cy# [[UIApplication sharedApplication] setStatusBarHidden:YES]
cy# [[UIApplication sharedApplication] setStatusBarHidden:NO]
cy# [[UIApplication sharedApplication] setStatusBarHidden:YES]
cy# [[UIApplication sharedApplication] setStatusBarHidden:NO]
cy# [[UIApplication sharedApplication] setStatusBarHidden:NO]

显示结果,可以看到执行命令导航栏消失和隐藏

导航栏显示和隐藏.gif

在微信app内弹框执行以下命令

cy#   [[[UIAlertView alloc]initWithTitle:@"cy" message:@"guanzhuwo" delegate:ni cancelButtonTitle:@"ok" otherButtonTitles:nil, nil] show]
cy#   [[[UIAlertView alloc]initWithTitle:@"cy" message:@"guanzhuwo" delegate:ni cancelButtonTitle:@"ok" otherButtonTitles:nil, nil] show]

效果图

弹框提示.gif

更改badge 的值执行如下命令

cy# [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1000]
cy# [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1000]
cy# [[UIApplication sharedApplication] setApplicationIconBadgeNumber:100]
cy# [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]

效果图(观察微信图标右上角小圆点的变化)

badge更改.gif

有了头文件,有了ida反编译,配合上cycript,可以验证我们的各种关于微信代码的猜测,但要将这些猜测串成一个可执行的Tweak,就需要反复的大量的实验。

cycript 还有其他的用法推荐这篇文章
iOS逆向工程(Cycript脚本语言使用与实战)


推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 166,725评论 24 703
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 9,944评论 4 55
  • 11月初有一笔钱入账,两三个月后可能会用到,正常思路就是直接扔货币基金里不管它。但人嘛,就是喜欢作,好像不折腾一下...
    地心阅读 861评论 0 50
  • 昨晚《欢乐颂》2终于大结局了,剧中最接地气的人物就是樊大姐,边追剧边骂编剧的我,曾感叹世事对她的不公、期待她和王帅...
    爱上小概率阅读 393评论 0 3
  • 忽然对心理学失去兴趣了。 说起来这种征兆前面冬天就开始有,缓慢增长,今天是来的剧烈……几乎兴趣全无了。 终于厌倦了...
    嫏嬛素素阅读 157评论 0 1