iOS 开发 Objective-C

iOS 底层原理 day08 logos语法 命令行工具原理

2020-08-01  本文已影响0人  望穿秋水小作坊

一、部分常用 logos 语法 https://iphonedevwiki.net/index.php/Logos

  1. %hook %end : hook 一个类的开始和结束

  2. %log:打印方法调用详情

  1. HBDebugLog:跟 NSLog 类似

  2. %new : 添加一个新的方法

  3. %c(className) :生成一个 Class 对象,类似于 NSStringFromClass()

  4. %orig:函数原来的代码逻辑

  5. %ctor : 在加载动态库时调用

  6. %dtor :在程序退出时调用

  7. logify.pl : 可以将一个头文件快速转换成已经包含打印信息的 xm 文件

二、借助 Xcode 创建一个能查看 iPhone 上指定 APP 架构的可执行文件

  1. 使用 Xcode 创建 iOS 项目
  1. 编写如下代码,读取指定 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;
}
  1. Xcode 运行目标选择我们需要运行的手机,然后进行项目 build
  2. 从 Xcode 的 Products 中 SPToos.app 文件里面,找到 SPToos 可执行文件。
  3. 将 SPTools 复制到 iPhone 的 /usr/local/bin 目录下
  4. chmod +x SPTools 给文件赋予可执行文件
  5. SPTools -l 运行指令,输出如下:
iPhone:/usr/local/bin root# SPTools -l
2020-07-31 17:36:56.228 SPTools[20715:1214155] SPTools
FAT 文件 
magicNumber 是 0xbebafeca
  1. 可能会遇到 SPTools 没有足够权限的签名,导致无法读取指定 APP 的内容,思路是找一个权限最高的系统 APP,借助 ldid 将它的权限赋予 SPTools。

  2. 找到 iPhone 中 SpringBoard 的可执行文件,放到 mac 和 SPTools 一起。

  3. ldid -e SpringBoard > SpringBoard.entitlements 导出SpringBoard的权限

  4. ldid -SSpringBoard.entitlements SPToolsSpringBoard的权限 赋予 SPTools。这样就可以保证SPTools有足够的权限。

上一篇下一篇

猜你喜欢

热点阅读