使用 CocoaPods 给微信集成 SDK 打印收发消息
推荐序
本文介绍的是一套逆向工具,可以在非越狱手机上给任意应用增加插件。在文末的示例中,作者拿微信举例,展示出在微信中打印收发消息的功能。
这套工具可以加快逆向开发的速度,其重签名思想也可以用于二次分发别人的应用。
其实这也展示出苹果在应用安全上的防护还需要加强,希望“董小姐”可以看到本文(偷笑)。
作者介绍:刘培庆,目前在网易信息安全部门工作。个人博客地址: http://www.alonemonkey.com/。感谢作者授权转发。
背景
笔者本身是一个iOS逆向的爱好者,曾在使用iOSOpenDev在Xcode开发越狱插件的时候,由于工具已经好几年没有更新,安装和使用起来都会诸多问题,所以最初笔者只是想改良iOSOpenDev的兼容问题,后面在开发中不断冒出新的idea,并在工具中实现了这些想法,所以就有了本文将要给大家强烈推荐的工具MonkeyDev。
用途
在使用之前,大家关心的都是它的功能,可以做什么。那么MonkeyDev这个工具可以做什么呢?总结来说可以做如下这些事情:
可以使用Xcode开发CaptainHook Tweak、Logos Tweak 和 Command-line Tool,在越狱机器开发插件,这是原来iOSOpenDev功能的迁移和改进。
只需拖入一个砸壳应用,自动集成Reveal、Cycript和注入的动态库并重签名安装到非越狱机器。
支持调试自己编写的动态库和第三方App
支持通过CocoaPods第三方应用集成SDK以及非越狱插件,简单来说就是通过CocoaPods搭建了一个非越狱插件商店。
大概了解了之后下面就通过具体的实际应用来体会它的强大之处吧。
环境准备
在使用之前首先是环境的配置,如果配置不对的话,可能会出一些奇怪的问题,你也可以结合Wiki来操作。
安装最新的theos
git clone --recursive https://github.com/theos/theos.git /opt/theos
安装ldid
brew install ldid
如果是用于越狱开发,需要配置免密码登录越狱设备,如果没有越狱机器可以跳过这步。
ssh-keygen -t rsa -P ''
ssh-copy-id -i /Users/username/.ssh/id_rsa root@ip
安装
你可以通过如下命令选择指定的Xcode进行安装,也可以默认安装。
指定Xcode安装:
sudo xcode-select -s /Applications/Xcode-xxx.app
默认安装的Xcode:
xcode-select -p
执行安装命令:
git clone https://github.com/AloneMonkey/MonkeyDev.git
cd MonkeyDev/bin
sudo ./md-install
如需卸载,执行卸载命令:
sudo ./md-uninstall
如需更新,执行更新命令:
sudo ./md-update
模块介绍
安装完成之后,打开Xcode,点击File - New - Project...
,选择iOS滑动到最下方可以看到MonkeyDev提供的模块:
介绍下这几个模块的用途:
越狱模块
CaptainHook Tweak
使用CaptainHook提供的头文件进行OC函数的Hook,以及属性的获取。
Logos Tweak
使用theos提供的logify.pl工具将.xm文件转成.mm文件进行编译,默认集成CydiaSubstrate,可以使用MSHookMessageEx
和MSHookFunction
来Hook OC函数和指定地址。
Command-line Tool
可以直接创建运行于越狱设备的命令行工具
非越狱模块
MonkeyApp
这是自动给第三方应用集成Reveal、Cycript和注入dylib的模块,支持调试dylib和第三方应用,支持Pod给第三放应用集成SDK,只需要准备一个砸壳后的ipa或者app文件即可。
功能介绍
关于CaptainHook Tweak、Logos Tweak 和 Command-line Tool的使用这里不再介绍,有问题可以查看项目Wiki
下面主要介绍MonkeyApp的使用,开启你的非越狱插件开发之旅~
准备
在开始使用前,需要准备一个砸壳后的应用,可以使用越狱手机砸壳,然后获取ipa或app,没有越狱手机直接从某助手下载越狱应用即可。
创建项目
点击File - New - Project...
创建iOS项目,选择MonkeyApp
。
创建完成之后,你会得到一个这样的工程:
这里我创建的项目名字就是MonkeyApp
,所以下面对应的都是MonkeyApp
,你自己创建的由你的项目名字而定! 另外Xcode 8需要另外在App里面增加动态库的依赖,如下:
MonkeyAppDylib
这个是将被注入目标App的动态库,你自己要hook的代码可以在MonkeyAppDylib.m
文件里面写,我在里面写了一些Demo代码,直接运行即可看到效果,支持OC runtime的HOOK,C函数的fishhook。
AntiAntiDebug
这个里面是反反调试的代码。
fishhook
这个是自动集成的fishhook模块。
下面Framewroks已经自动集成了Reveal.framework
和Cycript.framework
。
拖入砸壳应用编译
打开某助手选择应用游戏里面的越狱应用,下载一个应用就是已经砸壳了的。
然后打开TargetApp目录,拷贝ipa文件到当前目录下面,如下图所示:
然后点击运行即可,运行后可以从控制台看到动态库已经注入成功,Reveal已经成功加载!当然手机上面也运行起来了!
打开Mac上的Reveal即可查看应用的界面结构啦!如下图所示:
默认还集成了Cycript,从Cycript官网下载SDK,然后进去SDK目录运行如下命令即可:
./cycript -r iphoneip:6666
获取微信消息
下面以一个简单获取微信收到的消息为例,来进一步介绍它的使用,首先打开MonkeyAppDylib.m
文件,在最下面写入如下代码:
@interface CMessageWrap
@property (nonatomic, strong) NSString* m_nsContent;
@property (nonatomic, assign) NSInteger m_uiMessageType;
@end
CHDeclareClass(CMessageMgr)CHMethod2(void, CMessageMgr, AsyncOnAddMsg, NSString*, msg, MsgWrap, CMessageWrap*, msgWrap){NSString* content = [msgWrap m_nsContent];if([msgWrap m_uiMessageType] == 1){NSLog(@"收到消息: %@", content);}CHSuper2(CMessageMgr, AsyncOnAddMsg, msg, MsgWrap, msgWrap);
}CHConstructor{CHLoadLateClass(CMessageMgr);CHClassHook2(CMessageMgr, AsyncOnAddMsg, MsgWrap);
}
然后重新运行就能看到效果了:
然后就可以愉快的开发非越狱插件了,还可以直接调试!
使用CocoaPods集成SDK
MonkeyDev还支持CocoaPods给第三方应用集成SDK,新建Podfile,写入:
target 'MonkeyAppDylib' dopod 'FLEX'
end
这里的Target要设置为动态库而不是App,然后执行Pod install。然后将如下选项改回Yes。
在MonkeyAppDylib.m
文件中加入SDK初始化代码:
#import <FLEX/FLEXManager.h>void initCycriptServer(){[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {[[FLEXManager sharedManager] showExplorer];CYListenServer(6666);}];
}
运行效果如下:
非越狱插件商店
既然可以支持CocoaPods了,那么完全可以将自己写的非越狱插件传到CocoaPods,然后通过pod一键安装!
下面就将上面写的获取微信消息插件放到CocoaPods,新建Cocoa Touch Framework
项目,然后增加头文件CaptainHook.h
和自己的源文件PrintWXMessage.m
,并将上面的代码拷贝过来,如下图所示:
然后生成framework弄成zip包(zip包需要包含模拟器和真机的架构才能通过本地验证),编辑PrintWXMessage.podspec
文件内容如下:
Pod::Spec.new do |spec|spec.name = "PrintWXMessage"spec.version = "1.0.0"spec.summary = "Print WX Message for MonkeyDev"spec.description = <<-DESC- Print WX Message for MonkeyDevDESCspec.homepage = "https://github.com/AloneMonkey/MonkeyDev"spec.license = { :type => "BSD", :file => "LICENSE" }spec.author = { "AloneMonkey" => "liupeiqing1993@163.com" }spec.social_media_url = "http://weibo.com/xiaoqing28"spec.platform = :ios, "8.0"spec.source = { :http => "https://github.com/AloneMonkey/MonkeyDevPod/raw/master/PrintWXMessage/LatestBuild/PrintWXMessage.zip"}spec.vendored_frameworks = "PrintWXMessage.framework"
end
这里source直接写的是zip包的地址,里面就是笔者生成的framework动态库。
增加私有CocosPods:
pod repo add MonkeyDevSpecs https://github.com/AloneMonkey/MonkeyDevSpecs.git
将PrintWXMessage包发布到私有Pod:
pod repo push MonkeyDevSpecs PrintWXMessage.podspec
修改Podfile文件内容如下,然后pod install安装,并且把原来写在MonkeyAppDylib.m
的打印微信消息的代码删除。
source 'https://github.com/AloneMonkey/MonkeyDevSpecs.git'target 'MonkeyAppDylib' dopod 'PrintWXMessage'
end
~ MonkeyApp pod install
Cloning spec repo `alonemonkey` from `https://github.com/AloneMonkey/MonkeyDevSpecs.git`
Analyzing dependencies
Downloading dependencies
Installing PrintWXMessage (1.0.0)
Generating Pods project
Integrating client project[!] Please close any current Xcode sessions and use `MonkeyPod.xcworkspace` for this project from now on.
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
运行即可看到插件已经完美集成成功!!!
MonkeyDev项目地址请点击阅读原文查看。
https://github.com/AloneMonkey/MonkeyDev
内容转载自公众号
相关文章:

数据库之子查询四(多重,表复制)
一、多重子查询 select teaID,teaName,age,sex,dept,professionfrom tteacherwhere dept(select dept from teaIDt103265)and profession(select professionfrom tteacherwhere teaIDt103265)这里的子查询就是为了从表中提取出有效信息参与外部查询二、create table 语句中子查…

Nagios的安装和基本配置(三:Nagios-Client的安装)
任务三、Nagios-Client的安装 3.1、关闭防火墙和selinux 注: #systemctl stop firewalld.service #systemctl disable firewalld.service #vi /etc/selinux/config 3.2、配置环境 #yum install gcc glibc-common -y #yum install gd gd-devel openssl openssl…

事件(待完成)
内容窗口 事件绑定 给整个浏览器 内容窗口区的事件绑定。 通过 document.documentElement或者document.body?似乎都可以。但最好是直接通过document document.addEventListener(mousemove,function () { });// 整个浏览器内容范围都将触发。拖动实现必用 转载…
iOS 模仿支付宝支付到账推送,播报钱数
最近申请了支付宝的二维码收钱码,其中支付宝有这么一个功能,就是,别人扫描你的二维码给你转账之后,收到钱会有一条语音推送,”支付宝到账 1000万“之类的推送消息,不管你的支付宝app有没有被杀死。 只要你的…

hdu - 4707 - Pet
题意:一棵N个结点(编号从0开始)的树,根结点为0,求到根结点的距离大于D的结点个数(0 < 测试组数T < 10, 0<N<100000, 0<D<N)。 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid4707…

Nagios的安装和基本配置(四:调试验证 错误总结)
任务四、调试验证 4.1、验证连通性 在/usr/local/Nagios/etc/nrpe.cfg文件中server的ip地址 #vi /usr/local/Nagios/etc/nrpe.cfg #重启nrpe #pkill nrpe #netstat -Intp #/usr/local/Nagios/bin/nrpe -d -c /usr/local/Nagios/etc/nrpe.cfg #在server主机做验证 #cd /…
hitTest和pointInside方法
hittest方法 就是用来寻找最合适的view当一个事件传递给一个控件,就会调用这个控件的hitTest方法点击了白色的view: 触摸事件 -> UIApplication -> UIWindow 调用 [UIWindow hitTest] -> 白色view [WhteView hitTest] 实验1: 定义 BaseView&…

Github上的PHP资源汇总大全
依赖管理 ——用于依赖管理的包和框架 Composer/Packagist : 一个包和依赖管理器 Composer Installers: 一个多框架Composer库安装器 Pickle: 可以在任意平台上安装PHP扩展包 依赖管理的附加部分 ——其它依赖管理的相关工具 Satis : 静态的Composer库生成器 Composition: 一个…

UIButton长按事件
添加长按事件1 - (void)viewDidLoad2 {3 [super viewDidLoad];4 //Do any additional setup after loading the view, typically from a nib.5 6 UIButton *aBtn[UIButton buttonWithType:UIButtonTypeRoundedRect];7 [aBtn setFrame:CGRectMake(0, 10, 60, 60…

Hadoop集群搭建(一:集群安装及网络环境配置)
实验目的及要求 完成VMware workstations安装,会应用相关操作;完成虚拟机中Linux CentOS 7操作系统安装;完成静态网络地址的配置,所有主机的网络能够正常使用,相互之间能够正常连接;完成主机名配置&#x…

QQ音乐API分析记录
我一直是QQ音乐的用户,最近想做一个应用,想用QQ音乐的API,搜索了很久无果,于是就自己分析QQ音乐的API。 前不久发现QQ音乐出了网页版的,是Flash的,但是,我用iPhone打开这个链接的时候࿰…
Vision 圖像識別框架的使用
阅读 137收藏 102017-10-18原文链接:www.itread01.comGoogle无人车之父、MIT/斯坦福/耶鲁专家带你进入无人驾驶之域 http://cn.udacity.com/course/intro-to-self-driving-cars--nd113 本文為CocoaChina網友 品位生活 投稿 北京時間2017.6.6日淩晨1點,新…

Jmeter性能测试 入门
Jmeter性能测试 入门 原文:Jmeter性能测试 入门Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率。 熟练使用Jmeter后, 能用Jmeter搞定的事情,你就不会使用…

Hadoop集群搭建(二:集群主机间免密登录配置)
实验目的及要求: 静态网络地址配置;主机名的配置;防火墙的配置,使平台相关软件的常用端口能够远程正常访问;主机地址映射的配置,使所有主机能够通过主机名相互正常访问;免密码登录的配置&#…
你真的会用 CocoaPods 吗?
CocoaPods 可以说是 iOS 开发应用最广泛的包管理工具,本篇文章主要介绍 CocoaPods 的第三方库是怎样从网络集成到我们本地的项目当中,也是制作私有库、开源库和 iOS 项目组件化的一个知识铺垫。 让我们从一张图片开始: CocoaPods 工作流程 …

【spring 5】AOP:spring中对于AOP的的实现
在前两篇博客中,介绍了AOP实现的基础:静态代理和动态代理,这篇博客介绍spring中AOP的实现。 一、采用Annotation方式 首先引入jar包:aspectjrt.jar && aspectweaver.jar applicationContext配置文件: <span…

通过BeanShell获取UUID并将参数传递给Jmeter
有些HTTPS请求报文的报文体中包含由客户端生成的UUID,在用Jmeter做接口自动化测试的时候,因为越过了客户端,直接向服务器端发送报文,所以,需要在Jmeter中通过beanshell获取UUID,并能将参数传递给Jmeter&…

Hadoop集群搭建(四:Zookeeper环境安装)
实验 目的 要求 目的: 1、掌握在完全分布模式的整合平台中Zookeeper的完全分布模式的安装 要求: 完成Zookeeper的完全分布农事的安装;Zookeeper服务能够正常启动和连接;Zookeeper控制台能够正常进入;Zookeeper控制台命…
史上第二走心的 iOS11-Drag Drop 教程
原文链接:www.jianshu.com只需完成个人实名注册,即可获得腾讯云免费套餐!云服务器CVM、云数据库 MYSQL、文件存储 CFS.....应有尽有!https://cloud.tencent.com/act/free 话不多说,先上效果图 普通view拖拽效果 TableV…

指针的各式定义
1,一个整形数: int a; 2,一个指向整形数的指针: int *a; 3,一个指向指针的指针,它指向的指针指向一个整形数: int **a; 4,一个有10个整形数的数组: int a[10]; 5&#…

AS 400 常用命令
转自:http://blog.chinaunix.net/uid-22375044-id-3049793.html 一、命令技巧 命令构成: CRT* (Creat) 创建 WRK* (Work With) 操作 RMV* (Remove) 去除 DSP* (Display) 显示 ADD* (Add) 添加 CHG* (Change) 改变 DLT* (Delete) 删除 CFG* (Config) 配置…

Hadoop集群搭建(五:Hadoop HA集群模式的安装)
实验 目的 要求 目的: 1、Hadoop的高可用完全分布模式的安装和验证 要求: 完成Hadoop的高可用完全分布模式的安装;Hadoop的相关服务进程能够正常的启动;HDFS能够正常的使用;MapReduce示例程序能够正常运行;…
iOS开发业界毒瘤 Hook
原文地址 为什么有这篇博文 不知道何时开始iOS面试开始流行起来询问什么是 Runtime,于是 iOSer 一听 Runtime 总是就提起 MethodSwizzling,开口闭口就是黑科技。但其实如果读者留意过C语言的 Hook 原理其实会发现所谓的钩子都是框架或者语言的设计者预留…

常用rsync命令操作梳理
作为一个运维工程师,经常可能会面对几十台、几百台甚至上千台服务器,除了批量操作外,环境同步、数据同步也是必不可少的技能。说到“同步”,不得不提的利器就是rsync。rsync不但可以在本机进行文件同步,也可以作为远程…

Word英文字符间距太大 中英文输入切换都不行
在Word中输入文字时会遇到这样的情况,就是说中文字符的间距是正常的,但是英文字符间的间距却不正常,总是太宽了,如图: 。 而且这时切换中英文输入都没用,Word的字体设置也正常。后来上网查了下,…

Hadoop集群搭建(六:HBase的安装配置)
实验 目的 要求 目的: 1、HBase的高可用完全分布模式的安装和验证 要求: 完成HBase的高可用完全分布模式的安装;HBase的相关服务进程能够正常的启动;HBase控制台能够正常使用;表创建、数据查询等数据库操作能够正常…

架构师的第一阶段:准备做(Pre-Architecture)
上节说到,做任何事情都可以分为三个阶段:准备做、做、做好。本文,就将进入第一个阶段,准备做阶段。 Pre-Architecture:准备架构 准备架构阶段,最最重要的是弄清楚要做什么东西,即掌握用户需求。…
iOS动画系列之八:使用CAShapeLayer绘画动态流量图
这篇文章通过使用CAShapeLayer和UIBezierPath来画出一个动态显示剩余流量的小动画。 最终实现的效果如下: Paste_Image.png 动态效果图: shapeLayerAni.gif 1. CAShapeLayer 实际中,能够用CALayer完成的任务是比较少的,如果使用这…

hiho_1139_二分+bfs搜索
题目 给定N个点和M条边,从点1出发,到达点T。寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值。 题目链接:二分 最小化最大值,考虑采用二分搜索。对所有的边长进行排序,二分&#x…

Hadoop集群搭建(七:MySQL的安装配置)
实验 目的 要求 目的: 1、掌握MySQL在集群平台中的安装 要求: 完成MySQL的集群版的安装;MySQL集群的相关服务进程能够正常启动;MySQL集群的SQL服务能够作为系统服务开机自动启动;MySQL客户端能够远程连接MySQL集群的…