首页 > 技术文章 > IOS 命令行工具开发

ZhangShengjie 2018-08-10 17:15 原文

例子  我们需要查看手机APP里面的某个应用的架构

新建一个Single View App 的ios项目 ToolCL

然后在 main函数中加入以下代码

//
//  main.m
//  ToolCL
//
//  Created by zsj on 2018/8/10.
//  Copyright © 2018年 ITpower. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <mach-o/loader.h>
#import <mach-o/fat.h>

/**
 @param argc 入参个数
 @param argv 入参数组  argv【0】为可执行文件路径
 */
int main(int argc, char * argv[]) {
    @autoreleasepool {
        if(argc==1 ){
            printf("-l 查看MachO信息\n");
            return 0;
        }
        
        if (strcmp(argv[1], "-l")!=0) {
            printf("-l 查看MachO信息\n");
            return 0;
        }
        //优酷视频APP 的mach-o文件的地址
        NSString *path = @"/private/var/mobile/Containers/Bundle/Application/72B419F5-0200-48D7-964C-20954B77E00B/Youkui4Phone.app/Youkui4Phone";
        NSFileHandle *handle=[NSFileHandle fileHandleForUpdatingAtPath:path];
        
        int length= sizeof(uint32_t);
        //读取前面4个字节(magic\number\魔数用来标识文件类型)
        NSData *magicData=[handle readDataOfLength:length];
        //魔数 文件类型
        uint32_t magicNumber;
        [magicData getBytes:&magicNumber length:length];
        if (magicNumber==FAT_CIGAM ||magicNumber==FAT_MAGIC) {
            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("读取失败");
        }
        printf("magicNumber=0X%x\n",magicNumber);
        [handle closeFile];
        return 0;
    }
}

然后选择Release 真机编译 不选择真机执行命令会报下面的错误

Bad CPU type in executable 

找到可执行文件 找到手机系统的SpringBoard 将它的权限导出 然后赋值个刚刚生成的可执行文件 

然后将可执行文件放入手机的user/var/bin 目录下 然后给可执行文件赋予执行权限 chmod +x /usr/bin/ToolCL

至此命令工具类就开发完毕了

可能出现的问题 如果出现 Killed: 9  每次将可执行文件删除再放入新的即可解决

 

推荐阅读