theos
注入、拦截函数的工具;为了方便开发,采用logos 语法;在编译的过程中,会通过logos.pl(/opt/theos/bin/logos.pl ) 转换成真正的代码(当然也包括基本的logos语法检查)。
build
- make messages=yes 查看theo内部处理细节。
theo 高级用法
logos 的高级用法
%c :
objc_getClass("MMServiceCenter")
,利用了oc的runtime特性
%c 在xm、MM文件中的表示
[%c(FTSContactMgr) enter_infogroup:newRooms];
[_logos_static_class_lookup$FTSContactMgr() enter_infogroup:newRooms];
%new(
方法签名
) 给一个类新增一个方法;如果不写方法签名,theos会自动生成
- 获取函数签名
_typeEncoding
``` Class class = [self class]; SEL originalSelector = @selector(viewWillAppear:); Method originalMethod = class_getInstanceMethod(class, originalSelector); method_getTypeEncoding(swizzledMethod)// 使用%s 进行打印。 ```
%new 在MM 文件中的表示
static void _logos_meta_method$group$FTSContactMgr$enter_infogroup$(_LOGOS_SELF_TYPE_NORMAL Class _LOGOS_SELF_CONST __unused self, SEL __unused _cmd, NSMutableArray* newRooms) { static void _logos_meta_method$group$FTSContactMgr$enter_infogroup$(_LOGOS_SELF_TYPE_NORMAL Class _LOGOS_SELF_CONST, SEL, NSMutableArray*); class_addMethod(_logos_metaclass$group$FTSContactMgr, @selector(enter_infogroup:), (IMP)&_logos_meta_method$group$FTSContactMgr$enter_infogroup$, _typeEncoding);
例如block的方法签名
makefile 的高级用法
- 开启arc: 不用自己手动进行内存管理
$(TWEAK_NAME)_CFLAGS += -fobjc-arc
-
单独为单个文件指定mrc
-
ZKSwizzle/ZKSwizzle.m_CFLAGS = -fno-objc-arc
layout
应用场景: 新增图片、文件等资源文件,或者二进制可执行文件;然后在代码中调用使用它们。这个时候可以使用
layout
目录指定文件到特定的路径。获取文件的例子
NSString* resourcePath = @"/Library/Application Support/TweakDemo/"; NSDictionary* resourceDict = [[NSDictionary alloc] initWithContentsOfFile:[resourcePath stringByAppendingPathComponent:@"resource.plist"]]; NSLog(@"resourceDict:%@", resourceDict);
集成第三方库
编译参数指定一些编译链接参数、搜索路径
TweakDemo_CFLAGS = -fobjc-arc -Wno-int-to-void-pointer-cast -Wno-int-to-pointer-cast -I./BookLib/include -F./BookFramework # 指定头文件位置 ZKSwizzle/ZKSwizzle.m_CFLAGS = -fno-objc-arc # 设置单个文件的MRC TweakDemo_LDFLAGS = -L./BookLib -F./BookFramework # 链接 TweakDemo_LIBRARIES = BookLib #.a TweakDemo_FRAMEWORKS = BookFramework # framke
导入头文件直接调用
// 这个第三方库或者头文件也可以放到 /opt/theos/对应的目录 #import <BookLib/BookLib.h> //.a #import <BookFramework/BookFramework.h>// framework
logify
根据头文件快速生成跟踪代码
logify.pl UIWindow.h >> ../Manager.xm
- 并将生成的代码文件Manager.xm 加入makefile中的
TweakDemo_FILES
参与编译。
推荐使用KNHook.h,具体用法看这里hookClassLog;当然MonkeyDev的跟踪日志也很强大.
tree
tree -L 1
.
├── LICENSE.md
├── Prefix.pch
├── README.md
├── bin
├── extras
├── include
├── lib
├── makefiles
├── mod
├── sdks
├── templates
├── toolchain
└── vendor
tree -L 2
├── LICENSE.md
├── Prefix.pch
├── README.md
├── bin
│ ├── deb_build_num.sh
│ ├── denicify.pl
│ ├── dm.pl
│ ├── dm.pl.txt
│ ├── fakeroot.sh
│ ├── install.copyFile
│ ├── install.exec
│ ├── install.mergeDir
│ ├── ldid
│ ├── lib
│ ├── logify.pl
│ ├── logos.pl
│ ├── nic.pl
│ ├── nicify.pl
│ ├── package_version.sh
│ ├── post-update
│ ├── target.pl
│ ├── update-git-repo
│ └── vercmp.pl
├── extras
│ └── vim
├── include
│ ├── CPBitmapStore.h
│ ├── CPDistributedMessagingCenter.h
│ ├── Celestial
│ ├── CoreSurface
│ ├── EventRegister.h
│ ├── IOKit
│ ├── IOMobileFrameBuffer.h
│ ├── IOSurface
│ ├── LSApplicationWorkspace.h
│ ├── MobileInstallation.h
│ ├── SpringBoard.h
│ ├── bootstrap.h
│ ├── lauxlib.h
│ ├── lua.h
│ ├── lua.hpp
│ ├── luaconf.h
│ ├── lualib.h
│ ├── rocketbootstrap.h
│ ├── rocketbootstrap_dynamic.h
│ └── substrate.h
├── lib
│ ├── AFNetworking.framework
│ ├── IOKit.framework
│ ├── IOMobileFramebuffer.framework
│ ├── IOSurface.framework
│ ├── SpringBoardServices.framework
│ ├── StoreServices.framework
│ ├── librocketbootstrap.dylib
│ ├── libsimulatetouch.dylib
│ └── libsubstrate.dylib
├── makefiles
│ ├── aggregate.mk
│ ├── application.mk
│ ├── bundle.mk
│ ├── common.mk
│ ├── framework.mk
│ ├── install
│ ├── instance
│ ├── legacy.mk
│ ├── library.mk
│ ├── master
│ ├── messages.mk
│ ├── null.mk
│ ├── package
│ ├── package.mk
│ ├── platform
│ ├── rules.mk
│ ├── simbltweak.mk
│ ├── stage.mk
│ ├── subproject.mk
│ ├── targets
│ ├── tool.mk
│ └── tweak.mk
├── mod
├── sdks
├── templates
│ └── ios
├── toolchain
└── vendor
├── include
└── lib
tree -L 3
IOKit.h
- 发现了/opt/theos/include/IOKit ` IOKit.h -> IOKitLib.h`
│ ├── IOKit │ │ ├── IOKit.h -> IOKitLib.h
/opt/theos/include/IOKit
还新增了hid 和 hidsystem 目录
│ │ ├── hid
│ │ └── hidsystem
- /opt/theos/include
├── include
│ ├── CPBitmapStore.h
│ ├── CPDistributedMessagingCenter.h
│ ├── Celestial
│ │ ├── AVArrayQueueFeeder.h
│ │ ├── AVCallbackHandler.h
│ │ ├── AVController-AVController_Celeste.h
│ │ ├── AVController.h
│ │ ├── AVControllerFig.h
│ │ ├── AVControllerRemoteFig.h
│ │ ├── AVControllerRemoteFigStream.h
│ │ ├── AVFileProcessor.h
│ │ ├── AVFileValidator.h
│ │ ├── AVFromMainThreadPostNotificationNameDict.h
│ │ ├── AVFromNotifySafeThreadPostNotificationNameDict.h
│ │ ├── AVItem-AVItemLogging.h
│ │ ├── AVItem.h
│ │ ├── AVItemAccessLog.h
│ │ ├── AVItemAccessLogEvent.h
│ │ ├── AVItemAccessLogEventInternal.h
│ │ ├── AVItemAccessLogInternal.h
│ │ ├── AVItemErrorLog.h
│ │ ├── AVItemErrorLogEvent.h
│ │ ├── AVItemErrorLogEventInternal.h
│ │ ├── AVItemErrorLogInternal.h
│ │ ├── AVObjectRegistry.h
│ │ ├── AVPlaybackItem.h
│ │ ├── AVPlaybackQueue.h
│ │ ├── AVQueue.h
│ │ ├── AVQueueFeeder.h
│ │ ├── AVRecorder.h
│ │ ├── AVRecorderAudioQueueImpl.h
│ │ ├── AVRecorderImpl-Protocol.h
│ │ ├── AVRemaker.h
│ │ ├── AVSafePerformOnMainThreadTargetDict.h
│ │ ├── AVSafePostDelayedNotificationFromMainThreadTargetDict.h
│ │ ├── AVSubtitleLayerUsingWebKit.h
│ │ ├── AVSystemController.h
│ │ ├── AVTimeMarkerObservation.h
│ │ ├── AVValue.h
│ │ ├── CDStructures.h
│ │ ├── EventSystemManager.h
│ │ ├── FigAccelerometerDelegate.h
│ │ ├── FigCoreMotionDelegate.h
│ │ ├── FigIOHIDMotionDelegate.h
│ │ ├── NSArray-PickableRoutes.h
│ │ ├── NSCopying-Protocol.h
│ │ ├── NSDictionary-PickableRoute.h
│ │ ├── NSObject-NSObject_AVShared.h
│ │ ├── NSObject-Protocol.h
│ │ └── SBSAccelerometerDelegate-Protocol.h
│ ├── CoreSurface
│ │ └── CoreSurface.h
│ ├── EventRegister.h
│ ├── IOKit
│ │ ├── IOKit.h -> IOKitLib.h
│ │ ├── IOKitKeys.h
│ │ ├── IOKitLib.h
│ │ ├── IOReturn.h
│ │ ├── IOTypes.h
│ │ ├── OSKext.h
│ │ ├── OSMessageNotification.h
│ │ ├── hid
│ │ └── hidsystem
│ ├── IOMobileFrameBuffer.h
│ ├── IOSurface
│ │ ├── IOSurface.h
│ │ ├── IOSurfaceAPI.h
│ │ ├── IOSurfaceAccelerator.h
│ │ └── IOSurfaceBase.h
│ ├── LSApplicationWorkspace.h
│ ├── MobileInstallation.h
│ ├── SpringBoard.h
│ ├── bootstrap.h
│ ├── lauxlib.h
│ ├── lua.h
│ ├── lua.hpp
│ ├── luaconf.h
│ ├── lualib.h
│ ├── rocketbootstrap.h
│ ├── rocketbootstrap_dynamic.h
│ └── substrate.h
- /opt/theos/lib
├── lib 这个新增的主要库 │ ├── AFNetworking.framework │ │ ├── AFNetworking │ │ ├── Headers │ │ ├── Info.plist │ │ ├── Modules │ │ └── _CodeSignature │ ├── IOKit.framework │ │ ├── IOKit.tbd │ │ └── Versions │ ├── IOMobileFramebuffer.framework │ │ └── IOMobileFramebuffer.tbd │ ├── IOSurface.framework │ │ ├── IOSurface.tbd │ │ └── PTFakeTouch.framework │ ├── SpringBoardServices.framework │ │ └── SpringBoardServices.tbd │ ├── StoreServices.framework │ │ └── StoreServices.tbd │ ├── librocketbootstrap.dylib │ ├── libsimulatetouch.dylib │ └── libsubstrate.dylib
- 完整列表
.
├── LICENSE.md
├── Prefix.pch
├── README.md
├── bin
│ ├── deb_build_num.sh
│ ├── denicify.pl
│ ├── dm.pl
│ ├── dm.pl.txt
│ ├── fakeroot.sh
│ ├── install.copyFile
│ ├── install.exec
│ ├── install.mergeDir
│ ├── ldid
│ ├── lib
│ │ ├── Logos
│ │ ├── NIC
│ │ ├── aliased.pm
│ │ └── parent.pm
│ ├── logify.pl
│ ├── logos.pl
│ ├── nic.pl
│ ├── nicify.pl
│ ├── package_version.sh
│ ├── post-update
│ ├── target.pl
│ ├── update-git-repo
│ └── vercmp.pl
├── extras
│ └── vim
│ ├── README
│ ├── ftplugin
│ ├── indent
│ └── syntax
├── include
│ ├── CPBitmapStore.h
│ ├── CPDistributedMessagingCenter.h
│ ├── Celestial
│ │ ├── AVArrayQueueFeeder.h
│ │ ├── AVCallbackHandler.h
│ │ ├── AVController-AVController_Celeste.h
│ │ ├── AVController.h
│ │ ├── AVControllerFig.h
│ │ ├── AVControllerRemoteFig.h
│ │ ├── AVControllerRemoteFigStream.h
│ │ ├── AVFileProcessor.h
│ │ ├── AVFileValidator.h
│ │ ├── AVFromMainThreadPostNotificationNameDict.h
│ │ ├── AVFromNotifySafeThreadPostNotificationNameDict.h
│ │ ├── AVItem-AVItemLogging.h
│ │ ├── AVItem.h
│ │ ├── AVItemAccessLog.h
│ │ ├── AVItemAccessLogEvent.h
│ │ ├── AVItemAccessLogEventInternal.h
│ │ ├── AVItemAccessLogInternal.h
│ │ ├── AVItemErrorLog.h
│ │ ├── AVItemErrorLogEvent.h
│ │ ├── AVItemErrorLogEventInternal.h
│ │ ├── AVItemErrorLogInternal.h
│ │ ├── AVObjectRegistry.h
│ │ ├── AVPlaybackItem.h
│ │ ├── AVPlaybackQueue.h
│ │ ├── AVQueue.h
│ │ ├── AVQueueFeeder.h
│ │ ├── AVRecorder.h
│ │ ├── AVRecorderAudioQueueImpl.h
│ │ ├── AVRecorderImpl-Protocol.h
│ │ ├── AVRemaker.h
│ │ ├── AVSafePerformOnMainThreadTargetDict.h
│ │ ├── AVSafePostDelayedNotificationFromMainThreadTargetDict.h
│ │ ├── AVSubtitleLayerUsingWebKit.h
│ │ ├── AVSystemController.h
│ │ ├── AVTimeMarkerObservation.h
│ │ ├── AVValue.h
│ │ ├── CDStructures.h
│ │ ├── EventSystemManager.h
│ │ ├── FigAccelerometerDelegate.h
│ │ ├── FigCoreMotionDelegate.h
│ │ ├── FigIOHIDMotionDelegate.h
│ │ ├── NSArray-PickableRoutes.h
│ │ ├── NSCopying-Protocol.h
│ │ ├── NSDictionary-PickableRoute.h
│ │ ├── NSObject-NSObject_AVShared.h
│ │ ├── NSObject-Protocol.h
│ │ └── SBSAccelerometerDelegate-Protocol.h
│ ├── CoreSurface
│ │ └── CoreSurface.h
│ ├── EventRegister.h
│ ├── IOKit
│ │ ├── IOKit.h -> IOKitLib.h
│ │ ├── IOKitKeys.h
│ │ ├── IOKitLib.h
│ │ ├── IOReturn.h
│ │ ├── IOTypes.h
│ │ ├── OSKext.h
│ │ ├── OSMessageNotification.h
│ │ ├── hid
│ │ └── hidsystem
│ ├── IOMobileFrameBuffer.h
│ ├── IOSurface
│ │ ├── IOSurface.h
│ │ ├── IOSurfaceAPI.h
│ │ ├── IOSurfaceAccelerator.h
│ │ └── IOSurfaceBase.h
│ ├── LSApplicationWorkspace.h
│ ├── MobileInstallation.h
│ ├── SpringBoard.h
│ ├── bootstrap.h
│ ├── lauxlib.h
│ ├── lua.h
│ ├── lua.hpp
│ ├── luaconf.h
│ ├── lualib.h
│ ├── rocketbootstrap.h
│ ├── rocketbootstrap_dynamic.h
│ └── substrate.h
├── lib 这个新增的主要库
│ ├── AFNetworking.framework
│ │ ├── AFNetworking
│ │ ├── Headers
│ │ ├── Info.plist
│ │ ├── Modules
│ │ └── _CodeSignature
│ ├── IOKit.framework
│ │ ├── IOKit.tbd
│ │ └── Versions
│ ├── IOMobileFramebuffer.framework
│ │ └── IOMobileFramebuffer.tbd
│ ├── IOSurface.framework
│ │ ├── IOSurface.tbd
│ │ └── PTFakeTouch.framework
│ ├── SpringBoardServices.framework
│ │ └── SpringBoardServices.tbd
│ ├── StoreServices.framework
│ │ └── StoreServices.tbd
│ ├── librocketbootstrap.dylib
│ ├── libsimulatetouch.dylib
│ └── libsubstrate.dylib
├── makefiles
│ ├── aggregate.mk
│ ├── application.mk
│ ├── bundle.mk
│ ├── common.mk
│ ├── framework.mk
│ ├── install
│ │ ├── deb_local.mk
│ │ ├── deb_remote.mk
│ │ ├── none_local.mk
│ │ ├── none_remote.mk -> none_local.mk
│ │ ├── pkg_local.mk
│ │ ├── pkg_remote.mk
│ │ ├── rpm_local.mk
│ │ └── rpm_remote.mk
│ ├── instance
│ │ ├── application.mk
│ │ ├── bundle.mk
│ │ ├── framework.mk
│ │ ├── library.mk
│ │ ├── null.mk
│ │ ├── rules.mk
│ │ ├── shared
│ │ ├── simbltweak.mk
│ │ ├── subproject.mk
│ │ ├── tool.mk
│ │ └── tweak.mk
│ ├── legacy.mk
│ ├── library.mk
│ ├── master
│ │ ├── aggregate.mk
│ │ ├── application.mk
│ │ ├── bundle.mk
│ │ ├── framework.mk
│ │ ├── library.mk
│ │ ├── null.mk
│ │ ├── rules.mk
│ │ ├── simbltweak.mk
│ │ ├── subproject.mk
│ │ ├── tool.mk
│ │ └── tweak.mk
│ ├── messages.mk
│ ├── null.mk
│ ├── package
│ │ ├── deb.mk
│ │ ├── none.mk
│ │ ├── pkg.mk
│ │ └── rpm.mk
│ ├── package.mk
│ ├── platform
│ │ ├── Cygwin.mk
│ │ ├── Darwin-arm.mk
│ │ ├── Darwin.mk
│ │ ├── Linux.mk
│ │ └── Windows.mk
│ ├── rules.mk
│ ├── simbltweak.mk
│ ├── stage.mk
│ ├── subproject.mk
│ ├── targets
│ │ ├── Cygwin -> Windows
│ │ ├── Darwin
│ │ ├── Darwin-arm
│ │ ├── Linux
│ │ ├── Windows
│ │ └── _common
│ ├── tool.mk
│ └── tweak.mk
├── mod
├── sdks
├── templates
│ └── ios
│ ├── dhowett
│ ├── sharedinstance
│ ├── theos
│ └── uroboro
├── toolchain
└── vendor
├── include
│ ├── AddressBookUI
│ ├── AlienBlue
│ ├── AppKit
│ ├── AppList
│ ├── AppSupport
│ ├── ApplePushService
│ ├── AssertionServices
│ ├── Availability2.h
│ ├── BackBoardServices
│ ├── BaseBoard
│ ├── BiteSMS
│ ├── BulletinBoard
│ ├── CaptainHook
│ ├── Celestial
│ ├── ChatKit
│ ├── Contacts
│ ├── CoreFoundation
│ ├── CoreLocation
│ ├── CydiaSubstrate.h -> substrate.h
│ ├── Flipswitch
│ ├── Foundation
│ ├── FrontBoard
│ ├── GraphicsServices
│ ├── IMCore
│ ├── IMDaemonCore
│ ├── IMFoundation
│ ├── IconSupport
│ ├── Jasmine
│ ├── LICENSE.md
│ ├── LightMessaging
│ ├── MapKit
│ ├── MediaPlayer
│ ├── MediaPlayerUI
│ ├── MediaRemote
│ ├── MobileCoreServices
│ ├── MobileGestalt
│ ├── MobileIcons
│ ├── MobilePhone
│ ├── MobileSMS
│ ├── MobileTimer
│ ├── Pandora
│ ├── PersistentConnection
│ ├── PhotoLibrary
│ ├── PhotoLibraryServices
│ ├── Preferences
│ ├── PreferencesUI
│ ├── QuartzCore
│ ├── README.md
│ ├── SpringBoard
│ ├── SpringBoardFoundation
│ ├── SpringBoardServices
│ ├── SpringBoardUI
│ ├── SpringBoardUIServices
│ ├── StoreKitUI
│ ├── TechSupport
│ ├── TelephonyUI
│ ├── Tweetbot
│ ├── TwitkaFly
│ ├── UIKit
│ ├── Velox
│ ├── _Prefix
│ ├── auki
│ ├── installd
│ ├── libactivator
│ ├── libcolorpicker.h
│ ├── libpackageinfo
│ ├── libprefs
│ ├── libstatusbar
│ ├── logos
│ ├── objc
│ ├── openssl
│ ├── rocketbootstrap
│ ├── substrate.h
│ ├── substrate2.h
│ └── version.h
└── lib
├── Cephei.framework
├── CepheiPrefs.framework
├── Cycript.framework
├── CydiaSubstrate.framework
├── IOMobileFramebuffer.framework
├── LICENSE.md
├── Opener.framework
├── README.md
├── TechSupport.framework
├── libapplist.tbd
├── libflipswitch.tbd
├── libprefs.tbd
├── librocketbootstrap.tbd
└── libsubstrate.tbd -> CydiaSubstrate.framework/CydiaSubstrate.tbd
backup
See Also
/Users/devzkn/bin/knpost Theos Unified cross-platform Makefile system -t theos #原来""的参数,需要自己加上""