2

Logos-простой iOS Hooking

Антон Титков
Development Разработка программ для AppStore Разработка программ для Cydia
В этой теме я расскажу как создать простой твик 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/.Делаем респринг и пляшем от счастья)

Исходники доступны по ссылке https://github.com/iT0ny/LogosExample
11 июля 2011, 21:28

Ответы