IOS非越狱环境下如何Hook机型

栏目: IOS · 发布时间: 5年前

内容简介:有的时候吧,总会有那么一种奇葩需求。比如你在使用某个app的时候,你不想让他知道你用的是啥型号的手机,你想把自己伪装成某个设备型号,比如把你的土豪金版本的管它为啥呢,咱就为了越狱环境下不要太简单,下个插件就可以解决了。或者你可以自己写一个,也很简单。无非就是用到

有的时候吧,总会有那么一种奇葩需求。比如你在使用某个app的时候,你不想让他知道你用的是啥型号的手机,你想把自己伪装成某个设备型号,比如把你的土豪金版本的 iPhone XS Max 伪装成 iPhone 3GS ,至于为啥要这么干,其实我也没明白...

管它为啥呢,咱就为了 装逼 不行么?那么如何实现呢?

越狱环境下

越狱环境下不要太简单,下个插件就可以解决了。或者你可以自己写一个,也很简单。无非就是用到 MSHookFunction Hook 一下 int uname(struct utsname *);int sysctlbyname(const char *, void *, size_t *, void *, size_t); 这两个c方法。这里还是要懂点 c语言 的。

具体我就不讲了,也不是本文的重点。

非越狱环境

我也是掉坑里了才知道 MSHookFunction 在非越狱环境下是无效的,至于为啥,大家去google一下吧,有大神解释了,反正我也看懂:laughing:,那么要怎么办呢?这就需要祭出某个 404公司 出品的 fishhook 了。

fishhook

直接贴上官方demo教程

#import <dlfcn.h>

#import <UIKit/UIKit.h>

#import "AppDelegate.h"
#import "fishhook.h"
 
static int (*orig_close)(int);
static int (*orig_open)(const char *, int, ...);
 
int my_close(int fd) {
  printf("Calling real close(%d)\n", fd);
  return orig_close(fd);
}
 
int my_open(const char *path, int oflag, ...) {
  va_list ap = {0};
  mode_t mode = 0;
 
  if ((oflag & O_CREAT) != 0) {
    // mode only applies to O_CREAT
    va_start(ap, oflag);
    mode = va_arg(ap, int);
    va_end(ap);
    printf("Calling real open('%s', %d, %d)\n", path, oflag, mode);
    return orig_open(path, oflag, mode);
  } else {
    printf("Calling real open('%s', %d)\n", path, oflag);
    return orig_open(path, oflag, mode);
  }
}
 
int main(int argc, char * argv[])
{
  @autoreleasepool {
    rebind_symbols((struct rebinding[2]){{"close", my_close, (void *)&orig_close}, {"open", my_open, (void *)&orig_open}}, 2);
 
    // Open our own binary and print out first 4 bytes (which is the same
    // for all Mach-O binaries on a given architecture)
    int fd = open(argv[0], O_RDONLY);
    uint32_t magic_number = 0;
    read(fd, &magic_number, 4);
    printf("Mach-O Magic Number: %x \n", magic_number);
    close(fd);
 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}

官方的demo里面示例了如何Hook openclose 方法,看起来好像也(huang)不(de)复(yi)杂(pi),努力回忆一下大学里学的C语言基础吧...

仔细研究一下发现,其实就那么回事,咱们按照它的模式依葫芦画瓢就好了,无非就是

//先申明一个原方法 orig_原方法名
static int (*orig_open)(const char *, int, ...);

//然后实现一个新方法 new_原方法名
int my_open(const char *path, int oflag, ...) {
    //新方法需要添加的逻辑
    ...
    ...
    //调用原方法,返回内容
    return orig_open(path, oflag, mode);
}

//最后在main里面调用
rebind_symbols((struct rebinding[1]){{"open", my_open, (void *)&orig_open}}, 1);

//反正大概意思就是用my_open取代了原来的open方法,就实现了咱们Hook open方法的目的了

看懂了之后,咱们就开工。

Hookuname

为啥要Hook uname 这个方法呢?咱们看一下ios上是如何获取设备型号的吧。下面是一份网络找来的代码:

- (NSString*)iphoneType {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
    // simulator 模拟器
    if ([platform isEqualToString:@"i386"]) return @"Simulator";
    if ([platform isEqualToString:@"x86_64"]) return @"Simulator";
    //常用机型不需要的可自行删除
    if([platform isEqualToString:@"iPhone1,1"]) return@"iPhone 2G";
    if([platform isEqualToString:@"iPhone1,2"]) return@"iPhone 3G";
    if([platform isEqualToString:@"iPhone2,1"]) return@"iPhone 3GS";
    if([platform isEqualToString:@"iPhone3,1"]) return@"iPhone 4";
    if([platform isEqualToString:@"iPhone3,2"]) return@"iPhone 4";
    if([platform isEqualToString:@"iPhone3,3"]) return@"iPhone 4";
    if([platform isEqualToString:@"iPhone4,1"]) return@"iPhone 4S";
    if([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
    if([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
    if([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c";
    if([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c";
    if([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s";
    if([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s";
    if([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
    if([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
    if([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
    if([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
    if([platform isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
    if([platform isEqualToString:@"iPhone9,1"]) return @"iPhone 7";
    if([platform isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus";
    if([platform isEqualToString:@"iPhone10,1"]) return @"iPhone 8";
    if([platform isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
    if([platform isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus";
    if([platform isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
    if([platform isEqualToString:@"iPhone10,3"]) return @"iPhone X";
    if([platform isEqualToString:@"iPhone10,6"]) return @"iPhone X";
    if([platform isEqualToString:@"iPhone10,8"]) return @"iPhone XR";
    if([platform isEqualToString:@"iPhone10,2"]) return @"iPhone XS";
    if([platform isEqualToString:@"iPhone10,4"]) return @"iPhone XS Max";
    if([platform isEqualToString:@"iPhone10,6"]) return @"iPhone XS Max";
    return platform;
}

可以看到方法的最上面是调用了 uname(&systemInfo); ,这就是为什么我们要Hook uname 方法了。

我们就按照上面 fishhook 的demo,依葫芦画瓢,写出我们的代码,直接贴出我们的Hook代码:

static int (*origianl_uname)(struct utsname *);
int my_uname(struct utsname *value);

int my_uname(struct utsname *value) {
    int ret = origianl_uname(value);
    NSString *newModelName = @"iPhone2,1" //说好的咱们要装逼为`3GS`的呢。
    const char *newModelNameChar = newModelName.UTF8String;
    strcpy(value->machine, newModelNameChar);
    return ret;
}
int main(int argc, char * argv[])
{
  @autoreleasepool {
      rebind_symbols((struct rebinding[1]){{"uname", my_uname, (void *)&origianl_uname}}, 1);
  }
}

另外,还有另外一种获取设备型号的方法,就是前面提过的 sysctlbyname ,这个就交给读者们自己去摸索吧,我就不给你们“ 留作业 ”了。

温馨提示

文章配图我是PS的啊,明眼人一眼就能看出来。不准拿我的代码去干啥不该干的事情啊,要是万一被我发现了!哼,我好像也拿你没辙...


以上所述就是小编给大家介绍的《IOS非越狱环境下如何Hook机型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

支持向量机

支持向量机

邓乃扬、田英杰 / 科学出版社 / 2009-8 / 48.00元

《支持向量机:理论、算法与拓展》以分类问题(模式识别、判别分析)和回归问题为背景,介绍支持向量机的基本理论、方法和应用。特别强调对所讨论的问题和处理方法的实质进行直观的解释和说明,因此具有很强的可读性。为使具有一般高等数学知识的读者能够顺利阅读,书中首先介绍了最优化的基础知识。《支持向量机:理论、算法与拓展》可作为理工类、管理学等专业的高年级本科生、研究生和教师的教材或教学参考书,也可供相关领域的......一起来看看 《支持向量机》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具