IDFA生成过程分析

-[PreferencesAppController *]
-[UIApplication sendAction:toTarget:fromSender:forEvent:]

Preference进程:

  1. 跟踪-[ASIdentifierManager advertisingIdentifier]
-[LSApplicationWorkspace deviceIdentifierForAdvertising]
_LSDDeviceIdentifierService* serv = [_LSDService synchronousXPCProxyWithErrorHandler:nil];
-[serv getIdentifierOfType:1 completionHandler:]
  1. 跟踪限制广告追踪按钮
var get_pid = new NativeFunction(Module.findExportByName(null, 'xpc_connection_get_pid'), 'int', ['pointer']);
var get_name = new NativeFunction(Module.findExportByName(null, 'xpc_connection_get_name'), 'pointer', ['pointer']);

log('xpc_connection_send_message(' +
    'connection=' + args[0] +
    ', message=' + ObjC.Object(args[1]).toString() +
    ', pid=' + get_pid(args[0]) + 
    ', name=' + get_name(args[0]).readUtf8String() +
')');

xpc_connection_send_message(connection=0x281672fd0, message=<OS_xpc_dictionary: <dictionary: 0x281c7b0c0> { count = 3, transaction: 0, voucher = 0x0, contents =
    "f" => <uint64: 0x9d5e13525c1289f7>: 1
    "root" => <data: 0x2830c5940>: { length = 64 bytes, contents = 0x62706c6973743136a03f000000000000007f111b636c6561... }
    "proxynum" => <uint64: 0x9d5e13525c1289f7>: 1
}>, pid=97, name=com.apple.lsd.advertisingidentifiers)
xpc_connection_send_notification(), notify=<OS_xpc_dictionary: <dictionary: 0x281c7c3c0> { count = 3, transaction: 0, voucher = 0x0, contents =
    "operation" => <int64: 0x9d4e13525c1289f2>: 4
    "value" => <int64: 0x9d4e13525c1289f6>: 0
    "key" => <string: 0x2827fc8d0> { length = 37, contents = "com.apple.Advertising.LimitAdTracking" }
}>, pid=0, name=com.apple.aggregated

xpc_connection_send_notification
xpc_connection_send_message_with_reply_sync

lsd进程:

  1. 跟踪-[ASIdentifierManager advertisingIdentifier]
-[_LSDDeviceIdentifierClient getIdentifierOfType:1 completionHandler:]
-[_LSDeviceIdentifierCache getIdentifierOfType:vendorName:bundleIdentifier:completionHandler:]
  1. 跟踪限制广告追踪按钮
-[_LSDDeviceIdentifierClient clearAllIdentifiersOfType:0x1]
__int64 __94___LSDeviceIdentifierCache_getIdentifierOfType_vendorName_bundleIdentifier_completionHandler___block_invoke(__int64 a1)
{
  v1 = a1;
  if ( !*(_QWORD *)(a1 + 32) || !*(_QWORD *)(a1 + 40) )
  {
    v9 = 0LL;
    goto LABEL_34;
  }
  v2 = objc_msgSend(*(void **)(a1 + 48), "identifiersOfTypeNotDispatched:", *(_QWORD *)(a1 + 64));
  v3 = (void *)objc_retainAutoreleasedReturnValue(v2);
  if ( *(_QWORD *)(a1 + 64) != 1LL )
    goto LABEL_10;
  v4 = +[LSApplicationRestrictionsManager sharedInstance](
         &OBJC_CLASS___LSApplicationRestrictionsManager,
         "sharedInstance");
  v5 = (void *)objc_retainAutoreleasedReturnValue(v4);
  if ( (unsigned __int8)objc_msgSend(v5, "isAdTrackingEnabled") )
  {
    v6 = (unsigned __int64)objc_msgSend(*(void **)(a1 + 48), "deviceUnlockedSinceBoot");
    objc_release(v5);
    if ( v6 )
    {
      if ( *(_QWORD *)(a1 + 64) == 1LL )
      {
        v7 = (void *)objc_retain(*(_QWORD *)(*(_QWORD *)(a1 + 48) + 16LL));
        if ( v7 )
        {
LABEL_31:
          v47 = objc_msgSend(*(void **)(v1 + 48), "applyPerUserEntropyNotDispatched:type:", v7, *(_QWORD *)(v1 + 64));
          v9 = objc_retainAutoreleasedReturnValue(v47);
          objc_release(v7);
          goto LABEL_33;
        }
        v8 = objc_msgSend(&OBJC_CLASS___NSUUID, "UUID");
        v7 = (void *)objc_retainAutoreleasedReturnValue(v8);
        objc_release(0LL);
        objc_storeStrong(*(_QWORD *)(a1 + 48) + 16LL);
        objc_msgSend(*(void **)(a1 + 48), "save");
        goto LABEL_30;
      }
LABEL_10:
      if ( !v3 )
        goto LABEL_32;
      v10 = objc_msgSend(v3, "objectForKeyedSubscript:", *(_QWORD *)(a1 + 32));
      v11 = (void *)objc_retainAutoreleasedReturnValue(v10);
      v12 = v11;
      v13 = objc_msgSend(v11, "objectForKeyedSubscript:", CFSTR("LSVendorIdentifier"));
      v14 = objc_retainAutoreleasedReturnValue(v13);
      objc_release(v12);
      v51 = v14;
      if ( v14 )
      {
        v15 = objc_msgSend(v3, "objectForKeyedSubscript:", *(_QWORD *)(a1 + 32));
        v16 = (void *)objc_retainAutoreleasedReturnValue(v15);
        v17 = v16;
        v18 = objc_msgSend(v16, "objectForKeyedSubscript:", CFSTR("LSApplications"));
        v19 = (void *)objc_retainAutoreleasedReturnValue(v18);
        objc_release(v17);
        if ( v19 && (unsigned __int8)objc_msgSend(v19, "containsObject:", *(_QWORD *)(a1 + 40)) )
        {
          v20 = (void *)objc_alloc(&OBJC_CLASS___NSUUID);
          v7 = objc_msgSend(v20, "initWithUUIDString:", v51);
          objc_release(v19);
          if ( v7 )
          {
LABEL_29:
            objc_release(v51);
LABEL_30:
            if ( v7 )
              goto LABEL_31;
LABEL_32:
            v9 = 0LL;
            goto LABEL_33;
          }
        }
        else
        {
          objc_release(v19);
        }
      }
      v22 = objc_msgSend(v3, "objectForKeyedSubscript:", *(_QWORD *)(a1 + 32));
      v23 = objc_retainAutoreleasedReturnValue(v22);
      objc_release(v23);
      if ( !v23 )
      {
        v24 = objc_msgSend(&OBJC_CLASS___NSMutableDictionary, "dictionary");
        v25 = objc_retainAutoreleasedReturnValue(v24);
        objc_msgSend(v3, "setObject:forKeyedSubscript:", v25, *(_QWORD *)(a1 + 32));
        objc_release(v25);
      }
      v26 = objc_msgSend(v3, "objectForKeyedSubscript:", *(_QWORD *)(a1 + 32));
      v27 = (void *)objc_retainAutoreleasedReturnValue(v26);
      v28 = v27;
      v29 = objc_msgSend(v27, "objectForKeyedSubscript:", CFSTR("LSVendorIdentifier"));
      v30 = objc_retainAutoreleasedReturnValue(v29);
      objc_release(v28);
      if ( v30 )
      {
        v31 = (void *)objc_alloc(&OBJC_CLASS___NSUUID);
        v7 = objc_msgSend(v31, "initWithUUIDString:", v30, v30);
      }
      else
      {
        v32 = objc_msgSend(&OBJC_CLASS___NSUUID, "UUID", 0LL);
        v33 = (void *)objc_retainAutoreleasedReturnValue(v32);
        v7 = v33;
        v34 = objc_msgSend(v33, "UUIDString");
        v35 = v3;
        v36 = objc_retainAutoreleasedReturnValue(v34);
        v37 = objc_msgSend(v35, "objectForKeyedSubscript:", *(_QWORD *)(v1 + 32));
        v38 = (void *)objc_retainAutoreleasedReturnValue(v37);
        objc_msgSend(v38, "setObject:forKeyedSubscript:", v36, CFSTR("LSVendorIdentifier"));
        objc_release(v38);
        objc_release(v36);
        v3 = v35;
      }
      v39 = objc_msgSend(v3, "objectForKeyedSubscript:", *(_QWORD *)(v1 + 32));
      v40 = (void *)objc_retainAutoreleasedReturnValue(v39);
      v41 = v40;
      v42 = objc_msgSend(v40, "objectForKeyedSubscript:", CFSTR("LSApplications"));
      v43 = (void *)objc_retainAutoreleasedReturnValue(v42);
      objc_release(v41);
      if ( !v43 )
      {
        v44 = objc_msgSend(&OBJC_CLASS___NSMutableArray, "array");
        v43 = (void *)objc_retainAutoreleasedReturnValue(v44);
        v45 = objc_msgSend(v3, "objectForKeyedSubscript:", *(_QWORD *)(v1 + 32));
        v46 = (void *)objc_retainAutoreleasedReturnValue(v45);
        objc_msgSend(v46, "setObject:forKeyedSubscript:", v43, CFSTR("LSApplications"));
        objc_release(v46);
      }
      if ( !(unsigned __int8)objc_msgSend(v43, "containsObject:", *(_QWORD *)(v1 + 40)) )
        objc_msgSend(v43, "addObject:", *(_QWORD *)(v1 + 40));
      objc_msgSend(*(void **)(v1 + 48), "save");
      objc_release(v43);
      objc_release(v50);
      goto LABEL_29;
    }
  }
  else
  {
    objc_release(v5);
  }
  v21 = objc_msgSend(&OBJC_CLASS___NSUUID, "_LS_nullUUID");
  v9 = objc_retainAutoreleasedReturnValue(v21);
LABEL_33:
  objc_release(v3);
LABEL_34:
  v48 = *(_QWORD *)(v1 + 56);
  if ( v48 )
    (*(void (__fastcall **)(__int64, __int64))(v48 + 16))(v48, v9);
  return objc_release(v9);
}

可见,IDFA是从UUID生成的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268