我们都知道,iOS的类中,有两个方法load
和initialize
,load方法在程序启动的时候就会执行,而initialize方法在类第一次调用的时候执行,这里我们从源码的角度探究一下这两个方法的原理和实现
【iOS逆向】为Tweak插件添加设置项
THEOS
提供了iphone/preference_bundle_modern
工具,可以为插件添加设置项,该设置项会被打包成bundle并和tweak插件合并打包到deb
文件中
搭建自己的Cydia源
对于自己开发的插件,也需要使用软件源来维护和备份,可以向其他源一样,直接安装插件,这个记录一下搭建的过程
初识ARM64汇编
所有的程序,最终编译为机器(汇编)代码,运行起来,本质都是操作CPU的寄存器和内存,了解了寄存器和内存的操作,就能知道程序具体做了什么
【iOS逆向】Mach-O文件
Mach-O是Mach object的缩写,是Mac/iOS上用于存储程序、库的标准格式,这里简要解析Mach-O文件格式,结构和一些要点
【iOS逆向】LLDB动态调试
正向开发的时候通常是使用xcode对app进行调试,我们先来看看xcode的调试流程
- 手机启动app进程
- 手机启动
debugservice
服务,debugserver附加到App进程 - 调试器
lldb
通过连接debugservice
进行调试
lldb常用命令
lldb是llvm的一个子项目,用于调试llvm编译的程序,做iOS调试时,和lldb
打交道应该是最多的,本文对lldb常用的一些命令做一些整理,以便后续查阅
【iOS逆向】iOS可执行文件权限签名
iOS中使用entitlement
文件来描述可执行文件的权限,例如,当我们在Xcode中勾选了推送的权限,就会看到生成了一个entitlement
文件,里面包含下面内容
1 | <key>aps-environment</key> |
如果勾选了Sign With Apple
,会出现
1 | <key>com.apple.developer.applesignin</key> |
只有配置了对应的权限声明,并签名到可执行文件中,程序才有权限执行对应的功能,例如如果我们没有加上Sign With Apple
,则苹果登录相关的接口会失败
【iOS逆向】iOS动态库共享缓存
我们在开发的过程中,经常会用到系统自带的库,如 Foundation,UIKit 等,这些库存放在什么地方呢,我们可以用 MachOView
查看编译好的文件的Load Command
看到依赖的动态库的路径
【iOS逆向】使用Cycript调试应用
Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了OC、JavaScript语法的解释器,这意味着我们能够在一个命令中使用Oc或者JavaScript,甚至两者并用。它能够附加到正在运行的进程,能够查看和修改运行时的数据