|
|
(47 intermediate revisions by 15 users not shown) |
Line 1: |
Line 1: |
| Logos is a component of the [[Theos]] development suite that allows method hooking code to be written easily and clearly, using a set of special preprocessor directives.
| | {{soft redirect|https://theos.dev/docs/logos}} |
|
| |
|
| == Overview ==
| | This article is obsolete, and has been replaced by the [https://theos.dev/docs/logos theos.dev website]. |
|
| |
|
| The syntax provided by Logos greatly simplifies the development of MobileSubstrate extensions ("tweaks") which can hook other methods throughout the OS.
| | If you need historical installation instructions, you can find the last version of this article [https://iphonedev.wiki/index.php?title=Logos&oldid=5734 here]. |
| In this context, "method hooking" refers to a technique used to replace or modify methods of classes found in other applications on the phone.
| |
| | |
| == Getting Logos ==
| |
| | |
| Logos is distributed with [[Theos]], and you can use Logos' syntax in any Theos-built project without any extra setup. For more information about Theos, visit [[Theos|its page]].
| |
| | |
| == Using Logos ==
| |
| | |
| === Examples ===
| |
| | |
| Write me!
| |
| | |
| === List of Logos Directives ===
| |
| | |
| ==== Initialization ====
| |
| | |
| ===== %init =====
| |
| | |
| %init
| |
| %init([<class>=<expr>, …])
| |
| %init(Group[, [+|-]<class>=<expr>, …])
| |
| | |
| Initialize a group (or the default group). Passing no group name will initialize "_ungrouped", and passing class=expr arguments will substitute the given expressions for those classes at initialization time. The + sigil (as in class methods in Objective-C) can be prepended to the classname to substitute an expression for the metaclass. If not specified, the sigil defaults to -, to substitute the class itself. If not specified, the metaclass is derived from the class.
| |
| | |
| ==== Block-level ====
| |
| | |
| The directives in this category open a block of code which must be closed by an %end directive (shown below).
| |
| | |
| ===== %config =====
| |
| | |
| %config(X=Y)
| |
| | |
| Set a logos configuration flag - currently unused, but the only existing configurable flag is 'generator', and the only generator that exists is "MobileSubstrate"
| |
| | |
| ===== %hook =====
| |
| | |
| <source lang="logos">%hook Classname</source>
| |
| | |
| Open a hook block for the class named ''Classname''.
| |
| | |
| Here's a trivial example:
| |
| | |
| <source lang="logos">
| |
| %hook SBApplicationController
| |
| -(void)uninstallApplication:(SBApplication *)application {
| |
| NSLog(@"Hey, we're hooking uninstallApplication:!");
| |
| %orig;
| |
| return;
| |
| }
| |
| %end
| |
| </source>
| |
| | |
| ===== %subclass =====
| |
| | |
| %subclass Classname: Superclass <Protocol, Protocol>
| |
| | |
| Subclass block - the class is created at runtime and populated with methods. ivars are not yet supported.
| |
| | |
| ===== %group =====
| |
| | |
| %group Groupname
| |
| | |
| Begin a hook group (for conditional initialization or code organization) with the name ''Groupname''. All ungrouped hooks are in the implicit "_ungrouped" group.
| |
| | |
| ===== %class =====
| |
| | |
| %class Class
| |
| | |
| Forward-declare a class. Outmoded by %c, but still exists. Creates a $Class variable, and initializes it with the "_ungrouped" group.
| |
| | |
| ===== %new =====
| |
| | |
| %new(signature)
| |
| | |
| Add a new method to a hooked class or subclass.
| |
| | |
| ===== %ctor =====
| |
| | |
| %ctor { … }
| |
| | |
| Generate an anonymous constructor (of default priority).
| |
| | |
| ===== %end =====
| |
| | |
| %end
| |
| | |
| Close a hook/subclass/group block.
| |
| | |
| ==== Inline ====
| |
| | |
| ===== %c =====
| |
| | |
| %c(Class)
| |
| | |
| Effectively evaluates to Class, at runtime. Technically, creates $Class and populates it when the "_ungrouped" group is initialized.
| |
| | |
| ===== %orig =====
| |
| | |
| %orig
| |
| %orig(args)
| |
| | |
| Call the original hooked method. Doesn't function in a `%new`'d method. Works in subclasses, strangely enough, because MobileSubstrate will generate a supercall closure at hook time. (If the hooked
| |
| method doesn't exist in the class we're hooking, it creates a stub that just calls the superclass implementation.) args is passed to the original function - don't include `self` and `_cmd`, Logos does this for you.
| |
| | |
| ===== %log ===== | |
| | |
| %log
| |
| | |
| Dump the method arguments to syslog.
| |
| | |
| [[Category:Development Tools]]
| |