1. Monkey介绍
Monkey是一个为越狱和非越狱开发人员准备的工具。
Monkey github 链接
2. Monkey安装及注意事项
进入到上面所说的链接之后,操作如下:
进入wiki页面后,就有关于monkey的介绍,及其安装文档链接,点击安装,如下图所示:
2.1 环境要求
使用工具前确保如下几点:
- 安装最新的theos
sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
注意,由于Mac OS 11以上系统opt路径下有权限问题需要解决,因此我们可以在用户根目录下创建一个隐藏文件,将theos复制到这个文件夹中,如下图所示:
然后再在.zshrc文件中配置theos路径,如下图所示:
如果下面的命令能够执行成功就表示theos配置成功了,如下图所示:
- 安装ldid(如安装theos过程安装了ldid,跳过)
brew install ldid
- 配置免密码登录越狱设备(如果没有越狱设备,跳过)
ssh-keygen -t rsa -P ''
ssh-copy-id -i /Users/username/.ssh/id_rsa root@ip
或者安装sshpass
自己设置密码:
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
2.2 安装
你可以通过以下命令选择指定的Xcode进行安装:
sudo xcode-select -s /Applications/Xcode.app
默认安装的Xcode为:
xcode-select -p
执行安装命令:
sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-install)"
如果安装的过程中,出现下面这种错误,如下所示:
就执行下面的命令
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/PrivatePlugIns/IDEOSXSupportCore.ideplugin/Contents/Resources /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications
然后再次执行安装命令就可以了
sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-install)"
3. Monkey基本使用
3.1创建一个工程,使用安装Monkey之后生成的插件,如下图所示:
3.2 链接真机,调试运行
如果遇到如下图所示的错误
解决方法
运行结果如下:
3.3 hook其他APP
然后再次运行就可以了
我们使用上上个案例中的AntiHookDemo来练习一下,首先拖入ipa包,如下图所示:
如果我们想要Hook AntiHookDemo中下图中红框中的方法
只要在MonkeyDemoDylib.xm文件中编写如下代码:
运行结果如下:
Monkey使用起来之所以这么简单,是因为这个框架里面有一个库,如下图红框所示:
它能在编译期间将MonkeyDemoDylib.xm中的代码转化为我们平时hook函数的代码然后放入到MonkeyDemoDylib.mm文件中
#line 1 "/Users/shen/Documents/IOS_Projects/逆向班/MonkeyDemo/MonkeyDemoDylib/Logos/MonkeyDemoDylib.xm"
#import
#include
#if defined(__clang__)
#if __has_feature(objc_arc)
#define _LOGOS_SELF_TYPE_NORMAL __unsafe_unretained
#define _LOGOS_SELF_TYPE_INIT __attribute__((ns_consumed))
#define _LOGOS_SELF_CONST const
#define _LOGOS_RETURN_RETAINED __attribute__((ns_returns_retained))
#else
#define _LOGOS_SELF_TYPE_NORMAL
#define _LOGOS_SELF_TYPE_INIT
#define _LOGOS_SELF_CONST
#define _LOGOS_RETURN_RETAINED
#endif
#else
#define _LOGOS_SELF_TYPE_NORMAL
#define _LOGOS_SELF_TYPE_INIT
#define _LOGOS_SELF_CONST
#define _LOGOS_RETURN_RETAINED
#endif
@class ViewController;
static void (*_logos_orig$_ungrouped$ViewController$button1Click)(_LOGOS_SELF_TYPE_NORMAL ViewController* _LOGOS_SELF_CONST, SEL); static void _logos_method$_ungrouped$ViewController$button1Click(_LOGOS_SELF_TYPE_NORMAL ViewController* _LOGOS_SELF_CONST, SEL);
#line 5 "/Users/shen/Documents/IOS_Projects/逆向班/MonkeyDemo/MonkeyDemoDylib/Logos/MonkeyDemoDylib.xm"
static void _logos_method$_ungrouped$ViewController$button1Click(_LOGOS_SELF_TYPE_NORMAL ViewController* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd) {
NSLog(@"hook成功了!!");
_logos_orig$_ungrouped$ViewController$button1Click(self, _cmd);
}
static __attribute__((constructor)) void _logosLocalInit() {
{Class _logos_class$_ungrouped$ViewController = objc_getClass("ViewController"); { MSHookMessageEx(_logos_class$_ungrouped$ViewController, @selector(button1Click), (IMP)&_logos_method$_ungrouped$ViewController$button1Click, (IMP*)&_logos_orig$_ungrouped$ViewController$button1Click);}} }
#line 13
之后将这个文件链接到应用程序之中,这就是Monkey的基本使用了。