逆向中获取 Block 的参数和返回值

同问楼上, 楼主能补一下掉的那张图吗? 好像缺了点什么

函数指针的地址是在第 16 个字节之后,并占用 8 个字节,所以可以得到函数的地址是 0x00000001000dd770。 这是怎么算出来的。

block的结构就是这样的

不是,我是想问
memory read --size 8 --format x 0x16fd88f88
0x16fd88f88: 0x000000019b4d8088 0x00000000c2000000
0x16fd88f98: 0x00000001000dd770 0x0000000100fc6610
0x16fd88fa8: 0x000000017444c510 0x0000000000000001
0x16fd88fb8: 0x000000017444c510 0x0000000000000008
, 打印出这么毒配个地址, 怎么确定,函数的地址为0x00000001000dd770。 不太会算

加16字节啊

还是不懂,加16个字节怎么加啊, 基础太差了。 大佬,能教一下,是怎么加出来的吗?

你是不是不懂指针是什么
0x16fd88f88+0x10 = ?

大佬说的比较言简意赅,我来啰嗦两句。

memory read --size 8 --format x 0x16fd88f88
这句的意思是 从0x16fd88fdd 这个地址 读取内存中的,每8个字节读一次,按照16进制输出。
0x16fd88fdd 地址对应的内存长这个样子
00001111,11110000,10101111,11111111…(这个我随便写的和输出结果不一一对应) 很多个连在一起的0和1(bit),每8个bit叫做一个字节 byte。从第一个00001111读8组出来。


希望能够帮助到你。

1 Like

也是够耐心的了


这个是我提取的某个库中的部分代码,用下就可以得到block的函数签名。按着函数签名就可以提取你要的东西了

- (id<NSObject>)addObserverForName:(NSNotificationName)name 
                            object:(id)obj 
                             queue:(NSOperationQueue *)queue 
                        usingBlock:(void (^)(NSNotification *note))block;

我要hook这个方法 但是不知道 通过什么判断 是不是我要hook的那个block代码块

大佬真是又耐心又用心

lldb
br xxxx
一个一个看咯

当然也可以对block 进行分类,选择最有可能的进行一个一个调试

谢谢,终于看懂了

体现了学酥对学渣的友谊。:rofl:

我想hook 这个方法里的block里的代码

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
         // do something
        // 我想hook它
    }];

**chisel**这个

- (void)FM_GetSubscribeList:(long long)arg1 pageSize:(long long)arg2 callBack:(void (^)(long long, NSDictionary *, BOOL)arg3;

我想把 (void (^)(long long, NSDictionary *, BOOL)里面的 NSDictionary 打印出来,怎么做了?谢谢。 因为现在在 hook的代码里打印出来的是__NSStackBlock__,我想 block里的参数的详细信息打印出来

block有个隐藏参数,就是block自己,永远是x0