ios 10 openUUID 替换者 SimulateIDFA

  转载自:https://github.com/youmi/SimulateIDFA/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3

  上一篇说到ios10 开启限制广告跟踪之后 获取的idfa就是一串000000,网上大神很快就给吾等屌丝搬砖者带来了福音SimulateIDFA

  (源文件下载地址:http://files.cnblogs.com/files/slc-lover/SimulateIDFA.zip)

  SimulateIDFA 是根据一堆设备信息(每个app获取的值都是一样的)生成的一个MD5值。用于标志不同设备。

  

     使用时

     #import "SimulateIDFA.h"

   NSString *simulateIDFA = [SimulateIDFA createSimulateIDFA];

 NSLog(@"获取到的simulateIDFA 是 %@",simulateIDFA);

  导入CoreTelephony.framework

  SimulateIDFA.h文件:

  

  SimulateIDFA.m文件:

#import <UIKit/UIKit.h>

#import "SimulateIDFA.h"

#import <sys/sysctl.h>

#import <CommonCrypto/CommonDigest.h>

#import <CoreTelephony/CTCarrier.h>

#import <CoreTelephony/CTTelephonyNetworkInfo.h>

@implementation SimulateIDFA

static NSString *systemBootTime(){

struct timeval boottime;

size_t len = sizeof(boottime);

int mib[2] = { CTL_KERN, KERN_BOOTTIME };

if( sysctl(mib, 2, &boottime, &len, NULL, 0) < 0 )

{

return @"";

}

time_t bsec = boottime.tv_sec / 10000;

NSString *bootTime = [NSString stringWithFormat:@"%ld",bsec];

return bootTime;

}

static NSString *countryCode() {

NSLocale *locale = [NSLocale currentLocale];

NSString *countryCode = [locale objectForKey:NSLocaleCountryCode];

return countryCode;

}

static NSString *language() {

NSString *language;

NSLocale *locale = [NSLocale currentLocale];

if ([[NSLocale preferredLanguages] count] > 0) {

language = [[NSLocale preferredLanguages]objectAtIndex:0];

} else {

language = [locale objectForKey:NSLocaleLanguageCode];

}

return language;

}

static NSString *systemVersion() {

return [[UIDevice currentDevice] systemVersion];

}

static NSString *deviceName(){

return [[UIDevice currentDevice] name];

}

static const char *SIDFAModel =       "hw.model";

static const char *SIDFAMachine =     "hw.machine";

static NSString *getSystemHardwareByName(const char *typeSpecifier) {

size_t size;

sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);

char *answer = malloc(size);

sysctlbyname(typeSpecifier, answer, &size, NULL, 0);

NSString *results = [NSString stringWithUTF8String:answer];

free(answer);

return results;

}

static NSUInteger GetSysInfo(uint typeSpecifier) {

size_t size = sizeof(int);

int results;

int mib[2] = {CTL_HW, typeSpecifier};

sysctl(mib, 2, &results, &size, NULL, 0);

return (NSUInteger) results;

}

static NSString *carrierInfo() {

NSMutableString* cInfo = [NSMutableString string];

CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];

CTCarrier *carrier = [networkInfo subscriberCellularProvider];

NSString *carrierName = [carrier carrierName];

if (carrierName != nil){

[cInfo appendString:carrierName];

}

NSString *mcc = [carrier mobileCountryCode];

if (mcc != nil){

[cInfo appendString:mcc];

}

NSString *mnc = [carrier mobileNetworkCode];

if (mnc != nil){

[cInfo appendString:mnc];

}

return cInfo;

}

static NSString *systemHardwareInfo(){

NSString *model = getSystemHardwareByName(SIDFAModel);

NSString *machine = getSystemHardwareByName(SIDFAMachine);

NSString *carInfo = carrierInfo();

NSUInteger totalMemory = GetSysInfo(HW_PHYSMEM);

return [NSString stringWithFormat:@"%@,%@,%@,%td",model,machine,carInfo,totalMemory];

}

static NSString *DQUSystemFileTime(){

NSFileManager *file = [NSFileManager defaultManager];

NSDictionary *dic= [file attributesOfItemAtPath:@"System/Library/CoreServices" error:nil];

return [NSString stringWithFormat:@"%@,%@",[dic objectForKey:NSFileCreationDate],[dic objectForKey:NSFileModificationDate]];

}

static NSString *DQUDisk(){

NSDictionary *fattributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];

NSString *diskSize = [[fattributes objectForKey:NSFileSystemSize] stringValue];

return diskSize;

}

void MD5_16(NSString *source, unsigned char *ret){

const char* str = [source UTF8String];

unsigned char result[CC_MD5_DIGEST_LENGTH];

CC_MD5(str, (CC_LONG)strlen(str), result);

for(int i = 4; i < CC_MD5_DIGEST_LENGTH - 4; i++) {

ret[i-4] = result[i];

}

}

static NSString *combineTwoFingerPrint(unsigned char *fp1,unsigned char *fp2){

NSMutableString *hash = [NSMutableString stringWithCapacity:36];

for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i+=1)

{

if (i==4 || i== 6 || i==8 || i==10)

[hash appendString:@"-"];

if (i < 8) {

[hash appendFormat:@"%02X",fp1[i]];

}else{

[hash appendFormat:@"%02X",fp2[i-8]];

}

}

return hash;

}

+ (NSString *)createSimulateIDFA{

NSString *sysBootTime = systemBootTime();

NSString *CC= countryCode();

NSString *languge = language();

NSString *deviceN = deviceName();

NSString *sysVer = systemVersion();

NSString *systemHardware = systemHardwareInfo();

NSString *systemFT = DQUSystemFileTime();

NSString *diskS = DQUDisk();

NSString *fingerPrintUnstablePart = [NSString stringWithFormat:@"%@,%@,%@,%@",sysBootTime,CC,languge,deviceN];

NSString *fingerPrintStablePart = [NSString stringWithFormat:@"%@,%@,%@,%@",sysVer,systemHardware,systemFT,diskS];

unsigned char fingerPrintUnstablePartMD5[CC_MD5_DIGEST_LENGTH/2];

MD5_16(fingerPrintUnstablePart,fingerPrintUnstablePartMD5);

unsigned char fingerPrintStablePartMD5[CC_MD5_DIGEST_LENGTH/2];

MD5_16(fingerPrintStablePart,fingerPrintStablePartMD5);

NSString *simulateIDFA = combineTwoFingerPrint(fingerPrintStablePartMD5,fingerPrintUnstablePartMD5);

return simulateIDFA;

}

@end

时间: 2024-10-05 14:33:41

ios 10 openUUID 替换者 SimulateIDFA的相关文章

再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸

作者:蒸米 ----------------- 0x00 序 Ian [email protected]发布了CVE-2017-7047Triple_Fetch的exp和writeup[1],[email protected]也发表了关于Triple_Fetch的分析[2],但由于这个漏洞和exp有非常多的亮点,所以还剩很多可以深入挖掘的细节.因此,我们简单分析一下漏洞形成的原因,并具体介绍一下漏洞利用的细节,以及如何利用这个漏洞做到iOS 10.3.2上的沙盒逃逸. 0x01 CVE-2017

iOS 10的23个隐藏新特性-b

上周iOS 10正式版推送后,24小时的更新率已经超过15%,实在惊人.虽然有着初期变砖.5S6卡顿.移动VoLTE无法使用.美版无信号等BUG,但不可忽视的是,iOS 10还是带来了很多从前没有的功能,比如骚扰拦截.预装应用删除等.现在CNET总结的iOS 10的23个隐藏功能,苹果用户不妨了解下—— 1.消息功能添加了内置的图像搜索: 现在,你可以在消息应用程序里直接搜索动画GIF图像,当你在消息功能中写入消息时,点击应用程序商店图标,然后滑动到图像页面,输入搜索项或从列表中选择一个类别即可

推送 iOS 10

1:APNs通知与应用内消息对比 极光文档上面是这么写的 后来更直接的说法是: 2:下面是介绍app不同状态下面接受到通知调用的方法: // iOS 10 Support,这个是程序在前台接受到通知是相应的方法 - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:

兼容iOS 10 资料整理笔记-b

原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大. iOS 9 以前的通知 1.在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼. 2.应用在运行时和非运行时捕获通知的路径还不一致. 3.

iOS 10 更新

1.解决工程中输出无关日志 Edit Scheme -> Run -> Arguments, 在Environment Variables里边添加   OS_ACTIVITY_MODE        disable 遗留问题: 还会出现下面这个问题5]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform

兼容iOS 10 资料整理笔记

1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大. iOS 9 以前的通知 1.在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼. 2.应用在运行时和非运行时捕获通知的路径还不一致. 3.应用在前台时,是无法直接显示远程通知,还需要进一步处理. 4.已经发出的通知是不能更新

iOS 10 / Swift 3.0 / XCode 8 总结

1,iOS10 新增的privacy settings iOS10添加了新的权限控制范围 如果你尝试访问这些隐私数据时得到如下错误: > This app has crashed because it attempted to access privacy-sensitive > data without a usage description. The app's Info.plist must contain > an NSCameraUsageDescription key wit

iOS 10 的一些资料整理

文/判若两人丶(简书作者)原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.iOS 10 隐私权限设置 iOS 10 开始对隐私权限更加严格,如果你不设置就会直接崩溃,现在很多遇到崩溃问题了,一般解决办法都是在info.plist文件添加对应的Key-Value就可以了. 以上Value值,圈出的红线部分的文字是展示给用户看的,需要自己添加规范的提示说明,不能为空.目前解决办法基本都一样,参考学习文章如下:兼容iOS 10:配置获取隐私数据权限声明 2.X

iOS 10 UserNotifications 框架解析

iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifications.framework 来集中管理和使用 iOS 系统中通知的功能.在此基础上,Apple 还增加了撤回单条通知,更新已展示通知,中途修改通知内容,在通知中展示图片视频,自定义通知 UI 等一系列新功能,非常强大. 对于开发者来说,相较于之前版本,iOS 10 提供了一套非常易用通知处理接口,是 SDK 的一次重大重构.而之前的绝大部分通知相关 API 都已经被标为弃用 (dep