美文网首页iOS 开发 Objective-C
iOS 底层原理 day08 logos语法 命令行工具原理

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

作者: 望穿秋水小作坊 | 来源:发表于2020-08-01 13:41 被阅读0次

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

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

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

    • 可以通过 Xcode → Window → Devices and Simulators 查看日志
    1. HBDebugLog:跟 NSLog 类似

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

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

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

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

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

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

    • logify.pl xx.h > xx.xm

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

    1. 使用 Xcode 创建 iOS 项目
    • 为什么创建 iOS 项目呢?
    • 目的是为了让 Xcode 能够帮忙生成指定 iPhone 环境的可执行文件。
    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有足够的权限。

    相关文章

      网友评论

        本文标题:iOS 底层原理 day08 logos语法 命令行工具原理

        本文链接:https://www.haomeiwen.com/subject/effsrktx.html