ios逆向开发(四)、Tweak创建、编译、打包与安装

接下来我们要创建Tweak类型的工程,步骤与上述过程大同小异。也是需要使用nic.pl来创建,使用make编译,使用make package打包,使用make install安装。接下来就来看一下这一过程。

6、最终效果

开门见山,下方就是我们要实现的效果。接下来我们就要使用Theos来创建Tweak工程,下方就是我们Tweak工程要做的事情。就是当你的iPhone锁屏开启后,给你弹一个框,这个弹框就是我们Tweak工程Hook的代码,下方就是我们最终实现的效果。


最终效果

1、Tweak工程创建

下方就是我们Tweak工程的创建,与上述工程的创建类似,不过我们在此选择的是Tweak模板。如下所示,我们将该Tweak工程命名为LockScreenAlter,其他配置项使用默认值即可。然后进入到我们的LockScreenAlter工程目录中,主要有下方四个文件。(packages是打包后的生成的文件夹)

ztq:~ zhoutengquan$ cd Desktop/
ztq:Desktop zhoutengquan$ mkdir MyTweak
ztq:Desktop zhoutengquan$ cd MyTweak/
ztq:MyTweak zhoutengquan$ ls
ztq:MyTweak zhoutengquan$ export THEOS=/usr/local/opt/theos
ztq:MyTweak zhoutengquan$ $THEOS/bin/nic.pl
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/activator_event
  [2.] iphone/application_modern
  [3.] iphone/application_swift
  [4.] iphone/cydget
  [5.] iphone/flipswitch_switch
  [6.] iphone/framework
  [7.] iphone/ios7_notification_center_widget
  [8.] iphone/library
  [9.] iphone/notification_center_widget
  [10.] iphone/preference_bundle_modern
  [11.] iphone/tool
  [12.] iphone/tool_swift
  [13.] iphone/tweak
  [14.] iphone/xpc_service
Choose a Template (required): q 
Argument "q" isn't numeric in numeric lt (<) at /usr/local/opt/theos/bin/nic.pl line 229,  line 1.
Invalid value.
Choose a Template (required): 13
Project Name (required): LockScreenAlert
Package Name [com.yourcompany.lockscreenalert]: com.ztq.lockscreenalert
Author/Maintainer Name [周腾全]: Mr.Zhou
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: 
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: 
Instantiating iphone/tweak in lockscreenalert/...
Done.

ios逆向开发(四)、Tweak创建、编译、打包与安装_第1张图片
Tweak工程创建

2、Makefile文件

该文件类似于配置文件,用来指定工程用到的文件、框架、库、使用的SDK等等,将整个编译、打包、安装的过程进行自动化。下方就是我们Makefile中的内容,下方红框中是创建完工程后默认的配置,上面红框中是后来我们添加的配置。这些项指定了编译、安装时所需的参数,使其自动化。


ios逆向开发(四)、Tweak创建、编译、打包与安装_第2张图片
Makefile文件

3、Tweak.xm文件的编写

(1)写hook代码前的分析

分析这一步是至关重要的,因为这一步可以让你明白你的代码作用于何处。因为我们要在锁屏的页面进行弹框,所以我们要在相应的锁屏页面添加hook。下方就是我们的分析过程。经过浏览系统的头文件,我们从下方路径中找到了SBLockScreenManager.h这个文件,从文件名不难推测出该文件就是负责iPhone系统锁屏的文件,于是乎我们对其进行hook实现。

image

下方是上述头文件的内容,从内容我们更加坚信SBLockScreenManager类就是用来管理系统锁屏的,因为其中有个字段是用来表示是否已经锁屏的isUILocked。该头文件中还有一个类方法和一个对象方法。当然这个类方法明眼一看就是用来获取该类的单例的。而对象方法lockUIFromSource……应该是用来锁屏和解锁的。于是乎想要在锁屏中弹框就要在SBLockScreenManager类中的唯一的对象方法中进行操作了。

ios逆向开发(四)、Tweak创建、编译、打包与安装_第3张图片
image

(2)Tweak.xm中hook代码的实现

下方就是在Tweak.xm中的所有代码。是Logos语法,使用起来是比较简单的。%hook与%end成对出现,%hook后方跟的是我们要修改的类名,此处我们要对SBLockScreenManager进行修改,类似于OC中的继承操作。%orig,用来执行修改函数的原始函数,此处可以看做是OC语法中的super,类似于调用父类的方法。下方代码就用到这些Logos语法就足以在锁屏出进行弹框了。

%hook SBLockScreenManager
- (void)lockUIFromSource:(NSUInteger)source withOptions:(NSDictionary *)options {
    %orig;
        UIAlertView *alert  = [[UIAlertView alloc] initWithTitle:@"你好!"
                                                         message:@"越狱开发——hook锁屏"
                                                        delegate:nil
                                               cancelButtonTitle:@"嗯"
                                               otherButtonTitles:nil, nil];
        [alert show];
}
%end

常用Logos语法简介:

  • %hook 指定需要hook的类名,以%end结尾
  • %log 用来打印log的,将信息输入到syslog中,如%log((NSString *)@"ZeluLi")
  • %orig 执行被hook函数的原始代码,类似于super.method功能
  • %group 该指令用于%hook的分组,%group后边跟的是组名,%group也是必须以%end结尾,其中可以包含多个%hook
  • %init 该指令用来初始化某个%group,一个group只有被初始化后才可生效,init必须在hook中进行执行。
  • %ctor tweak的构造器,用来初始化,如果不显式定义,Theos就会自动生成一个%ctor,并在其中调用%init(_ungrouped). 如:%ctor { %init(_ungrouped)}
  • %new 该指令用来给现有的class添加一个新的函数。与Runtime中的class_addMethod相同。
  • %c 该指令用来获取一个类的名称,类似于objc_getClass。

上述就先涉及这么多,更详细的请参加:http://iphonedevwiki.net/index.php/Logos

4、. control文件

control文件中存储的内容记录了deb包管理系统所需的基本信息,会被打包进deb包里。下方就是control中内容,其中存储的就是一些包名、工程名、版本、作者等等,与打包安装后在Cydia中看到的信息相同。

ios逆向开发(四)、Tweak创建、编译、打包与安装_第4张图片
. control文件

5、进行编译、打包、安装

ztq:lockscreenalert zhoutengquan$ make
> Making all for tweak LockScreenAlert…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (armv7)…
==> Linking tweak LockScreenAlert (armv7)…
==> Generating debug symbols for LockScreenAlert…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (arm64)…
==> Linking tweak LockScreenAlert (arm64)…
==> Generating debug symbols for LockScreenAlert…
==> Merging tweak LockScreenAlert…
==> Signing LockScreenAlert…
ztq:lockscreenalert zhoutengquan$ make package
> Making all for tweak LockScreenAlert…
make[2]: Nothing to be done for `internal-library-compile'.
> Making stage for tweak LockScreenAlert…
dm.pl: building package `com.ztq.lockscreenalert:iphoneos-arm' in `./packages/com.ztq.lockscreenalert_0.0.1-3+debug_iphoneos-arm.deb'
ztq:lockscreenalert zhoutengquan$ make install
==> Installing…
[email protected]'s password: 
(Reading database ... 1771 files and directories currently installed.)
Preparing to unpack /tmp/_theos_install.deb ...
Unpacking com.ztq.lockscreenalert (0.0.1-3+debug) over (0.0.1-2+debug) ...
Setting up com.ztq.lockscreenalert (0.0.1-3+debug) ...
install.exec "killall -9 SpringBoard"
[email protected]'s password: 
ztq:lockscreenalert zhoutengquan$ 

参考:

iOS逆向工程之Theos

你可能感兴趣的:(ios逆向开发(四)、Tweak创建、编译、打包与安装)