Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS 6.1动态库构建和链接_Ios_Jailbreak_Dylib_Iphone Privateapi - Fatal编程技术网

iOS 6.1动态库构建和链接

iOS 6.1动态库构建和链接,ios,jailbreak,dylib,iphone-privateapi,Ios,Jailbreak,Dylib,Iphone Privateapi,我正在尝试为iOS创建一个动态库,并在运行时加载它。在看了和之后,我一直在使用iOSOpenDev并在我的iPhone上部署所有东西。动态库的xCode项目称为KDylibTwo,我修改的文件是: KDylibTwo.h #import <Foundation/Foundation.h> @interface KDylibTwo : NSObject -(void)run; @end 为了测试我的库是否正常工作,在构建它以进行评测(IOOpenDev在iPhone上部署它的方式)

我正在尝试为iOS创建一个动态库,并在运行时加载它。在看了和之后,我一直在使用iOSOpenDev并在我的iPhone上部署所有东西。动态库的xCode项目称为KDylibTwo,我修改的文件是:

KDylibTwo.h

#import <Foundation/Foundation.h>

@interface KDylibTwo : NSObject
-(void)run;
@end
为了测试我的库是否正常工作,在构建它以进行评测(IOOpenDev在iPhone上部署它的方式)之后,我可以在我的设备上找到它,地址为
/usr/lib/libKDylibTwo.dylib
,并构建了一个调整(再次使用IOOpenDev),如下所示钩住跳板:

#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
#包括
%钩子
-(无效)发射{
NSLog(@“\n\n\n\n\n\n\n\nSBHook For libKDylibTwo.dylib”);
void*dylibLink=dlopen(“/usr/lib/libKDylibTwo.dylib”,RTLD_NOW);
if(dylibLink==NULL){
NSLog(@“加载失败”);
}否则{
NSLog(@“动态库加载”);
无效(*功能)(无效);
*(void**)(&function)=dlsym(dylibLink,“run”);
if(功能){
NSLog(@“找到函数”);
(*功能)();
}否则{
NSLog(@“未找到函数”);
}
}
NSLog(@“代码结束”);
%日志;
%奥利格;
}
%结束
在设备上安装tweak并点击图标(这将触发钩住的代码)后,控制台输出如下所示:

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]
Aug 28 13:03:35泥跳板[18254]:用于libKDylibTwo.dylib的SBHook
8月28日13:03:35普吉跳板[18254]:动态加载。
Aug 28 13:03:35 Pudge SpringBoard[18254]:未找到功能
Aug 28 13:03:35 Pudge SpringBoard[18254]:代码结束
8月28日13:03:35普吉跳板[18254]:-[launch]
我的问题是我做错了什么,库的函数没有被调用或执行!我想我应该澄清一下,我只是在谈论越狱设备,而不是应用商店的开发,所以请不要继续发帖说这是不可能的

提前谢谢你,

Panagiotis.

我从未使用dlsym来获取指向目标c方法的指针(我相信不可能通过dlsym调用目标c方法,但我可能错了)

然而,最重要的信息是,dlsym的第二个参数应该是符号名

符号名“run”仅适用于C函数。比如:

EXPORT void run()
{
 NSLog(@"Run");
}

对象C方法有更复杂的符号名称,正如我所说的,我不确定它们是否可以传递给dlsym。

正如Victor Ronin所指出的,“dlsym”代表C符号。要从运行时链接的动态库中获取objective-C类,可以使用objc运行时函数。就你而言:

void* dylibLink = dlopen("/usr/lib/libKDylibTwo.dylib", RTLD_NOW);
id KDylibTwo = [[objc_getClass("KDylibTwo") alloc] init];
[KDylibTwo run];
第一行是在运行时链接库。这是必需的,以便在其中使用代码

第二行创建类的实例
KDylibTwo
objc_getClass
函数返回类对象,您可以稍后使用该类对象创建此类实例,就像使用任何objective-C类一样-使用
alloc
init
方法。一旦你用
objc_getClass
获得了类对象,你就可以像没事一样和他一起工作了。此时,您可能会忘记在运行时动态链接了库


第三行调用
run
方法。如您所见,这是正常的objective-C语法。没有任何更改,因为您在运行时链接了库。你可以调用任何你想要的方法。

我认为你是对的。但是刚刚尝试了它(使用Theos作为动态库,以避免Objective-C头和其他东西),只添加了您所说的函数,不幸的是,我得到了相同的结果。我相信,它也应该用EXPORT标记。我建议阅读这篇关于OS X动态库的文章(考虑到iOS具有相同/非常相似的内核)-导出必须首先定义,但同样没有帮助<代码>定义导出属性((可见性(“默认”))Hmmm。。。真奇怪。那我就不知道了。首先在OSX上试一下你的代码,在OSX上它更常见(也更容易调试)。我不在家,现在无法测试。但是,Victor是对的,我展示的技术是调用C函数,而不是Obj CThank!工作完美,无需签署短信!!但我如何调用我希望从库中运行的特定函数并发送或获取数据?可能与
dylibLink
变量有关,该变量似乎未使用。您能否详细说明您希望实现的具体目标?至于签名,我的代码需要授权才能工作。如果您通过在springboard中加载dylib来测试它,那么您已经有了这个权限。跳板已经包含了它。如果你要将这个动态库链接到你的应用程序,它需要这个权限,否则它将无法工作。我想你是对的。我没想到!这与一个研究项目有关,该项目试图开发某种在iPhone上使用短信的框架。我需要的是能够处理传入的消息,修改它们,然后将它们显示给用户,反之亦然。当用户想要发送消息时,我将编辑并发送它,就像在短信中添加标题和内容一样。我肯定需要为传入的SMS部分加载一个库,我还没有研究过这个库,我想我可以为我的应用程序创建一个库。我对越狱的事真的很陌生@Panagiotis,过去它是在发出警告。在Objective-C中,调用编译时未知的方法不是错误。事实上,这是这种语言的优势之一,也是OOP设计的优势之一。这是我不太明白的事情。要解决此问题,可以使用
performSelector
NSInvocation
,具体取决于是否需要传递多个参数。但是你为什么要这样做呢?为什么不声明
myMethod
,以便编译器可以像使用“run”方法一样查看它?
void* dylibLink = dlopen("/usr/lib/libKDylibTwo.dylib", RTLD_NOW);
id KDylibTwo = [[objc_getClass("KDylibTwo") alloc] init];
[KDylibTwo run];