ios hook框架之——MonkeyDev

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工程啦

new

然后工程的结构如图所示


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(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信息


method

使用class-tump提取Mach-o文件中的@interface、@protocal信息提取并生产对应的.h文件,通过该文件可查看被逆向应用所有的类,及类的属性、成员变量、方法。


class-dump

把dump下来的文件夹放在sublime里面看


知道要hook哪个了

好,开始写代码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


写好了


window也hook了

这里并不只有一个hook点,这里做演示而已。

0x03.MSHookMessageEx

话说,Hook有一种原理是通过Method Swizzle


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文件中就有


MSHookMessageEx

Logos语法主要是对此函数作了一层封装,让编写针对Objective-C函数的hook代码变得更简单直观一些,所以对于Objective-C函数的hook,推荐使用Logos语法,当然因人而异。

如果要对这种hook进行检查,当然直接对HookMessageEx方法进行检测。

更本质上是实现runtime过程中对imp指针的替换进而达到对方法替换的目的。这个东西马上学习一手。

你可能感兴趣的:(ios hook框架之——MonkeyDev)