XcodeGhost 代码分析
最近几天 Xcode Ghost 事件炸开了锅。
事情源自知名 iOS 开发者唐巧的一条微博(2015-09-17 09:45,周四):
临近周末,自称是原作者的微博用户发表了公告,表示这只是一次没有恶意的试验,同时还将源代码放到了 GitHub 上。微博发送的时间是凌晨04:40,看来原作者这段时间过得并不轻松。
随后(早晨08:47),唐巧对这条微博进行了转发,并对照逆向工程的结果,给出了自己的结论:
从“原作者”的公告来看,这段代码做了两件事:
- 搜集设备信息,并发到指定的服务器
- 广告功能(这是怎么实现的?)
膜拜大牛们第一时间做出的精准分析的同时,我们也可以尝试一下阅读 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 大牛面对这一事件时,展现出了极为强悍的问题分析能力。事件曝出一天之内,就有大神采用逆向工程,通过为数不多的几条线索,基本还原出了原作者的意图,作者的动机并不像大家一开始猜测的那样,只是单纯地做个试验。