3

iOS 用の動的ライブラリを作成し、実行時にロードしようとしています。この質問この回答を見た後、私は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

ライブラリが機能するかどうかをテストするために、プロファイリング用にビルドした後 (iOSOpenDev が iPhone にデプロイする方法/usr/lib/libKDylibTwo.dylib)、次のように SpringBoard をフックして、自分のデバイスに格納されているのを見つけて (再び iOSOpenDev を使用して) 微調整をビルドできます。

#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

デバイスに微調整をインストールし、アイコンをタップすると (フックされたコードが起動されます)、コンソールの出力は次のようになります。

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]

私の質問は、何が間違っているのか、ライブラリの関数が呼び出されていない、または実行されていないということです! 私はジェイルブレイクされたデバイスについてのみ話しているのであって、App Store での開発について話しているわけではないことを明確にする必要があると思います。


パナギオティスさん、よろしくお願いします。

4

2 に答える 2

6

Victor Ronin が指摘したように、「dlsym」は C シンボル用です。実行時にリンクした dylib から目的の C クラスを取得するには、objc ランタイム関数を使用できます。あなたの場合:

void* dylibLink = dlopen("/usr/lib/libKDylibTwo.dylib", RTLD_NOW);
id KDylibTwo = [[objc_getClass("KDylibTwo") alloc] init];
[KDylibTwo run];

最初の行は、実行時にライブラリをリンクしています。これは、その中でコードを使用するために必要です。

2 行目は class のインスタンスを作成しますKDylibTwoobjc_getClassfunction はクラス オブジェクトを返します。このオブジェクトを後で使用して、目的の C クラスの場合と同様に、メソッドallocinitメソッドを使用して、このクラスのインスタンスを作成できます。クラス オブジェクトを取得しobjc_getClassたら、何事もなかったかのように操作できます。この時点で、実行時にライブラリを動的にリンクしたことを忘れることができます。

3 行目は呼び出しrunメソッドです。ご覧のとおり、これは通常の Objective-C 構文です。実行時にライブラリをリンクしたため、何も変更されません。任意のメソッドを呼び出すことができます。

于 2013-08-28T20:45:36.657 に答える