Difference between revisions of "Logos"

From iPhone Development Wiki
Jump to: navigation, search
(%config: Explain configuration directives.)
m (It’s confusing to keep this around, so replacing with a link to the current documentation)
(Tag: Replaced)
 
(43 intermediate revisions by 14 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 =====
 
 
 
<source lang="logos">
 
%init
 
%init([<class>=<expr>, …])
 
%init(Group[, [+|-]<class>=<expr>, …])
 
</source>
 
 
 
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 =====
 
 
 
<source lang="logos">%config(X=Y);</source>
 
 
 
Set a logos configuration flag.
 
 
 
======Configuration Flags======
 
* generator
 
**; MobileSubstrate
 
**: generate code that uses [[MobileSubstrate]] for hooking.
 
**; internal
 
**: generate code that uses only internal Objective-C runtime methods for hooking.
 
* warnings
 
**; none
 
**: suppress all warnings
 
**; default
 
**: non-fatal warnings
 
**; error
 
**: make all warnings fatal
 
* dump
 
**; yaml
 
**: dump the internal parse tree in YAML format
 
* patches
 
**; full
 
**: when dumping data, include text substitutions for patch points
 
 
 
===== %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; // Call the original implementation of this method
 
    return;
 
}
 
%end
 
</source>
 
 
 
===== %subclass =====
 
 
 
<source lang="logos">%subclass Classname: Superclass <Protocol, Protocol></source>
 
 
 
Subclass block - the class is created at runtime and populated with methods. ivars are not yet supported.
 
 
 
===== %group =====
 
 
 
<source lang="logos">%group Groupname</source>
 
 
 
Begin a hook group (for conditional initialization or code organization) with the name ''Groupname''. All ungrouped hooks are in the implicit "_ungrouped" group.
 
 
 
===== %class =====
 
 
 
<source lang="logos">%class Class</source>
 
 
 
Forward-declare a class. Outmoded by %c, but still exists. Creates a $Class variable, and initializes it with the "_ungrouped" group.
 
 
 
===== %new =====
 
 
 
<source lang="logos">%new
 
%new(signature)</source>
 
Add a new method to a hooked class or subclass. ''signature'' is the Objective-C type encoding for the new method; if it is omitted, one will be generated.
 
 
 
===== %ctor =====
 
 
 
<source lang="logos">%ctor { … }</source>
 
 
 
Generate an anonymous constructor (of default priority).
 
 
 
===== %end =====
 
 
 
<source lang="logos">%end</source>
 
 
 
Close a hook/subclass/group block.
 
 
 
==== Inline ====
 
 
 
===== %c =====
 
 
 
<source lang="logos">%c(Class)</source>
 
 
 
Effectively evaluates to Class, at runtime. Technically, creates $Class and populates it when the "_ungrouped" group is initialized.
 
 
 
===== %orig =====
 
 
 
<source lang="logos">
 
%orig
 
%orig(args)
 
</source>
 
 
 
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 =====
 
 
 
<source lang="logos">%log</source>
 
 
 
Dump the method arguments to syslog.
 
 
 
[[Category:Development Tools]]
 

Latest revision as of 18:12, 19 February 2022

Soft redirect to:https://theos.dev/docs/logos

This article is obsolete, and has been replaced by the theos.dev website.

If you need historical installation instructions, you can find the last version of this article here.