-
-
Save paradiseduo/82bee999a81d60b1a25e48be89aacbd6 to your computer and use it in GitHub Desktop.
替换所有block的实现
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// main.m | |
// TestObjc | |
// | |
// Created by Skifary on 14/03/2018. | |
// Copyright © 2018 skifary. All rights reserved. | |
// | |
#import <Foundation/Foundation.h> | |
#import "fishhook.h" | |
typedef struct __block_impl { | |
void *isa; | |
int Flags; | |
int Reserved; | |
void *FuncPtr; | |
}__block_impl; | |
static void (*orig_func)(void *v ,int i, NSString *str); | |
void hookFunc(void *v ,int i, NSString *str) { | |
NSLog(@"%d,%@", i, str); | |
orig_func(v,i,str); | |
} | |
void HookBlockToPrintArguments(id blk) { | |
__block_impl *ptr = (__bridge __block_impl *)blk; | |
orig_func = ptr->FuncPtr; | |
ptr->FuncPtr = &hookFunc; | |
} | |
#pragma mark - 第三题实现部分 | |
static id (*orig_objc_retainBlock)(id); | |
id hook_objc_retainBlock(id blk) { | |
id retainBlk = orig_objc_retainBlock(blk); | |
// 因为retain会多次调动 | |
// 这里可以给blk添加一个属性 如果被hook过就不用继续hook | |
// 因为这里只是一个测试例子 就不做这么麻烦了 | |
if (true) { | |
HookBlockToPrintArguments(blk); | |
} | |
return retainBlk; | |
} | |
void HookEveryBlockToPrintArguments() { | |
rebind_symbols((struct rebinding[1]){{"objc_retainBlock", hook_objc_retainBlock, (void *)&orig_objc_retainBlock}}, 1); | |
} | |
int main(int argc, const char * argv[]) { | |
HookEveryBlockToPrintArguments(); | |
void (^blk)(int, NSString *) = ^void(int i, NSString *str) { | |
NSLog(@"original invoke"); | |
}; | |
blk(1,@"aaa"); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment