现在能获取主二进制文件的基地址
但是不能获取动态库的基地址,我要hook的这个函数是在Frameworks文件夹下的一个动态库里,现在用image list 看这个库还没加载,它要等一会才会加载,谢谢
现在能获取主二进制文件的基地址
但是不能获取动态库的基地址,我要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判断是不是你要的库再拿地址啊,跟二进制的加载顺序也有关,自己多研究研究吧
看你这个代码写的逻辑,你好像正向也不是很好
没有加载直接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头,具体没再研究了