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


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指针的替换进而达到对方法替换的目的。这个东西马上学习一手。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343