iOS 底层原理 day08 logos语法 命令行工具原理
2020-08-01 本文已影响0人
望穿秋水小作坊
一、部分常用 logos 语法 https://iphonedevwiki.net/index.php/Logos
-
%hook
%end
: hook 一个类的开始和结束 -
%log
:打印方法调用详情
- 可以通过 Xcode → Window → Devices and Simulators 查看日志
-
HBDebugLog
:跟 NSLog 类似 -
%new
: 添加一个新的方法 -
%c(className)
:生成一个 Class 对象,类似于 NSStringFromClass() -
%orig
:函数原来的代码逻辑 -
%ctor
: 在加载动态库时调用 -
%dtor
:在程序退出时调用 -
logify.pl
: 可以将一个头文件快速转换成已经包含打印信息的 xm 文件
logify.pl xx.h > xx.xm
二、借助 Xcode 创建一个能查看 iPhone 上指定 APP 架构的可执行文件
- 使用 Xcode 创建 iOS 项目
- 为什么创建 iOS 项目呢?
- 目的是为了让 Xcode 能够帮忙生成指定 iPhone 环境的可执行文件。
- 编写如下代码,读取指定 APP 的架构,同时理解 main 函数以及命令行传递的参数在哪里。
// 在 main.m 文件
#import <UIKit/UIKit.h>
#import <mach-o/fat.h>
#import <mach-o/loader.h>
// argc : 表示的参数个数(count)
// argv : 表示参数数组的值(value)
// argv[0] : 表示当前可执行文件的路径
int main(int argc, char * argv[]) {
// 假装我是个必须第二个参数 -l 才能执行的命令
NSLog(@"%s",argv[0]);
if (argc == 1) {
printf("-l 查看腾讯视频架构信息1 \n");
return 0;
}
if (strcmp(argv[1], "-l") != 0) {
printf("-l 查看腾讯视频架构信息2 \n");
return 0;
}
NSString *apppath = @"/var/containers/Bundle/Application/BA70ECD3-A80D-4437-B995-F9E3AD09E387/live4iphone.app/live4iphone";
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:apppath];
int length = sizeof(uint32_t);
// 读取最前面的 4 个字节(magic number,魔数,用来标识文件类型)
NSData *magicData = [handle readDataOfLength:length];
// 魔数,用来标识文件类型
uint32_t magicNumber;
[magicData getBytes:&magicNumber length:length];
if (magicNumber == FAT_MAGIC || magicNumber == FAT_CIGAM) {
printf("FAT 文件 \n");
} else if (magicNumber == MH_MAGIC || magicNumber == MH_CIGAM) {
printf("非 64bit 架构文件 \n");
} else if (magicNumber == MH_MAGIC_64 || magicNumber == MH_CIGAM_64) {
printf("64bit 架构文件 \n");
} else {
printf("识别失败 \n");
}
printf("magicNumber 是 0x%x \n", magicNumber);
return 0;
}
- Xcode 运行目标选择我们需要运行的手机,然后进行项目
build
- 从 Xcode 的 Products 中 SPToos.app 文件里面,找到 SPToos 可执行文件。
- 将 SPTools 复制到 iPhone 的 /usr/local/bin 目录下
-
chmod +x SPTools
给文件赋予可执行文件 -
SPTools -l
运行指令,输出如下:
iPhone:/usr/local/bin root# SPTools -l
2020-07-31 17:36:56.228 SPTools[20715:1214155] SPTools
FAT 文件
magicNumber 是 0xbebafeca
-
可能会遇到 SPTools 没有足够权限的签名,导致无法读取指定 APP 的内容,思路是找一个权限最高的系统 APP,借助
ldid
将它的权限赋予 SPTools。 -
找到 iPhone 中
SpringBoard
的可执行文件,放到 mac 和 SPTools 一起。 -
ldid -e SpringBoard > SpringBoard.entitlements
导出SpringBoard
的权限 -
ldid -SSpringBoard.entitlements SPTools
将SpringBoard
的权限 赋予SPTools
。这样就可以保证SPTools
有足够的权限。