iOS逆向工程之Theos

news2024/12/22 19:39:47

如果你对iOS逆向工程有所了解,那么你对Tweak并不陌生。那么由Tweak我们又会引出Theos, 那么什么是Theos呢,简单一句话,Theos是一个越狱开发工具包,Theos是越狱开发工具的首先,因为其最大的特点就是简单。大道至简,Theos的下载安装、编译发布都比较简单,越狱开发中另一个常用的工具是iOSOpenDev,因为本篇的主题是Theos,所以对iOSOpenDev不做过多赘述。本篇博客的主题是Thoes的安装及其使用。

一、Theos的配置与安装

Theos的配置与安装算是比较简单的,按照官方给的步骤来操作,问题不大。Theos的官方文档地址“官方Wiki”,其中给出了如何安装和配置Theos, 本部分内容也是按照官方的Wiki来提供的,当然进行该部分操作时,要保证你本地已经安装了Homebrew, 可以使用brew命令来安装一些依赖包。brew其实类似于Linux中的yum或者apt-get,就是一个包管理工具。如果你本地没有安装brew,那么请求自行Google,从而完成对brew的安装。

1.安装dpkg

sudo brew install dpkg

dpkg是Theos依赖的工具之一,dpkg是Debian Packager的缩写。我们可以使用dpkg来制作deb,Theos开发的插件都将会以deb的格式进行发布的。所以我在安装Theos之前要安装dpkg, 当然此处我们使用强大的brew来完成dpkg的安装。安装的具体过程如下所示:

  

2.安装ldid

sudo brew install ldid

在Theos开发插件中,iOS文件的签名是使用ldid工具来完成的,也就是说ldid取代了Xcode自带的Codesign。下方就是ldid的安装过程。

  

3.Theos安装

git clone --recursive https://github.com/theos/theos.git

因为我们的Theos一般是安装在/opt/目录下的,所以先cd到/opt目录下,然后从github上相关的地址clone下来即可,步骤如下(下方安装过程挺长,请耐心等待):

  

下载好Theos后,要修改一下文件的权限,如下命令

sudo chown (id−u):

(id -g) theos

至此,Theos安装完毕,就可以开启你的Theos之旅了。

二、使用Theos创建、编译、安装使用工具

上面我们搭建好Theos的环境后,接下来就开始使用我们的Theos来做些事情了。接下来我们将要使用Theos来创建一个使用工具,并进行编译,编译后安装到我们的越狱手机上。接下来来看一下这一系列的步骤。

1.配置$THEOS

export THEOS=theos文件所在路径

进入到我们要创建实用工具的目录中,使用export定义如下的环境变量,如下所示。下方命令比较简单,你可以这么理解,就是使用export定义了一个变量这个变量的名字是THEOS,该变量中存储的值是/opt/theos。后边这个路径就是上述我们安装theos的路径了,如果你要使用该路径的话,使用$THEOS代替即可。当然该变量只在当前终端中可用。如下所示。

  

2.新建工程

$THEOS/bin/nic.pl

接下来我们就要使用theos来创建我们的工程了,创建工程也是比较简单的,就是调用我们theos目录中bin下的nic.pl命令。具体执行如下所示。在执行nic.pl命令后,会让你选择新建工程的模板,目前theos中内置的是12套模板,当然你可以从网上下载其他的模板。当然我们此处创建的是application_modern类型的工程,所以我们就选2即可,当然,如果你想创建tweak,那么就选11即可,下方我们选择的是第二个模板。

在选择模板后,紧接着会让你做一系列的操作,这一些列的操作和Xcode新建iOS工程的步骤类似。

(1)输入你的工程的名字(Project Name,必选项),此处我们工程的名字是FirstTheosApplication。

(2)输入包名(Package Name),包名的命名规则一般是你们公司域名的倒写,然后后边加上你的工程名字,此处我就随便写了一个,就是下方的com.ludashi.firsttheosapplication。

(3)输入作者的名字(Author/Maintainer Name), 此处我们输入的是Mr.LuDashi

(4)然后如数类名的前缀(Class name prefix), 此处我们输入的是CE。

经过上述配置后,我们的工程就创建好了。

  

下方是我们创建后的工程文件目录,当然packages文件夹是我们编译打包后才生成的文件,其中的deb就是我们的安装文件。可以将该安装包安装到我们的越狱手机上。

  

3.编译打包前的准备工作

export SDKVERSION=9.3

export THEOS_DEVICE_IP=ios_device_ip

接着我们要做一些编译打包前的准备工作,SDKVERSION是编译工程时所使用的SDK,因为本机Xcode中是9.3的SDK,所以我们知道的SDKVERSION是9.3。指定完编译所需的SDK后,我们需要指定打包后的文件所安装设备的IP地址,使用THEOS_DEVICE_IP来指定。下方的IP地址是一个越狱手机的IP地址。

在指定这个设备IP之前,你要保证你的越狱设备安装了OpenSSH,并且可以在Mac的终端上进行ssh登录。

  

4.进行编译

make

做好编译前的准备工作后,紧接着就是编译我们刚才创建的工程了。首先进入到我们的firsttheosapplication目录中,执行make命令进行编译。如下所示。

  

5.进行打包

make package

编译完成后,我们要讲项目进行打包,这样我们的越狱设备才能进行安装。下方是调用make package命令进行项目的打包。打包后会生成后缀名为deb的安装包。

  

6.安装

make install

将该安装包,安装到相应的越狱设备。因为上面我们已经配置了越狱设备的IP地址,并且保证该台越狱设备可以通过ssh进行连接,所以我们直接调用make install命令就可以进行项目的安装。在安装过程中会让你输入ssh登录设备的密码,输入后会显示安装成功的操作,如下所示。

  

7.安装后的效果

下方就是我们项目安装后的效果。打开Cydia,选择已安装Tab, 会看到我们刚才安装的FirstTheosApplication(实用工具),我们可以点进去进行查看,其中的一些信息大部分是我们刚才配置的信息。到此我们一个完整的流程就走完了。

  

   

三、Tweak创建、编译、打包与安装

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

1.最终效果

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

  

2.Tweak工程创建

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

  

3.Makefile文件

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

  

4.Tweak.xm文件的编写

(1)写hook代码前的分析

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

  

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

  

(2)hook代码的实现

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

  

常用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。

上述就先涉及这么多,更详细的请参加:Logos - iPhone Development Wiki

5. control文件

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

  

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

编译打包安装的过程与上一部分类型,在此就只展示一下过程,不做过多赘述了。

(1)使用make命令进行编译

  

(2)打包:make package

  

(3)安装到手机: make install

  

7.从Cydia中进行查看

下方就是我们成功安装后在Cydia中查看的截图,安装成功后,当你锁屏时就会弹出一个Alter。

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python中多行注释与取消注释

在小白学习python编程的过程中,我们经常会发现很多同学们喜欢问的一个问题: 怎么多行注释呢? 怎么取消多行注释呢? 以上种种问题我相信来到这里都会得到相应答案 那我们接下来开始吧! 文章目录 单行注释多行注释取消多…

c初阶检测题

选择题 1.局部变量的作用域是:(D) A.main函数内部 B.整个程序 C.main函数之前 D.局部变量所在的局部范围 2.字符串的结束标志是:(A) 作业内容 A.是’0’ B.是EOF C. 是’\0’ D.是空格 3.下面那个不是…

精选六个大学生可以做的兼职副业,学习赚钱两不误

在当今的社会中,大学生们面临着学业压力和生活开销。为了减轻家庭的负担,同时也为了更好地拓宽自己的视野和实践能力,许多大学生开始寻找一种既可以学习又能赚钱的副业。这样的选择,不仅可以弥补金钱上的不足,还可以提…

【java计算机毕设】博客管理系统 javaweb springboot vue mysql

目录 1.项目功能截图​ 2.项目简介 3.源码下载地址 1.项目功能截图 2.项目简介 博客管理系统 idea mysql5.7/8 vue html jdk1.8 系统功能: 前台功能:文章信息,相册信息,留言板,个人中心,后台管理 后…

闭包(函数)

把内部函数通过return扔出去 必要条件

靶机 DC-2

DC_2 信息搜集 存活检测 详细扫描 添加 host 后台网页扫描 网页信息搜集 主页面 找到 flag1,提示使用 cewl 密码生成工具 wp 登陆界面 使用 wpscan 扫描用户 wpscan --url http://dc-2/ --enumerate u 扫描出用户 tom、jerry、admin 将三个用户名写入文件中…

一文解密网络背后的秘密

一文解密网络背后的秘密 网络的发展史从键入网址到网页进行显示期间法上了什么?首先我们需要了解一下URLDNS解析建立连接什么是三次握手,可不可以两次呢? 本地发送请求,服务器处理请求断开连接 实践一下 相信大家对网络都不陌生了…

《认知觉醒:开启自我改变的原动力》

目录 第一章 大脑 — 一切问题的起源 第二章 潜意识 — 生命留给我们的彩蛋 第三章 元认知 — 人类的终极能能力 第四章 专注力——情绪和智慧的交叉地带 第五章 学习力——学习不是一味地努力 第六章 行动力 — 没有行动世界只是个概念 第七章 情绪力 — 情绪是多角度看…

【JavaScript】深入讲解浏览器渲染原理

一. 浏览器是如何渲染页面的? 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。 渲染&…

Python数据分析实战-使用numpy.where方法基于条件替换某列的值(附源码和实现效果)

实现功能 在Pandas中,replace方法默认是基于精确匹配进行替换,而不是基于条件匹配。要实现基于条件的替换,可以使用numpy.where函数。将DataFrame中某一列的指定的两个值分别替换为0和1,其他值替换为2 实现代码 import pandas …

【tg】3:线程模型:4个主要线程

media :调用主线程worker therad 、network thread 是webrtc要求的module thread 也是webrtc的moudle需要的代码分布 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\StaticThreads.hgetThreads 触发创建线程 分别获取,看起来是分别只有1个的 Threads…

不愧是疑问解决神器(二)!你强任你强

不愧是疑问解决神器(二)!你强任你强👍👍👍 第3章 代码的坏味道 1.神秘命令(Mysterious Name)? 整洁代码中最重要的一环就是有一个好名字,使他们能够清晰地表明自己的功能和用法。但正因为如此,命名就成了…

17.Tensor Product Spaces

同样,本文仍采用非标准 的符号。 在之前的文章里,已经展示了: 使用张量积将向量和协向量组合在一起可以为我们提供线性映射,这个线性映射的系数实际上只是一个数组的条目。 还展示了:使用张量积组合两个协向量&#x…

Linux系统之部署WBO在线协作白板

Linux系统之部署WBO在线协作白板 一、WBO白板工具介绍1.1 WBO白板简介1.2 WBO白板特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、部署Node.js环境4.1 下载Node.js安装包4.2 解压Node.js安装包4.3 …

进制转换(二进制、八进制、十进制、十六进制)

目录 一:十进制转换为二进制、八进制、十六进制 (1)整数转换 (2)小数转换 1)十进制转二进制 2)十进制转八进制 3)十进制转十六进制 二:二进制、八进制、十六进制转…

数据库实验二:图书信息管理系统数据查询与数据更新

实验项目名称:图书信息管理系统数据查询与数据更新 实验目的与要求实验原理与内容1. 实验原理:2 . 实验内容:2. 数据查询 实验设备与软件环境实验过程与结果1. 数据更新图书信息表t_book新增馆藏可借图书c_book借书证表t_libraryC…

offsetof宏计算某变量相对于首地址的偏移量

宏:offsetof的使用 //offsetof (type,member) //type是结构体的类型名,member是结构体中的成员名。struct Student {char name[5]; // 姓名int age; // 年龄float score; // 成绩 };int main() {struct Student s;printf("%zd\n", off…

MyBatis Generator - 快速生成 实体类 和 映射文件

目录 一、MyBatis Generator 的使用 1.1、生成类和映射文件 1.1.1、在 pom.xml 中引入依赖 1.1.2、根据 configurationFile 标签中配置的路径 创建 generatorConfig.xml 文件 1.1.3、自动生成类 和 映射文件 1.1.4、在 Insert 标签中添加获取主键值的选项 1.1.5、扫描配置…

Linux完全卸载PyTorch重装(cuda11.1)

目录 1.命令行输入2.命令行接着输入3.可以看到卸载完后4.下载PyTorch(cuda对应11.1,可以通过test_gpu.py的测试) 原因:网上看的很多卸载的,并没有把所有跟随PyTorch的包卸载干净,虽然可能后期不会出现较大问…

【计算机操作系统慕课版】第二章课后习题笔记(创作周年纪念版)

一、简答题 (1)什么是前趋图?试画出下面四条语句的前趋图. S1:axy; S2:bz1; S3:ca-b; S4:wc1; 答:前趋图(Precedence Graph)是一个有向无循环图&#xff…