判断app是什么架构

2020-02-17  本文已影响0人  i诺离

读取app可执行文件的前四个字节,来判断(这四个字节存放在可执行文件中的头部文件)
根据内核源码查看mach-o文件可发现,不同文件的前四个字节,有自己的宏定义代表

// FAT文件
FAT_CIGAM
FAT_MAGIC
//非64bit架构文件
MH_CIGAM
MH_MAGIC
//64bit架构文件
MH_CIGAM_64
MH_MAGIC_64

代码实现:

NSString *apppath = ".../xxx.app/xxx"
// 使用这个读取文件,可部分读取文件字节,减少内存的占用
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath: apppath];
int length = sizeof(uint32_t);
// 读取最前面的4个字节(magic number, 魔数,用来表示文件类型)
NSData *magicData = [handle readDataOfLength: length];
// 魔数, 用来标识文件类型
uint32_t magicNumber;
[magicData getBytes: &magicNumer length: length];

if (magicNumner == FAT_CIGAM || magicNumner == FAT_MAGIC) {
    printf(" FAT文件\n");
}else if (magicNumner == MH_CIGAM || magicNumner == MH_MAGIC) {
    printf(" 非64bit架构文件\n");
}else if (magicNumner == MH_CIGAM_64 || magicNumner == MH_MAGIC_64) {
    printf("64bit架构文件\n");
}else {
    printf("读取失败 - 0x%x", magicNumber);
}

[handle closeFile];
上一篇下一篇

猜你喜欢

热点阅读