/ iOS

XcodeGhost 代码分析

最近几天 Xcode Ghost 事件炸开了锅。

事情源自知名 iOS 开发者唐巧的一条微博(2015-09-17 09:45,周四):

事件的开始

临近周末,自称是原作者的微博用户发表了公告,表示这只是一次没有恶意的试验,同时还将源代码放到了 GitHub 上。微博发送的时间是凌晨04:40,看来原作者这段时间过得并不轻松。

原作者公告

随后(早晨08:47),唐巧对这条微博进行了转发,并对照逆向工程的结果,给出了自己的结论:

结论

从“原作者”的公告来看,这段代码做了两件事:

  1. 搜集设备信息,并发到指定的服务器
  2. 广告功能(这是怎么实现的?)

膜拜大牛们第一时间做出的精准分析的同时,我们也可以尝试一下阅读 XcodeGhost 的源代码,看看原作者到底搜集了哪些设备信息、公告里说的广告功能是怎么回事。

设备信息

XcodeGhost 的代码实际上是两个 Category,UIDevice(AppleIncReservedDevice)UIWindow (didFinishLaunchingWithOptions)

其中,UIDevice(AppleIncReservedDevice) 较为简单,作用是获取一些设备信息,源代码一目了然:

+(NSData*)AppleIncReserved:(NSString*)tag{
    NSString *bundleID=[[NSBundle mainBundle] bundleIdentifier];
    NSString *app=[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
    NSString *timeStamp=[self Timestamp];
    NSString *osversion=[self OSVersion];
    NSString *devicetype=[self DeviceType];
    NSString *language=[self Language];
    NSString *name=[[UIDevice currentDevice] name];
    NSString *countryCode=[self CountryCode];
    NSString *idfv=[[[UIDevice currentDevice] identifierForVendor] UUIDString];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:timeStamp,@"timestamp",app,@"app",bundleID,@"bundle",name,@"name",
                       osversion,@"os",devicetype,@"type",tag,@"status",version,@"version",language,@"language",countryCode,@"country",idfv,@"idfv",nil];

    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict
                                                       options:NSJSONWritingPrettyPrinted 
                                                         error:&error];
    return jsonData;
    
}

信息上报

广告?

公告里说的是全部事实吗?

有微博网友指出 这段代码是可以刷 App 流量的,这是怎么回事呢?

经验教训

首先,开发流程中使用到的所有工具一定要从官方渠道下载,下载完后要做校验。天下没有免费的午餐,一些看似给大家提供方便的行为背后往往是不可告人的动机。

另外,微博上的 iOS 大牛面对这一事件时,展现出了极为强悍的问题分析能力。事件曝出一天之内,就有大神采用逆向工程,通过为数不多的几条线索,基本还原出了原作者的意图,作者的动机并不像大家一开始猜测的那样,只是单纯地做个试验。

XcodeGhost 实际用途猜测分析

参考