使用 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 打印收发消息的更多相关文章

  1. iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。

    这两天改版一个旧的APP,要旧貌换新颜,拿到app后进行编译,一直报下面的错误. 报不认识的符号名PayReq错误.奇怪,啥也没动就这样,真不知道给的包是不是本来就是个报错的工程. 不管怎样,要对它修 ...

  2. 微信C# SDK

    微信C# SDK # 模块功能 DLL 1 基础库 Senparc.Weixin.dll 2 微信公众号 / 微信支付 / JSSDK / 摇周边 / 等等 Senparc.Weixin.MP.dll ...

  3. 微信JS SDK接入的几点注意事项

    微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...

  4. 开源微信支付SDK

    应该有一年多没在博客园上写文章了,毕竟是一个记录自己技术成长的平台,没能将写博客长期坚持下来,说起来也是挺惭愧的.对于自己的近况而言,确实平常加班也比较多,时间会比较压缩,所以到后来博客也基本停止了更 ...

  5. 微信开发SDK支持小程序 ,Jeewx-Api 1.3.1 版本发布

    JEEWX-API 是一款JAVA版的微信开发SDK,支持微信公众号.小程序.微信企业号.支付宝生活号SDK和微博SDK.你可以基于她 快速的傻瓜化的进行微信开发.支付窗开发和微博开发. 基于jeew ...

  6. 借助magicwindow sdk plugin快速集成sdk

    到目前为止,Android Studio已经是开发原生Android App的主流IDE,它是由Google官方设计并基于JetBrains的IntelliJ IDEA.我们魔窗开发的sdk也是使用此 ...

  7. PDA手持终端集成一体打印 二次开发

    PDA手持终端集成一体打印 二次开发支持 VS2008或VS2005开发工具 c#或C++开发语言 Mobile6.5,支持GSM通话,GPRS,EDGE网络;内置wifi,蓝牙,gps商场单品管理小 ...

  8. 实战微信JS SDK开发:贺卡制作与播放(1)

    前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...

  9. iOS 关于微信检测SDK应用的原理浅析

    微信作为一个开放平台,各方面都是做得比较好的,推出了SDK之后,微信与使用了SDK的应用便能进行更多交互.但在iOS平台上,应用间交换数据还是相对麻烦的,那么微信为什么能直接在应用检测到其他使用了SD ...

随机推荐

  1. QQ 互联认证 回调地址提示说要http :// 但是事实不用

    真奇怪 腾讯最近人手不够吧 这样的错误也会犯错....

  2. K均值算法

    为了便于可视化,样本数据为随机生成的二维样本点. from matplotlib import pyplot as plt import numpy as np import random def k ...

  3. spring 2种下载方式 下载地址 download 地址

    spring 在官网只提供 maven 的下载方式,把zip方式的不再提供,两种方法下载: 1.想找回以前版本的spring zip包,如果知道版本号,那么直接在google里输入 ” spring ...

  4. 【LeetCode】215. Kth Largest Element in an Array (2 solutions)

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

  5. android图片等比例缩放 填充屏幕

    在ImageView的t同事设置两个属性 android:adjustViewBounds="true"android:scaleType="fitXY"

  6. easyUI设置textbox的值

    我们知道<input type="text" class="easyui-validatebox" id="txtrName" nam ...

  7. 删除vector指定位置的元素

    原文链接: http://www.cnblogs.com/yeahgis/archive/2012/05/29/2523476.html #include <vector>#include ...

  8. 关于Java读取mysql中date类型字段默认值'0000-00-00'的问题

    今天在做项目过程中,查询一个表中数据时总碰到这个问题:      java.sql.SQLException:Value '0000-00-00' can not be represented as ...

  9. WinForm DataGridView新增加行

      1.不显示最下面的新行 通常 DataGridView 的最下面一行是用户新追加的行(行头显示 * ).如果不想让用户新追加行即不想显示该新行,可以将 DataGridView 对象的 Allow ...

  10. spring注解方式实现定时器

    1.Spring的配置: <beans xmlns:task="http://www.springframework.org/schema/task" xsi:schemaL ...