If you want to compile a shared library for iOS, particularly for Mobile Substrate, here are some easy enough steps to do it all via CLI.
Setup
You need Theos installed, normally into /opt/theos. Follow the getting started guide
Then create a new Theo project. The following is named SampleCrack
user@myhost> $THEOS/bin/nic.pl NIC 2.0 - New Instance Creator ------------------------------ [1.] iphone/application [2.] iphone/library [3.] iphone/preference_bundle [4.] iphone/tool [5.] iphone/tweak Choose a Template (required): 2 Project Name (required): SampleCrack Package Name [com.yourcompany.samplecrack]: Author/Maintainer Name [c0ffee]: Instantiating iphone/library in samplecrack/... Done.
Then look about
user@myhost> cd samplecrack user@myhost> ls ./working/samplecrack Makefile SampleCrack.mm control theos
We are going to be using captain hook. Check it out
user@myhost> git clone git://github.com/rpetrich/CaptainHook.git
Write
Then let’s write the code, make sure you mod it to your liking, sadly there are no docs for CaptainHook.
user@myhost> cat > SampleCrack.h
#import <Foundation/Foundation.h> @interface SampleCrack : NSObject @end
user@myhost> cat > SampleCrack.mm
#import "SampleCrack.h" #import "Foundation/Foundation.h" #import "CaptainHook/CaptainHook.h" #include "notify.h" @implementation SampleCrack -(id)init { if ((self = [super init])){} return self; } @end @class SampleAppViewController; CHDeclareClass(SampleAppViewController); CHOptimizedMethod(0, self, _Bool, SampleAppViewController, isDeviceRooted) { NSLog(@"####### isJailBroken hooked"); // Logging saves lives return true; } CHConstructor { @autoreleasepool { CHLoadLateClass(SampleAppViewController); CHHook(0, SampleAppViewController, isDeviceRooted); // register hook } }
Build
Then we compile:
user@myhost> make
If you get an error that looks anything like the following:
./working/samplecrack/theos/include/IOSurface/IOSurface.h:20:10: fatal error: 'IOSurface/IOSurfaceAPI.h' file not found #include <IOSurface/IOSurfaceAPI.h>
Then try including the IOSurfaceAPI.h in, I had to do this on lion.
> cp /System/Library/Frameworks/IOSurface.framework/Headers/IOSurfaceAPI.h ./theos/include/IOSurface/
You will probably need to comment out the following lines also:
/* This call lets you get an xpcobject_t that holds a reference to the IOSurface. Note: Any live XPC objects created from an IOSurfaceRef implicity increase the IOSurface's global use count by one until the object is destroyed. */ // xpc_object_t IOSurfaceCreateXPCObject(IOSurfaceRef aSurface) // IOSFC_AVAILABLE_STARTING(_MAC_10_7, __IPHONE_NA); /* This call lets you take an xpcobject_t created via IOSurfaceCreatePort() and recreate an IOSurfaceRef from it. */ // IOSurfaceRef IOSurfaceLookupFromXPCObject(xpc_object_t xobj) // IOSFC_AVAILABLE_STARTING(_MAC_10_7, __IPHONE_NA);
See this stack overflow post if you want more detail.
You are also going to need a copy of ldid. If you have ports, try there. Brew doesn’t seem to hold a copy (They gave up on it because it fails with clang? Use llvm g++). If those fail check try making it yourself:
git clone git://git.saurik.com/ldid.git cd ldid git submodule update --init ./make.sh cp -f ./ldid $THEOS/bin/ldid
Make sure you drop it into $THEOS/bin/ldid
scp ./obj/SampleCrack.dylib root@iphone:/Library/MobileSubstrate/ ssh root@iphone root@iphone's password: iphone:~ root# ldid -S SampleCrack.ldid
Now you’ve got the dependencies, make it
user@myhost> export SDKVERSION=7.0 user@myhost> make
And you’ve got yourself a nice library
> file obj/SampleCrack.dylib ~/Documents/Customer/Documents/Elavon/working/samplecrack obj/SampleCrack.dylib: Mach-O universal binary with 2 architectures: [arm_v7: Mach-O arm_v7 dynamically linked shared library] [arm subarchitecture=11: Mach-O arm subarchitecture=11 dynamically linked shared library]