Skip to content

Instantly share code, notes, and snippets.

@paradiseduo
Forked from Skifary/main.m
Created February 28, 2019 03:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save paradiseduo/82bee999a81d60b1a25e48be89aacbd6 to your computer and use it in GitHub Desktop.
Save paradiseduo/82bee999a81d60b1a25e48be89aacbd6 to your computer and use it in GitHub Desktop.
替换所有block的实现
//
// 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