Я пытаюсь подключить функцию сложения. Реализация выглядит примерно так:
NSNumber *addition(NSNumber *num1, NSNumber *num2) {
double result = [num1 doubleValue] + [num2 doubleValue];
return @(result);
}
Читая документацию theos здесь, я написал следующую настройку theos:
#import <UIKit/UIKit.h>
NSInteger addition(NSInteger num1, NSInteger num2);
%hookf(NSInteger, addition, NSInteger num1, NSInteger num2) {
return 99;
}
Однако это приводит к этой ошибке:
==> Linking tweak objchooker (armv7)…
ld: warning: -multiply_defined is obsolete
Undefined symbols for architecture armv7:
"_addition", referenced from:
__logosLocalInit in Tweak.x.f54e192c.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [/Users/hnin.sin/Desktop/objchooker/.theos/obj/debug/armv7/objchooker.dylib] Error 1
make[2]: *** [/Users/hnin.sin/Desktop/objchooker/.theos/obj/debug/armv7/objchooker.dylib] Error 2
make[1]: *** [internal-library-all_] Error 2
make: *** [objchooker.all.tweak.variables] Error 2
%hook и %hookf оба работают в моем быстром тестовом приложении, но только %hook работает в этом приложении Objective-C. Я делаю что-то неправильно для %hookf или %hookf не работает в приложениях Objective-C?
%hookf Используется для подключения к функциям C, а не к методам Objective-C.
Это не дает ответа на вопрос. Как только у вас будет достаточная репутация , вы сможете комментировать любую публикацию ; вместо этого дайте ответы, не требующие разъяснений от спрашивающего . - Из отзыва
%hookf также можно использовать для подключения к быстрым функциям, но почему бы не использовать и Objective-C?
После долгих проб и ошибок я обнаружил, что на самом деле можно подключиться к функциям Objective-C.
То, чего мне здесь не хватало, вызывало эту ошибку:
Undefined symbols for architecture armv7:"_addition",
referenced from:
__logosLocalInit in Tweak.x.f54e192c.o
ld: symbol(s) not found for architecture armv7
дело в том, что я не добавил это в конец твика
%ctor {
%init(addition= MSFindSymbol(NULL, "_addition"));
}
и это важно, потому что эта функция была создана мной, и THEOS на самом деле не знает, где она находится, если только не ищет ее во время выполнения с помощью предоставленного мной символа.
весь твик выглядит примерно так
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
%hookf(NSNumber *, addition, NSNumber *num1, NSNumber *num2) {
return @99;
}
%ctor {
%init(addition= MSFindSymbol(NULL, "_addition"));
}
ок, нвм, я тупой. Objective-c наследует свои функции от C, поэтому, когда я определяю функцию в Objective-C, я фактически создаю функцию C. Итак, в этом случае я пытаюсь подключить функцию C
см. это: github.com/NightwindDev/Tweak-Tutorial/blob/main/hookf.md