目录
一,环境搭建
二,文件架构类型
三,生成和使用工具
四,命令参数
五,授予权限
一,环境搭建
- 用
Xcode
新建一个iOS
项目
- 删除无用文件
- 修改
main
函数
- 将
Run
改为release
模式
- 配置签名证书(签名后才能运行在iPhone上)
二,文件架构类型
- 通用二进制
arm64
- 非
arm64
三,生成和使用工具
- 编写代码
#import <UIKit/UIKit.h>
#import <mach-o/fat.h>
#import <mach-o/loader.h>
int main(int argc, char * argv[]) {
NSString *appPath = @"/var/mobile/Containers/Bundle/Application/DEB96002-C0DD-405A-9178-8A14A09DC37F/ting.app/ting";
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:appPath];
// 获取header中magic存储的数据(文件架构类型)
NSUInteger length = sizeof(uint32_t);
NSData *magicData = [handle readDataOfLength:length];
uint32_t magicNumber;
[magicData getBytes:&magicNumber length:length];
if (magicNumber == FAT_MAGIC || magicNumber == FAT_CIGAM) {
printf("通用二进制文件: 0x%x\n", magicNumber);
} else if (magicNumber == MH_MAGIC_64 || magicNumber == MH_CIGAM_64) {
printf("arm64架构文件: 0x%x\n", magicNumber);
} else if (magicNumber == MH_MAGIC || magicNumber == MH_CIGAM) {
printf("非arm64架构文件: 0x%x\n", magicNumber);
} else {
printf("读取失败: 0x%x\n", magicNumber);
}
[handle closeFile];
return 0;
}
- 生成工具(可执行文件):连接iPhone,然后
build
一下
- 将工具添加到iPhone的
/usr/bin
目录下
- 使用工具
四,命令参数
- 代码
/**
argc: 参数个数(默认为1)
argv: 参数数组(第一个位置存储的是可执行文件的路径)
*/
int main(int argc, char * argv[]) {
if (argc == 1) { // 无参数
printf("-l 读取文件架构类型\n");
return 0;
}
if (strcmp(argv[1], "-l")) { // 参数不是'-l'
printf("-l 读取文件架构类型\n");
printf("可执行文件的路径: %s\n", argv[0]);
return 0;
}
...
}
- 使用
五,授予权限
- 说明
1>必须给工具授予权限,才能访问其他APP的可执行文件,否则可能会读取失败
2>将SpringBoard
的权限授予给它即可,因为SpringBoard
拥有访问其他APP的权限
- 从iPhone中导出
SpringBoard
的可执行文件
- 从
SpringBoard
的可执行文件中导出权限文件(plist
文件)
- 将权限文件添加到工具中(注意:箭头指向的位置没有空格)
网友评论