Theos

Unified cross-platform Makefile system

Posted by kunnan on June 7, 2018

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的方法签名

      image

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

根据头文件快速生成跟踪代码

推荐使用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
#原来""的参数,需要自己加上""

转载请注明: > Theos