断点以后,拿到的函数不一致,求教各位大神

现在能获取主二进制文件的基地址
图片

但是不能获取动态库的基地址,我要hook的这个函数是在Frameworks文件夹下的一个动态库里,现在用image list 看这个库还没加载,它要等一会才会加载,谢谢

我说了

为什么不能等到他加载完之后再hook呢,是因为等到加载完之后你要hook的代码执行过了吗

如果是这个原因的话,需要的不是你现在在尝试的解法

不是,是因为我不知道它什么时候加载这个动态库。 我也想等他加载完成再去,拿这个动态库的基地址。我现在这么写只能拿到app的基地址,就是不知道什么时候去调用_dyld_get_image_vmaddr_slide 拿到我想要的动态库的基地址
unsigned long _sub_ACF0 = _dyld_get_image_vmaddr_slide(i);
pszModName = _dyld_get_image_name(i);//名称

就是_dyld_register_func_for_add_image啊

我现在拿到的slide是[ 0] 877C71CF-0AC3-38FE-B969-478271EB5CEC 0x0000000102258000,不是动态库的基地址

如果输入的是image list -o -f 就跟打印的原始地址是一样的,我现在MSHookFunction的地址是基地址+动态库里的函数的偏移的地址,这个地址是没有的,现在想拿到动态库基地址+动态库里的函数的偏移的地址

你能hook的时候都加载完了吧,如果真没有加载,你就用_dyld_register_func_for_add_image
另外,你刚刚启动lldb就去看地址,当然只有主程序
方法都告诉你了,你多琢磨琢磨

你要根据header判断是不是你要的库再拿地址啊,跟二进制的加载顺序也有关,自己多研究研究吧

看你这个代码写的逻辑,你好像正向也不是很好

1 个赞

没有加载直接dlopen加载后会返回地址。

%ctor {
    NSString * libPath = @"/Flutter";
    for (NSBundle * bd in [NSBundle allFrameworks]) {
        if ([bd.resourcePath hasSuffix:@"Flutter.framework"]){
            libPath = [NSString stringWithFormat:@"%@%@",bd.resourcePath,libPath];
            break;
        }
    };
    void *lib =  dlopen(libPath.UTF8String, RTLD_NOW);
    %init(_ungrouped)
}

我记得这玩意儿很多年前试过返回的不是MachO头,具体没再研究了

1 个赞

张总正解,返回的确不是MachO 是个 ImageLoader

1 个赞