MobileMail:MFLibraryMessage.这个文件怎么获取

书上说来自于外部的dylib,在ios8所有dump的头文件才有。我应该去哪获取这些文件

先利用Objc运行时拿这个类任意一个方法的IMP然后dladdr就找到库文件位置了

引用

#import <objc/runtime.h>
#include <dlfcn.h>

@interface MessageMiniMall : NSObject

  • (id)copyAllMessages;

@end

%hook MailboxContentViewController

  • (void)miniMallFinishedFetch:(NSNotification *)arg1 {
    %orig;
    NSLog(@“self: %@”,self);
    NSLog(@“miniMallFinishedFetch: %@”,[(MessageMiniMall *)arg1.object copyAllMessages]);

    IMP imp = class_getMethodImplementation(NSClassFromString(@“MFLibraryMessage”), @selector(deliveryInfo));

    Dl_info info;
    if (dladdr(imp, &info)) {

      printf("dli_fname: %s\n", info.dli_fname);
      
      printf("dli_sname: %s\n", info.dli_sname);
      
      printf("dli_fbase: %p\n", info.dli_fbase);
      
      printf("dli_saddr: %p\n", info.dli_saddr);
    

    } else {

      printf("error: can't find that symbol.\n");
    

    }
    }

%end

引用

这是我的tweak,但是报错了。下面是错误信息

引用
SMLdeMacBook-Pro:mobilemailtweak SML$ make
Making all for tweak MobileMailTweak…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (armv7)…
Tweak.xm:22:9: error: no matching function for call to ‘dladdr’
if (dladdr(imp, &info)) {
^~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/usr/include/dlfcn.h:52:12: note:
candidate function not viable: no known conversion from ‘IMP’ (aka ‘id
_Nullable (*)(id _Nonnull, SEL _Nonnull, …)’) to ‘const void *’ for 1st
argument; take the address of the argument with &
extern int dladdr(const void *, Dl_info *);
^
1 error generated.
引用

这不写了么

还是没明白我应该改哪里。传参是&info的吧

……clang的语法提示这么清楚……

可以了 谢啦:joy:

if (dladdr(imp, &info)) {

} else {

}
但在tweak里获取失败了。走得是else ,没有拿到地址信息。

我记错了可能。试试不加&直接强制类型转化

我新建了一个oc项目,imp不加&,
if (dladdr(imp, &info)) {

} else {

}
像这样是可以获取到地址信息,但是我在tweak里不加&,编译不通过就爆上面的错了。

张总,像这种还有别的办法能拿到吗

报错信息下面有一串类似-W啥啥啥的东西。改成-Wno啥啥啥加进CFLAGS

dladdr((void *)imp, &info)

引用
May 27 10:15:46 SMLde-iPad MobileMail[2022] : miniMallFinishedFetch
May 27 10:15:46 SMLde-iPad MobileMail[2022] : dli_fname: /System/Library/PrivateFrameworks/Message.framework/Message
May 27 10:15:46 SMLde-iPad MobileMail[2022] : dli_sname:
May 27 10:15:46 SMLde-iPad MobileMail[2022] : dli_fbase: Œ˙Ì˛
May 27 10:15:46 SMLde-iPad MobileMail[2022] : dli_saddr:

引用

这个是可以了,但是我获取到的路径
/System/Library/PrivateFrameworks/Message.framework/Message这个路劲不管是mac还是ios设备上 都没有找到最后这个Message

用void * 就可以编译通过了,但是获取的路径/System/Library/PrivateFrameworks/Message.framework/Message这个路劲不管是mac还是ios设备上 都没有找到最后这个Message

dyld_decache

嗦嘎,找到了