0x01.MonkeyDev
MonkeyDev主要包含四个模块:
Logos Tweak
使用theos提供的logify.pl工具将.xm文件转成.mm文件进行编译,集成了CydiaSubstrate,可以使用MSHookMessageEx和MSHookFunction来Hook OC函数和指定地址。
CaptainHook Tweak
使用CaptainHook提供的头文件进行OC 函数的Hook以及属性的获取。
Command-line Tool
可以直接创建运行于越狱设备的命令行工具。
MonkeyApp
这是自动给第三方应用集成Reveal、Cycript和注入dylib的模块,支持调试dylib和第三方应用,支持Pod给第三放应用集成SDK,只需要准备一个砸壳后的ipa或者app文件即可。
你说他是集成也可以,说是二次开发也可以,反正非常方便好用而且稳定。
0x02.下载
配置环境
1.安装最新的theos
sudo gitclone--recursive https://github.com/theos/theos.git /opt/theos
2.安装ldid
brew install ldid,这个需要brew
安装
1.选择指定的Xcode安装
sudo xcode-select -s + 自己Xcode.app的路径
2.执行安装命令
sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-install)"
完成后重启Xcode,就可以开始逆向开发了
0x03.简单使用
例子就是fishhook的demo,我简单修改了一下button的逻辑让它弹出一个提示框,我们就来看看怎么样hook这个提示框
看看样子
要Hook,先创建一个MonkeyDev工程啦
然后工程的结构如图所示
TaretApp是放我们要hook的应用,Logos编写hook代码,fishhook就不多说了。这里有个点,大哥告诉我说MonkeyDev是基于theos hook,至于是基于fishhook来hook app的还是都有,我们等下看看。
把要hook的.ipa或者app文件夹放在TaretApp文件夹下,put ipa or app here不要删除。
然后就可以编写Logos代码来hook方法了,很简单
关于logos语法的官方文档
hookdemoDylib.xm也会显示,只是这个名字是根据项目名来的,反正是这么个文件夹。
// See http://iphonedevwiki.net/index.php/Logos
#import@interfaceCustomViewController
@property(nonatomic,copy)NSString*newProperty;
+(void)classMethod;
-(NSString*)getMyName;
-(void)newMethod:(NSString*)output;
@end
%hook CustomViewController
+(void)classMethod{
%log;
%orig;
}
%new
-(void)newMethod:(NSString*)output {
NSLog(@"This is a new method : %@",output);
}
%new
-(id)newProperty {
returnobjc_getAssociatedObject(self,@selector(newProperty));
}
%new
-(void)setNewProperty:(id)value {
objc_setAssociatedObject(self,@selector(newProperty),value,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString*)getMyName
{
%log;
NSString*password=MSHookIvar<NSString*>(self,"_password");
NSLog(@"password:%@",password);
[%c(CustomViewController)classMethod];
[selfnewMethod:@"output"];
self.newProperty=@"newProperty";
NSLog(@"newProperty : %@",self.newProperty);
return %orig();
}
%end
以上可以对照官方文档自己去看意思。
这里就使用基本的%hook即可
要使用Logos代码来hook函数,我们首先要知道这个函数的信息
在调试时获取button控件的Controller信息
使用class-tump提取Mach-o文件中的@interface、@protocal信息提取并生产对应的.h文件,通过该文件可查看被逆向应用所有的类,及类的属性、成员变量、方法。
把dump下来的文件夹放在sublime里面看
好,开始写代码hook,代码如下:
%hook ViewController
- (void)crwindow{
%log((NSString *)@"必须欢迎");
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"我不好" message:@"必须欢迎" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:nil]];
[[[UIApplication sharedApplication] keyWindow].rootViewController presentViewController:alert animated:YES completion:nil];
}
%end
这里并不只有一个hook点,这里做演示而已。
0x03.MSHookMessageEx
话说,Hook有一种原理是通过Method Swizzle
一个方法的实现是保存在IMP里面的, runtime提供了修改IMP的方法和交换两个IMP实现的方法。
Cydia Substrate是绝大部分tweak正常工作的基础,它由MobileHooker、MobileLoader和Safe mode组成。
MobileHooker的作用就是替换系统函数,也就是所谓的hook,它主要包含以下两个函数:
void MSHookMessageEx (Classclass,SEL selector,IMP replacement,IMP*result);
void MSHookFunction (void*function,void*replacement,void**p_original);
其中MSHookMessageEx作用于Objective-C函数,通过调用method_setImplementtation函数将[class selector]的实现改成replacement,达到hook的目的。说白了也就是修改IMP和交换IMP实现的方法。
这在MonkeyApp工程运行时生成的.mm文件中就有
Logos语法主要是对此函数作了一层封装,让编写针对Objective-C函数的hook代码变得更简单直观一些,所以对于Objective-C函数的hook,推荐使用Logos语法,当然因人而异。
如果要对这种hook进行检查,当然直接对HookMessageEx方法进行检测。
更本质上是实现runtime过程中对imp指针的替换进而达到对方法替换的目的。这个东西马上学习一手。