iOS tweak中添加第三方库

前几天在github上看到一个不错的第三方的调试库DBDebugToolkit,不过这是在开发环境中使用的,做为逆向新手的我想把它通过tweak添加到其它StoreApp中去练练手。

环境:

  • iPhone6s (已越狱)
  • iOS9.3.1
  • 目标app:Instagram
Instagram

1. 打包静态库

如果直接向tweak中添加第三方开源库的话,那需要在Makefile 中把所有的.m文件都要写进去,太麻烦了,所以我感觉应该把开源库打包成framework或者静态库比较方便些。一开始想打包成framwork, 于是就按照大神的文章添加,但是不知什么原因一直加载不进去。

Reason: image not found

最后没法解决只能用静态库解决了。按照这里的方法生成静态库,加入到tweak可以正常加载。

注意:工程中默认是不加载静态库中的 category,这个库中正好使用了好多 category,需要在Makefile中添加tweakName_LDFLAGS += -all_load才能加载分类。

2. 添加bundle

DBDebugToolkit使用了大量的xib和storyboard来创建view,所以还需要把这些文件添加到tweak中,源程序中使用了bundle我们也打包bundle添加到tweak中:

bundle

bundle位置改变了,也需要更改库的源码:

+ (instancetype)debugToolkitBundle {
//    NSBundle *podBundle = [NSBundle bundleForClass:[DBDebugToolkit class]];
//    NSURL *bundleURL = [podBundle URLForResource:@"DBDebugToolkit" withExtension:@"bundle"];
//    return [NSBundle bundleWithURL:bundleURL];

    NSBundle *podBundle = [NSBundle bundleWithPath:@"/InsBundle/DBDebug.bundle"];
    return podBundle;
}

3. Hook并配置DBDebugToolkit

Hook程序AppDelegate方法配置DBDebugToolkit

%hook AppDelegate
- (_Bool)application:(id)arg1 didFinishLaunchingWithOptions:(id)arg2 {
    [DBDebug setup];
    return %orig;
}
%end

另外:不知道什么原因,DBDebugToolkit中的+ (IMP)replaceMethodWithSelector:(SEL)originalSelector block:(id)block方法调用一直不成功,所以我又对源码进行了更改,并且Tweak.xm也需要hook一些其它方法(如有大神知道什么原因欢迎留言交流):

@implementation UIView (DBUserInterfaceToolkit)

#pragma mark - Method swizzling
- (void)hookInitMethod {
    [self db_refreshDebugBorders];
    [self db_registerForNotifications];
}

- (void)hookDellocMethod {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
//+ (void)load {
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        __block IMP originalInitWithCoderIMP = [self replaceMethodWithSelector:@selector(initWithCoder:)
//                                                                         block:^UIView * (UIView *blockSelf, NSCoder *aDecoder) {
//                                                                            UIView *res = ((UIView * (*)(id, SEL, NSCoder *))originalInitWithCoderIMP)(blockSelf, @selector(initWithCoder:), aDecoder);
//                                                                            [res db_refreshDebugBorders];
//                                                                            [res db_registerForNotifications];
//                                                                            return res;
//                                                                         }];
//        __block IMP originalInitWithFrameIMP = [self replaceMethodWithSelector:@selector(initWithFrame:)
//                                                                         block:^UIView * (UIView *blockSelf, CGRect frame) {
//                                                                             UIView *res = ((UIView * (*)(id, SEL, CGRect))originalInitWithFrameIMP)(blockSelf, @selector(initWithCoder:), frame);
//                                                                             [res db_refreshDebugBorders];
//                                                                             [res db_registerForNotifications];
//                                                                             return res;
//                                                                         }];
//        __block IMP originalDeallocIMP = [self replaceMethodWithSelector:NSSelectorFromString(@"dealloc")
//                                                                   block:^(__unsafe_unretained UIView *blockSelf) {
//                                                                       [[NSNotificationCenter defaultCenter] removeObserver:blockSelf];
//                                                                       ((void (*)(id, SEL))originalDeallocIMP)(blockSelf, NSSelectorFromString(@"dealloc"));
//                                                                   }];
//    });
//}

@implementation UIWindow (DBShakeTrigger)

#pragma mark - Recognizing shake motion
//+ (void)load {
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        // Adding informing delegates about shake motion to the original implementation.
//        __block IMP originalIMP = [self replaceMethodWithSelector:@selector(motionEnded:withEvent:)
//                                                            block:^(UIWindow *blockSelf, UIEventSubtype motion, UIEvent *event) {
//                                                                if (motion == UIEventSubtypeMotionShake) {
//                                                                    [blockSelf.shakeDelegates makeObjectsPerformSelector:@selector(windowDidEndShakeMotion:) withObject:self];
//                                                                }
//                                                                ((void (*)(id, SEL, UIEventSubtype, UIEvent *))originalIMP)(blockSelf, @selector(motionEnded:withEvent:), motion, event);
//                                                            }];
//    });
//}

@implementation UIWindow (DBUserInterfaceToolkit)

#pragma mark - Method swizzling
//+ (void)load {
//    NSLog(@"load====DBUserInterfaceToolkit===========");
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        __block IMP originalIMP = [self replaceMethodWithSelector:@selector(sendEvent:)
//                                                            block:^(UIWindow *blockSelf, UIEvent *event) {
//                                                                if (event.type == UIEventTypeTouches) {
//                                                                    [blockSelf db_handleTouches:event.allTouches];
//                                                                }
//                                                                ((void (*)(id, SEL, UIEvent *))originalIMP)(blockSelf, @selector(sendEvent:), event);
//                                                            }];
//    });
//}

Tweak.xm

%hook UIResponder
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    UIWindow* window = [UIApplication sharedApplication].keyWindow;
    if (motion == UIEventSubtypeMotionShake) {
        [[window shakeDelegates] makeObjectsPerformSelector:@selector(windowDidEndShakeMotion:) withObject:self];
    }
}
%end


%hook UIWindow
- (void)sendEvent:(UIEvent *)event {
    %orig;
    [self db_handleTouches:event.allTouches];
}
%end

%hook UIView
- (id)initWithCoder:(NSCoder *)aDecod {
    [self hookInitMethod];
    return %orig;
}
- (id)initWithFrame:(CGRect)aDecod {
    [self hookInitMethod];
    return %orig;
}

- (void)dealloc {
    [self hookDellocMethod];
    %orig;
}
%end

编译打包安装,成功:

image.png
image.png
image.png
image.png
image.png

其中的网络请求监控还是挺好的,对逆向app有一定帮助。

如有错误欢迎留言指正。

所有代码已上传github

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

推荐阅读更多精彩内容