Logos構文

3696 ワード

//Tweak.xm

1.前処理命令


%hook


hookが必要なclassを指定し、%endで終わる必要があります
%hook SpringBoard
- (void)_menuButtonDown:(id)down
{
    NSLog(@" ");
    %orig;//call the original _menuButtonDown;
}
%end

このコードの意味はSpringBoardクラスにチェックを入れることです.menuButtonDown:関数は、syslogに文を書き込んでから、関数の元の操作を実行します.

%log


この命令は%hook内部で使用され,関数のクラス名,パラメータなどの情報をsyslogに書き込む.
%hoot SpringBoard
- (void)_menubuttonDown:(id)down
{
    %log((NSString *)@"iOSRE",(NSString *)@"Debug");
    %orig;//call the original _menuButtonDown;
}
%end

%orig


この命令は%hook内部で使用され,チェックされた関数の元のコードを実行する.例:
%hook SpringBoard
- (void)_menuButtonDown:(id)down
{
    NSLog(@" ");
    %orig; // 
}
%end

*%orig*を削除すると、元の関数は実行されません.
hook SpringBoard
- (void)_menuButtonDown:(id)down
{
    NSLog(@" ");
}
%end

元の行数のパラメータを%origで変更することもできます.
%hook SBLockScreenDateViewController
- (void)setCustomSubtitleText:(id)arg1 withColor:(id)arg2
{
    %orig(@"Re",arg2);
}
%end

この方法は、ロック画面の日付表示を変更する.

%group


この命令は*%hookをグループ化するために使用され、コード管理と条件によってグループを初期化しやすく、%endで終わる必要があります.1つの%groupには複数の%hookを含めることができ、カスタムgroupに属していないすべての%hookは%group_に暗黙的に分類されます.ungroupes*にあります.使用法は次のとおりです.
%group iOS7Hook
%hook iOS7Class 
- (id)iOS7Method {
     id result = %orig; 
     NSLog(@"This class & method only exist in iOS 7."); 
     return result;
 } %end 
%end // iOS7Hook

%group iOS8Hook 
%hook iOS8Class 
- (id)iOS8Method {
   id result = %orig; 
   NSLog(@"This class & method only exist in iOS 8."); return result;
 }
%end
%end // iOS8Hook

%init


このコマンドは*%groupを初期化するために使用され、%hookまたは%ctor*内で呼び出さなければなりません.パラメータが付いている場合は指定したgroupを初期化し、パラメータが付いていない場合は_を初期化します.ungrouped、次のようにします.
#ifndef kCFCoreFoundationVersionNumber_iOS_8_0 
#define kCFCoreFoundationVersionNumber_iOS_8_0 1140.10 #endif
%hook SpringBoard 
- (void)applicationDidFinishLaunching:(id)application {
    %orig; 
    %init; // Equals to %init(_ungrouped)
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0 && kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_8_0)
      %init(iOS7Hook);
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0)
      %init(iOS8Hook);
}
%end

%initを呼び出してこそ、対応する%groupが機能します.

%ctor


tweakの*constructor*は初期化作業を完了します.明示的に定義しない場合、Theosは自動的に*%ctorを生成し、%init(_ungrouped)*を呼び出します.そのため、
%hook SpringBoard 
- (void)reboot {
    NSLog(@"If rebooting doesn't work then I'm screwed.");
    %orig;
}
%end

Theosは次のように暗黙的に定義されているため、有効になります.
%ctor
{
    %init(_ungrouped);
}

そして
%hook SpringBoard
- (void)reboot{
     NSLog(@"If rebooting doesn't work then I'm screwed.");
     %orig;
}
%end

%ctor
{
    // Need to call %init explicitly!
}

の%hookは有効になりません.%ctorが定義されているのに%initが呼び出されていないため、%group(_ungrouped)は機能しません.%ctorは一般的に%groupを初期化したり、MSHookFunctionなどの操作を行うために使用できます.
%ctorは%endで終わる必要はありません.

%new


%hookの内部で使用し、既存のclassに新しい関数を追加し、class_と機能します.addMethodは同じです.次のように使用されます.
%hook SpringBoard 
%new 
- (void)namespaceNewMethod {
     NSLog(@"We've added a new method to SpringBoard."); 
}
%end

%c


この命令の役割はobjc_に等しいgetClassまたはNSClassFromStringは、クラスの定義を動的に取得し、%hookまたは%ctorで使用します.

%subclass


%config