逆向工程

iOS逆向:命令行工具

2020-08-05  本文已影响0人  码小菜

目录
一,环境搭建
二,文件架构类型
三,生成和使用工具
四,命令参数
五,授予权限

一,环境搭建

二,文件架构类型

三,生成和使用工具

#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;
}

四,命令参数

/**
 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的权限

本文章仅供学习交流,如有侵权,请联系删除,谢谢!
上一篇下一篇

猜你喜欢

热点阅读