Подтвердить что ты не робот

IOS - добавьте "объекты" в существующее приложение (jailbroken)

Как добавить "объекты" в существующее приложение?

Например, настройка EasyRefresh для Chrome включает новую кнопку в приложении iOS Chrome, как и многие другие настройки.

Как я могу добавить простой UIButton, например, в приложение Twitter?

Есть ли какие-нибудь проекты GitHub, которые могут помочь мне понять, как это делается?


image

Источник изображения: ModMyI


Благодарю.

4b9b3361

Ответ 1

Трюк включает в себя некоторые (очень простые) обратные разработки и состоит из нескольких этапов; Я попытаюсь объяснить их как можно более четко.

Шаг Zero:, если приложение загружено из AppStore, оно зашифровано. Вы должны расшифровать его, используя один из сценариев/приложений, обычно используемых для взлома приложений; одна из команд командной строки script - poedCrack.sh(Google, вы найдете ее быстро на одном из сайтов вставки), одно приложение GUI - Crakculous (доступно в Cydia). Обратите внимание, что один из них необходим для простого (автоматического) дешифрования - метод ручного дешифрования слишком вовлечен, чтобы вставить ответ StackOverflow, поэтому я предлагаю эти инструменты.) Однако я никоим образом не поощряю вы можете взломать приложения! (В основном я прошу вас не использовать эти инструменты для своей первоначальной цели:) Если вы хотите посмотреть на процесс ручного дешифрования, зайдите сюда.

Шаг первый: вам нужно выполнить те классы, которые использует/создает приложение. Для этого вам понадобится утилита class-dump или class-dump-z. Это приложение командной строки отменяет бинарный исполняемый файл приложения и генерирует объявления интерфейса для всех классов Objective-C, которые приложение использует и имеет внутри. Здесь вы можете найти class-dump-z, более продвинутый и предпочтительный вариант .

Шаг второй: после того, как у вас есть объявления классов, вам придется угадать, какой класс делает что и когда (да, немного запутанно). Например, в одном из файлов, созданных из вышеприведенного приложения Google Chrome, с помощью класса-dump-z вы можете найти что-то подобное:

@interface ChromeUrlToolbar: UIToolbar {
    UISearchBar *urlBar;
}

- (id)initWithFrame:(CGRect)frame;
- (void)loadURL:(NSURL *)url;

@end

Хорошо, это звучит хорошо, не так ли? Вы можете видеть, что его реализация имеет метод initWithFrame: (как и все подклассы UIView) - почему бы не попробовать его изменить?

Шаг третий: для этой модификации вам понадобится MobileSubstrate. MobileSubstrate - это библиотека разработчиков, созданная Saurik, создателем Cydia, для упрощения внедрения кода в приложения. Вы можете найти действительно хорошие учебные пособия в Интернете, в том числе этот. Итак, у вас есть класс, и вы хотите "перехватить" его, поэтому вы пишете такой код:

static IMP __original_init; // A

id __modified_init(id __self, SEL __cmd, CGRect frame) // B
{
    __self = __original_init(__self, __cmd, frame); // C

    // D
    UIButton *newButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [newButton setTitle:@"Chrome Pwned"];
    newButton.frame = CGRectMake(0, 0, 100, 40);
    [__self addSubview:newButton];

    return __self;
}

// E
__attribute__((constructor))
void init()
{
    Class clazz = objc_getClass("ChromeUrlToolbar"); // F
    MSHookMessageEx(clazz, @selector(initWithFrame:), __modified_init, &__original_init); // G
}

Объяснение: начните с конца. Функция init (E) объявлена ​​__attribute__((constructor)). Это означает, что он автоматически вызывается, когда библиотека, которую мы создадим из этого кода, будет загружена в Chrome. Это именно то, что мы хотим, потому что хотим изменить наше поведение приложения до его начала.

В строке, помеченной // F, мы фиксируем объект класса, который мы хотим изменить. Objective-C - очень динамичный язык; это означает, что мы можем получать и изменять информацию о классах и объектах во время выполнения. В строке, помеченной // G, мы используем самую важную функцию API MobileSubstrate: MSHookMessageEx. Чтобы понять, как это работает, вы должны знать следующее: Objective-C сам реализуется как простая библиотека C - сам язык под капюшонами просто прост C. Поэтому каждое сообщение отправляется в Obejctive -C - фактически вызов функции C. Эта функция C имеет два специальных аргумента: self и cmd - первый - это указатель на передаваемый объект, последний - селектор (специальный уникальный указатель на имя отправляемого сообщения). Таким образом, что делает MSHookMessageEx, требуется класс и селектор, находит реализацию соответствующей им функции и обменивается этой функцией с функцией, предоставленной в самом ее третьем аргументе (__modified_init в этом случае). Чтобы не потерять данные, он также возвращает функцию в свой 4-й параметр (здесь он __original_init).

Итак, теперь инициализация панели инструментов URL-адреса Chrome перенаправляется на нашу функцию, что делать дальше? Ну, ничего особенного: сначала мы просто вызываем исходную функцию инициализации (обратите внимание на первые два специальных аргумента: __self и __cmd!), Которая создает панель инструментов, как обычно (эта строка кода обозначается символом // C). Затем мы делаем фактическое изменение: в разделе // D мы создаем UIButton, устанавливаем его заголовок и место и добавляем в качестве подзаголовка к нашей только что созданной панели инструментов. Затем, зная, что это функция инициализации, мы возвращаем исходный экземпляр вместе с нашим кодом кнопки, введенным в него.

Хорошо, это в основном то, что вам нужно знать об этом; если вам интересны более подробные сведения о том, как работает Objective-C и как вы можете создавать классные настройки iOS, я предлагаю вам прочитать официальную документацию Apple по этой темеи вы можете просматривать некоторые из моих настроек Cydia с открытым исходным кодом..

Я надеюсь, что это поможет вам!

Ответ 2

Вам нужно, чтобы понять, как работает среда выполнения Objective-C. Особенно система обмена сообщениями (т.е. Вызов метода). В частности, методы вызова определяются во время выполнения, а также на других языках, где он находится во время компиляции. Это позволяет глобальное изменение определенных методов, например, метод swizzling.

Используя библиотеку Mobile Substrate, вам будет разрешено заменить любую реализацию метода собственными и даже вызвать исходную реализацию. Для этого вам, конечно, нужно знать имя метода и аргумент, который он принимает, а также класс, которому он принадлежит.

Итак, чтобы изменить SpringBoard, например, вам нужно знать, какой класс содержит и какой метод. Вам понадобится утилита class-dump или class-dump-z, которая сделает это для вас (class-dump-z более поздний и более используемый для iOS dev, class-dump более универсален и совместим со старыми двоичными файлами, а также с 64-битным).

Итак, чтобы сбрасывать SpringBoard, вам нужно будет войти в Terminal.app

class-dump -H /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -o ~/Desktop/SpringBoard

Для класса-dump-z параметр -p будет генерировать @property вместо getters/seters, что более понятно, поэтому вы, вероятно, введите

class-dump-z -p -H /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -o ~/Desktop/SpringBoard

Эта строка создаст папку на вашем рабочем столе со всеми определениями классов SpringBoard. Конечно, вам может потребоваться изменить путь к одному, подходящему для вашей системы (об этом, для последних версий Xcode, папка разработчика в Xcode, так что вам нужно что-то вроде

/Applications/Xcode/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard

Вы также можете найти в Интернете людей, которые сделали это для вас для большинства существующих фреймворков, это довольно удобно, если вы убедитесь, что они в правильной версии для вашей системы.

Теперь для приложений AppStore вам сначала нужно будет расшифровать их, поскольку они защищены. Вероятно, вам нужно будет найти имена и ссылки, так как это, вероятно, связано с ToS, хотя использование gdb может достичь этой цели.

Чтобы облегчить работу, некоторые инструменты, такие как Logos (вам, вероятно, также нужно будет увидеть Theos), которые уменьшают требуемый код шаблона. Также есть (довольно старый) шаблон xcode и учебник для mobilesubstrate, который дает хорошую помощь.

Логотипы упрощают привязку метода method к классу classname:

%hook classname //declares the class from your application you're going to override

-(void)method {

    dosomethingnew(); //put all your new code for the method here
    return %orig;     //this calls the original definition of the method
}
%end //end hooking classname

Список фреймворков в системе и то, что они полезны, см. здесь .

Последняя вещь: список популярных твиков, которые раскрываются (ссылки на GitHub, когда это возможно):

Некоторые небольшие ухищрения

Наконец, посмотрите WeekTweak, они выпускают opensource каждую неделю, чтобы вы могли учиться, глядя на кого-то другого, попробуйте и сделайте свой собственный материал. И #theos chan на IRC (irc.saurik.com) также окажет помощь, если вы попросите его любезно.