В этой теме я расскажу как создать простой твик MobileSubstrate для iOS с помощью Theos и Logos Для работы нам необходимо: 1)Взломанный айДевайс с установленным MobileSubstrate 2)OS X с установленным Xcode и iOS SDK и Theos
Если все это есть,начинаем:
Первым делом создаем прокет для твика(фильтр com.apple.springboard),объяснять как это делать думаю нет причины,тк если ставили Theos,то должны уметь создавать проект:)
После создания проекта открываем Tweak.xm.Видим:
/* How to Hook with Logos
Hooks are written with syntax similar to that of an Objective-C @implementation.
You don't need to #include <substrate.h>, it will be done automatically, as will
the generation of a class list and an automatic constructor.
%hook ClassName
// Hooking a class method
+ (id)sharedInstance {
return %orig;
}
// Hooking an instance method with an argument.
- (void)messageName:(int)argument {
%log; // Write a message about this call, including its class, name and arguments, to the system log.
%orig; // Call through to the original function with its original arguments.
%orig(nil); // Call through to the original function with a custom argument.
// If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.)
}
// Hooking an instance method with no arguments.
- (id)noArguments {
%log;
id awesome = %orig;
[awesome doSomethingElse];
return awesome;
}
// Always make sure you clean up after yourself; Not doing so could have grave consequences!
%end
*/
Это нам все не нужно для твика,так что смело можете это удалять)
Теперь основная часть) Чтобы "захватить"(hook) класс в Objective C с помощью Logos необходимо набрать:
%hook ИмяКласса
//тут код
%end
Где мы можем захватывать методы(методы класса,инстанс методы,перечисленные методы(но с аргументами)). Примеры:
+ (id)sharedInstance {
return %orig;//%orig вызывает оригинальный метод +sharedInstance
}
- (id)noArguments {
%log;//выводит информацию о вызове,классе,имени и аргументах в системный лог
id awesome = %orig;//получем значение возвращаемое -noArguments
[awesome doSomethingElse];//работаем с полученным значением
return awesome;
}
//Пример с аргументом:
- (void)messageName:(int)argument {
%log;
%orig;
%orig(nil); // вызывает оригинальный метод с кастомным аргументом
}
На этом краткое введение в курс дела закончен)Пишем твик:)
Наш "первый блин" будет делать: 1)Уведомлять о запуске SpringBoard. 2)Уведомлять об успешном запуске приложения. 3)Менять цвет вспышки при создании скриншота с белого на красный.
Приступим к изготовлению нашего "блина":
Необходимо будет импортировать хедеры(не забываем в мейкфайл добавить в фреймворки UIKit):
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
Для реализации наших потребностей нам необходимо будет работать с классами SpringBoard.app,а точнее с классами:SpringBoard(не путать с приложением:)),SBApplicationIcon и SBScreenFlash,следовательно подготовим шаблоны:
%hook SpringBoard
%end
%hook SBApplicationIcon
%end
%hook SBScreenFlash // class name
%end
Чтобы SpringBoard уведомлял нас при своем запуске,нам необходимо кое-что добавить в метод - (void)applicationDidFinishLaunching:(id)x
%hook SpringBoard
- (void)applicationDidFinishLaunching:(id)x {
%orig;//вызываем оригинальный метод
//Создаем элемент UIAlertView,который будет нас уведомлять о запуске SpringBoard
UIAlertView *launchView = [[UIAlertView alloc] initWithTitle:nil message:[NSString stringWithFormat:@"SpringBoard запущен!"] delegate:nil cancelButtonTitle:@"ОК" otherButtonTitles:nil];
[launchView show];
[launchView release];
}
%end
Чтобы каждое приложение уведомляло о запуске,необходимо дополнить метод -(void)launch
%hook SBApplicationIcon
-(void)launch{
%orig;//вызываем оригинальный метод
//Создаем элемент UIAlertView,который будет нас уведомлять о запуске приложения
UIAlertView *launchView = [[UIAlertView alloc] initWithTitle:nil message:[NSString stringWithFormat:@"Приложение успешно запущено!"] delegate:nil cancelButtonTitle:@"ОК" otherButtonTitles:nil];
[launchView show];
[launchView release];
}
%end
Для изменения цвета вспышки нужно отредактировать метод класса SBScreenFlash : -(void)flashColor:(id)color
%hook SBScreenFlash
-(void)flashColor:(id)color
{
color = [UIColor redColor]; //меням цвет на красный
%orig(color); //вызываем оригинальный метод с кастомным(красным)цветом
}
%end
Сохраняем измененный Tweak.xm и компилируем проект,на выходе получем *.dylib,его кидаем на девайс в /Library/MobileSubstrate/DynamicLibraries/.Делаем респринг и пляшем от счастья)
Ответы