使用 CocoaPods 给微信集成 SDK 打印收发消息
使用 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' do
pod '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 MonkeyDev
DESC
spec.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' do
pod '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项目地址请点击阅读原文查看。

使用 CocoaPods 给微信集成 SDK 打印收发消息的更多相关文章
- iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。
这两天改版一个旧的APP,要旧貌换新颜,拿到app后进行编译,一直报下面的错误. 报不认识的符号名PayReq错误.奇怪,啥也没动就这样,真不知道给的包是不是本来就是个报错的工程. 不管怎样,要对它修 ...
- 微信C# SDK
微信C# SDK # 模块功能 DLL 1 基础库 Senparc.Weixin.dll 2 微信公众号 / 微信支付 / JSSDK / 摇周边 / 等等 Senparc.Weixin.MP.dll ...
- 微信JS SDK接入的几点注意事项
微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...
- 开源微信支付SDK
应该有一年多没在博客园上写文章了,毕竟是一个记录自己技术成长的平台,没能将写博客长期坚持下来,说起来也是挺惭愧的.对于自己的近况而言,确实平常加班也比较多,时间会比较压缩,所以到后来博客也基本停止了更 ...
- 微信开发SDK支持小程序 ,Jeewx-Api 1.3.1 版本发布
JEEWX-API 是一款JAVA版的微信开发SDK,支持微信公众号.小程序.微信企业号.支付宝生活号SDK和微博SDK.你可以基于她 快速的傻瓜化的进行微信开发.支付窗开发和微博开发. 基于jeew ...
- 借助magicwindow sdk plugin快速集成sdk
到目前为止,Android Studio已经是开发原生Android App的主流IDE,它是由Google官方设计并基于JetBrains的IntelliJ IDEA.我们魔窗开发的sdk也是使用此 ...
- PDA手持终端集成一体打印 二次开发
PDA手持终端集成一体打印 二次开发支持 VS2008或VS2005开发工具 c#或C++开发语言 Mobile6.5,支持GSM通话,GPRS,EDGE网络;内置wifi,蓝牙,gps商场单品管理小 ...
- 实战微信JS SDK开发:贺卡制作与播放(1)
前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...
- iOS 关于微信检测SDK应用的原理浅析
微信作为一个开放平台,各方面都是做得比较好的,推出了SDK之后,微信与使用了SDK的应用便能进行更多交互.但在iOS平台上,应用间交换数据还是相对麻烦的,那么微信为什么能直接在应用检测到其他使用了SD ...
随机推荐
- 初始建库SGA该设多大、PGA该设多大的建议
1.背景情况 非常多新业务系统上线,大部分DBA也不懂业务.就闷着头建库,SGA值设多大,PGA设多大,随便指定一个值就得了,执行一段时间后,或许就由于这个值是随便指定的.比如SGA+PGA大于总物理 ...
- Linux-配置虚拟IP
Linux下配置网卡ip别名何谓ip别名?用windows的话说,就是为一个网卡配置多个ip.什么场合增加ip别名能派上用场?布网需要.多ip访问测试.特定软件对多ip的需要...and so on. ...
- CASE WHEN 及 SELECT CASE WHEN的用法(写了一坨烂代码发现两条sql就行了, 哎)
转自:http://blog.sina.com.cn/s/blog_4c538f6c01012mzt.html Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE ...
- 简述MVC
强调:mvc不是框架而是一种设计模式 分层结构的好处:1.降低了代码之间的耦合性 2.提高了代码的重用性 一. 概述 MVC的全名Model View Controller,即模型-视图-控制器的缩写 ...
- 使用extract-text-webpack-plugin提取css文件
一.css之上的语言 js之上的语言有jsx.tyepscript.coffescript. html之上的语言有jade. css之上的语言有sass.scss.less.stylus,这几种语言区 ...
- 最新的 CocoaPods 的使用教程(一)
发布开源库到CocoaPods的时候.对CocoaPods重新学习了一下. 1.CocoaPods的日常使用 2.创建CocoaPods的私有库 3.创建CocoaPods的开源库 一. CocoaP ...
- java 实现唯一ID生成器
2014-11-08 内容存档在evernote,笔记名"java 实现唯一ID生成器"
- ubuntu远程桌面连接windows系统
现在用ubuntu系统,公司买了个windows的服务器,需要给配置一套环境,来回跑很麻烦,就想windows下可以的远程桌面,Linux应该也有. 现在自己的ubuntu13.10,无法进入桌面的“ ...
- Redis学习之路(002)- Ubuntu下redis开放端口
Redis在ubuntu安装后默认是只有本地访问,需要别的ip访问我们需要修改redis的配置文件 1. dpkg -L redis-server 这命令我们可以看到redis的安装的文件在那些目录 ...
- 【MySQL】MySQL之浅谈MySQL的存储引擎
什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等 ...