iOS 6.1dynamic库build立和链接
我正在尝试为iOS创build一个dynamic库并在运行时加载它。 看了这个问题和这个答案后 ,我一直在使用iOSOpenDev并在我的iPhone上部署所有东西。 dylib的xCode项目叫做KDylibTwo,我修改的文件是:
KDylibTwo.h
#import <Foundation/Foundation.h> @interface KDylibTwo : NSObject -(void)run; @end
KDylibTwo.m
#import "KDylibTwo.h" @implementation KDylibTwo -(id)init { if ((self = [super init])) { } return self; } -(void)run{ NSLog(@"KDylibTwo loadded."); } @end
为了testing我的库是否工作,在构build分析之后(iOSOpenDev在iPhone上部署它),我可以在我的设备上find它存储在/usr/lib/libKDylibTwo.dylib
并构build一个调整(再次使用iOSOpenDev) ,钩住SpringBoard如下:
#include <dlfcn.h> %hook SBApplicationIcon -(void)launch{ NSLog(@"\n\n\n\n\n\n\nSBHook For libKDylibTwo.dylib"); void* dylibLink = dlopen("/usr/lib/libKDylibTwo.dylib", RTLD_NOW); if(dylibLink == NULL) { NSLog(@"Loading failed."); } else { NSLog(@"Dylib loaded."); void (*function)(void); *(void **)(&function) = dlsym(dylibLink, "run"); if (function) { NSLog(@"Function found."); (*function)(); } else { NSLog(@"Function NOT found"); } } NSLog(@"End of code"); %log; %orig; } %end
在设备上安装调整并点击一个图标(会触发挂钩代码)后,Console输出如下所示:
Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: SBHook For libKDylibTwo.dylib Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: Dylib loaded. Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: Function NOT found Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: End of code Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: -[<SBApplicationIcon: 0x1d5008c0> launch]
我的问题是我做错了什么,图书馆的function没有被调用或执行! 我想我应该澄清,我只是谈论越狱的设备,而不是App Store的开发,所以请不要继续发布,它不能做!
先谢谢你,
帕纳约蒂斯。
Victor Ronin指出,“dlsym”是C符号。 要从运行时链接的dylib中获取Objective-C类,可以使用objc运行时函数。 在你的情况下:
void* dylibLink = dlopen("/usr/lib/libKDylibTwo.dylib", RTLD_NOW); id KDylibTwo = [[objc_getClass("KDylibTwo") alloc] init]; [KDylibTwo run];
第一行是在运行时链接你的库。 这是为了使用它内部的代码所必需的。
第二行创build类KDylibTwo
实例。 objc_getClass
函数返回类对象,您可以稍后使用它创build此类的实例,就像使用任何Objective-C类一样 – 使用alloc
和init
方法。 一旦你用objc_getClass
获得类对象,你可以像任何事情一样与他一起工作。 在这一点上,你可以忘记你在运行时dynamic链接你的库。
第三行是调用run
方法。 正如你所看到的,这是正常的Objective-C语法。 因为您在运行时链接了库,所以没有任何更改。 你可以调用任何你想要的方法。
我从来没有用过dlsym来得到一个指向客观的c方法的指针(我相信通过dlsym调用客观的c方法是不可能的,但是我可能是错的)。
但是,dlsym的第二个参数应该是符号名称的最重要的信息位。
符号名称“run”只能用于C函数。 就像是:
EXPORT void run() { NSLog(@"Run"); }
对象C方法有更复杂的符号名称,正如我所说,我不确定是否可以传递给dlsym。