iOS逆向系列-tweak补充
tweak加载资源
开发自己的deb插件需要加载自己的资源,比如图片资源。iOS中常用的两种加载图片资源的方式:
+ (nullable UIImage *)imageNamed:(NSString *)name; // load from main bundle
- (nullable instancetype)initWithContentsOfFile:(NSString *)path;
+imageNamed:方式从程序的main bundle加载图片,由于我们自己单独开发的插架,资源是需要单独管理的。我们需要使用第二种方式,给定图片的路径去加载图片。
那么图片的存放的路径应该存放在手机的那个目录下呢?
当前手机安装了reveal插件,可以看出reveal的插架资源存放在/Library/PreferenceLoader/Preferences/目录下,我们也可以将我们开发的插件需要加载的资源文件存放在此目录
现在知道了图片资源的存放路径,是否有办法在将开发的插件安装打包安装到手机时图片资源也一起打包到手机中呢?这个答案是肯定的。
在tweak项目中,可以创建名称为layout文件夹,将所有图片等资源文件存放在这里。在打包安装插架到手机中时,layout中的资源会打包到手机的根目录下。也就是说layout就对应手机的根目录/
上面说到我们的资源想存放在手机的/Library/PreferenceLoader/Preferences/目录下,可以直接在layout目录新建这种文件结构
我们可在工程中定义文件资源路径的宏 加载图片时直接写文件名就可以
// 定义图片资源路径
#define CHFile(path) @"/Library/PreferenceLoader/Preferences/" #path
// 加载skull的图片
cell.imageView.image = [UIImage imageWithContentsOfFile:CHFile(skull.png)];
tweak打包脚本
tweak打包命名
make clean
make
make pakcage
make install
对于每次都需要执行上面的脚本,因此我们可以编译写shell脚本文件 ~/tweak.sh
make clean && make package && make install
tip:make package就会先执行make命令,因此在shell脚本文件可以省略
上面打包的出来的安装包默认是debug版本,在手机 Cydia中查看安装的版本是debug
在打包执行 make package debug=0就可以了
tweak原理
tweak工程目录结构
默认nic.pl生成的tweak工程目录结构如下(layout我自己添加存放资源的目录):
control是tweak工程的描述信息,比如包名、作者、架构、版本。其中Package必须是小写字母 否则打包报错。
Makefile对工程的编译信息描述。执行make命令时编译tweak_wechat_FILES变量指定的源文件,多个文件使用空格隔开
Tweak.x是编译hookd代码的,Logos文件扩展名根据编译的开发语言而不相同
xxx.plist文件就描述了逆向程序的Bundle id
tweak安装过程
执行make命令主要对Makefile中描述的所有参加编译的源文件进行编译,生成xxx.dylib动态库
执行make package命令是将工程xxx.plst文件和make阶段生成的xxx.dylib动态库打包成一个xxx.deb文件(deb就是越狱的插件)
make install 连接远程主机(THEOS_DEVICE_IP THEOS_DEVICE_PORT) 将deb插件安装到远程手机的/Library/MobileSubstrate/DynamicLibraries目录下
tweak运行过程
开发的deb插件是由Cydia Substrate管理,这个插件是越狱手机安装Cydia就安装的
Cydia Substrate程序监听/Library/PreferenceLoader/Preferences/下xxx.plist的Bundle Id的应用的运行,一旦监听到被包含Bundle Id程序运行,Cydia Substrate会加载插件,将插架中的hook方法动态注入到内存中的程序中,本质修改源程序的汇编指令。
iOS逆向系列-tweak补充的更多相关文章
- iOS逆向系列-脱壳
概述 通过iOS逆向系列-逆向App中使用class-dump工具导出App的Mach-O文件所有头文件.Hopper工具分析App的Mach-O文件代码大概实现.但是这些前体是App的Mach-O没 ...
- iOS逆向系列-逆向APP思路
界面分析 通过Cycript.Reveal. 对于Reveal安装配置可参考配置iOS逆向系列-Reveal 通过Reveal找到内存中的UI对象 静态分析 开发者编写的所有代码最终编译链接到Mach ...
- iOS逆向系列-theos
概述 theos是GitHub开源的一个项目,通过nic.pl创建tweak项目.通过编写我们注入代码,然后执行编译.打包.安装等操作将代码注入iPhone安装的制定程序. theos环境配置 安装签 ...
- iOS逆向系列-Mach-O文件
概述 Mach-O是Mach object的缩写,是Mac\iOS上用于存储程序.库的标准格式. 常见的Mach-O文件 属于Mach-O格式的文件类型有. 可以在xnu源码中,查看到Mach-O格式 ...
- iOS逆向系列-Reveal
概述 Reveal是一款调试iOS程序UI界面的神器. 官网地址:https://revealall.com 下载:https://revealapp.com/download/ 建议下载Reveal ...
- iOS逆向系列-Cycript
概述 Cycript 是Objective-C++.ES(JavaScript).Java等语法的混合物. 可以用来探索.修改.调试正在运行的Mac\iOS App. 通过Cydia安装Cycript ...
- iOS逆向系列-动态调试
Xcode调试App原理 Mac安装了Xcode Xcode的安装包中包含了debugserver 可执行类型的Mach-O文件,iPhone第一次连接Xcode调试会将Xcode中的debugser ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发系列--C语言之基础知识
概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...
随机推荐
- 2、什么是session?
session 什么是Session?Session什么时候产生? Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这 ...
- 剑指offer第二版面试题11:旋转数组的最小数字(JAVA版)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...
- Quartz CronTrigger 整配置说明
Quartz cron 表达式的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级. Quartz用cron 表达式存放执行计划,引用了cron表达式的CronTrigger在计 ...
- mongodb java操作常用写法
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象.字段值可以包含其他文档,数组及文档数组.下面介绍的是用java操作 ...
- Deb版本Linux配置Selenium+Chrome+Java实现自动化测试
1.安装chrome sudo apt-get install libxss1 libappindicator1 libindicator7 wget https://dl.google.com/li ...
- 关于ajax请求status 200 却进入error 回调函数或显示跨域问题的解决方案及原因
这虽然不是前端的问题吧,但如果遇到那种不靠谱的后台 还是可以拿来打脸的 转:https://segmentfault.com/a/1190000012469713
- leetcood学习笔记-437-路径总和③**
题目描述: 方法一:栈 class Solution(object): def pathSum(self, root, sum): """ :type root: Tre ...
- 字符串匹配dp+bitset,滚动数组优化——hdu5745(经典)
bitset的经典优化,即把可行性01数组的转移代价降低 bitset的适用情况,当内层状态只和外层状态的上一个状态相关,并且内层状态的相关距离是一个固定的数,可用bitset,换言之,能用滚动数组是 ...
- 牛客网 NOIP赛前集训营-普及组(第四场)C--部分和 (高维前缀和)
传送门 解题思路 高维前缀和模板题.首先,求前缀和有两种方式,比如说对于求二维前缀和来说. 第一种 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++ ...
- Go语言中new()和 make()的区别详解
概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似.不过解释两者之间的不同也非常容易. new 的主要特性 首先 new 是内建函数,你可以从 http://gol ...