原文地址:http://ibcker.me/how-to-make-a-xcodeghost/

前奏

这两天已经被这货刷屏了,大家都在讨论影响却无人提及原理。我斗胆出来写下实现过程,让大伙有个深入了解,以后也能更好的防范

分析过程

开始写这篇博客时,已经有各公司的分析过好几遍了,例如乌云的文章,加上昨天源码也已经开源,功能上神秘的面纱基本揭开。但是问题在于作者只开源功能代码,并没提及注入原理,也就是这个代码是如何被注入到你写的APP里的~

寻找受感染的Xcode

由于鄙人比较倒霉,花了真真两天也没找到,这归功于百度网盘,把所有xcode的分享全取消分享了,加上作者也在清理犯罪证据,所以···

不过好在最后还是弄到了一份,可以继续了···

首先用有问题Xcode建立了个Demo。为了验证Demo是否编译后会被注入后门,我打算用比较简单点的办法,打个断点··· 阅读源码后发现发部分逻辑是在UIWindow的category里写的,例如这个方法明显UIWindow里没有:

-(void)Check{if ([self Debugger]) {return;}if ([UIApplication sharedApplication].applicationState!=UIApplicationStateActive)return;NSInteger timestamp = [[NSDate date] timeIntervalSince1970];...
}

所以下断点 

运行,果然断下来了 

所以表明这个Xcode确实有问题,并且category名也和源码里的完全吻合。所以可以入手这篇博客的主题了-如何制造一个XcodeGhost

开工

制造一个XcodeGhost的关键点其实是如何写一个Framework并在编译时链接进去。

所以问题主要只有两个:
1.写一个framework 
2.编译时如何链接

问题1有很多现成的教程,在此简单过一下就好

1.新建工程,选动态库,起个名字并保存

2.新建个UIWindow的category,写入hook代码

@implementation UIWindow (hook)
+ (void)load
{NSLog(@"hello,This is a XcodeGhost test");
}
@end

把framework改为静态类型 

2.编译后得到目标framework

注意选择对应要测试的目标设备(真机还是模拟器,测试阶段为了简单就不合并了)

问题一解决,把写好的framework放到Demo工程里测试,结果OK(记得先加上-ObjC 的flag) 

问题二比较棘手,由于不熟悉Xcode的内部结构,不太清楚如果定位修改那里会导致编译时自动链接自己写的gohst,不过好久好在有一个有问题的Xcode,尝试看下编译日记,发现了如下线索 

然后grep整个xcode目录去寻找CoreService,在

/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin/Contents/Resources/Ld.xcspec

中定位到

接下来就是替换尝试了,紧跟后面加上

-force_load $(PLATFORM_DEVELOPER_SDK_DIR)/Library/Frameworks/MyXcodeGhost.framework/MyXcodeGhost

并把MyXcodeGhost.framework拷贝到

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/Library/Frameworks/MyXcodeGhost.framework

重启Xcode后run,结果成功完成了注入~~ 

根据Ld.xcspec的这个ALL_OTHER_LDFLAGS配置项的字面意思应该不难理解,这项控制的应该和咱们平时用的Ohter Linker Flags差不多,只不过这个相当于默认配置,一般用户无感知,隐藏性更好,也就更加危险。

{   Name = ALL_OTHER_LDFLAGS;Type = StringList;DefaultValue = "$(LD_FLAGS) $(SECTORDER_FLAGS) $(OTHER_LDFLAGS) $(OTHER_LDFLAGS_$(variant)) $(OTHER_LDFLAGS_$(arch)) $(OTHER_LDFLAGS_$(variant)_$(arch)) $(PRODUCT_SPECIFIC_LDFLAGS) -force_load $(PLATFORM_DEVELOPER_SDK_DIR)/Library/Frameworks/MyXcodeGhost.framework/MyXcodeGhost";CommandLinePrefixFlag = "";
}

本文重在探索学习,请勿滥用~

感谢XcodeGhost给我们所有人上了一课!尼玛,城里人真会玩!

如何制造一个XcodeGhost ?相关推荐

  1. mysql里制造一个错误

    最近突然想到的,由于在触发器中执行失败事务性表会自动回滚. 所以就想制造一个错误,在群里问了问最后还真得到一个制造错误的方法,或者可以叫做自定义异常 SIGNAL SQLSTATE '45000' S ...

  2. Servlet如何凭空制造一个图像Image?

    底下这个程序,不需要有任何原始图片.凭空制造出一个图像,然后返回给客户端. 例:4.4.3 package com; import java.awt.Color; import java.awt.Gr ...

  3. 如何制造一个Android智能手机

    前言 在职业开发生涯中,很多同学经常关注与上层App开发,但是从手机的出生到手机的加电,再到App的运行确没有一个完整的认识,这里做一个系列的课程,进行下简要的说明 手机的基本组成 1)硬件部分: 屏 ...

  4. 利用js制造一个星座查询的效果

    简单利用if语句制作一个星座查询的效果 <!DOCTYPE html> <html lang="en"><head><meta chars ...

  5. 面试官:RabbitMQ本身不支持延迟队列,那你给我实现一个?

    以下文章来源方志朋的博客,回复"666"获面试宝典 RabbitMQ本身没有延迟队列的支持,但是基于其本身的一些特性,可以做到类似延迟队列的效果:基于死信交换器+TTL. 以下介绍 ...

  6. spring ioc原理(看完后大家可以自己写一个spring)

    在学习spring的时候,最常听到的词应该就是IOC和AOP了,下面,我从我的角度再次理解一下Spring里的IOC和AOP. IOC简介 IoC(InversionofControl):IoC就是应 ...

  7. Luy 1.0 :一个React-like轮子的诞生

    前言 在过去的一个多月中,为了能够更深入的学习,使用React,了解React内部算法,数据结构,我自己,从零开始写了一个玩具框架. 截止今日,终于可以发布第一个版本,因为就在昨天,我跑通了之前的一个 ...

  8. vue代码生成器可视化界面_手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)...

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...

  9. 任正非:华为欲出售5G技术制造竞争对手

    [TechWeb]9月13日,9月10日华为创始人兼CEO任正非在接受外媒采访时表示,华为有意向西方公司出售华为的5G技术,意在制造一个能与华为在5G方面产生竞争能力的对手. 买家仅需要一次性付款,就 ...

最新文章

  1. html javascript 字符串和数组互转 字符串拼接 数组拼接
  2. hana sql mysql oracle,从oracle dba的角度看HANA数据库
  3. Java:何时使用静态方法
  4. php5.4源码下载,WordPress v5.4.2官方正式版源码下载
  5. JAMA子刊:20来岁就要控制体重!分析超8万中国人数据发现,成年到中年体重每多增加10斤,老了之后死亡风险增加10%...
  6. synchronized 详解,偏向锁,轻量锁,重量锁
  7. python 逻辑回归 复杂抽样_如何用Python进行抽样?
  8. 二级python和office哪个难_对于操作office来说,python能与vbs相比吗?谁强谁弱呢?...
  9. 查看WiFi记录日志
  10. 国内云市场,腾讯云、阿里云、华为云,谁能更胜一筹呢?
  11. word中怎样在方框里打钩?
  12. JavaScript 之 学习网站推荐 强推【javascript.info】
  13. 海康监控视频无插件开发3.2版本运行demo
  14. fastadmin更改访问入口文件路径
  15. html5微信自动播放视频,科技常识:HTML5页面音视频在微信和app下自动播放的实现方法...
  16. SpringBoot---Eureka
  17. git 查看提交版本以及回滚到指定的版本
  18. 鸡啄米VS2010/MFC编程入门教程——学习1初次接触
  19. 机器学习-朴素贝叶斯算法
  20. Mysql导出数据的几种方式

热门文章

  1. MapGuide API
  2. sql server技术知识
  3. 华盛证券软件测试工程师工资,【恒生电子工资】软件测试工程师待遇-看准网...
  4. Java实现文件查重去重
  5. Nodejs内存溢出原因
  6. golang mongodb 聚合(Aggregate) github.com/qiniu/qmgo框架
  7. Python数据分析19——matplotlib可视化(一)之线形图
  8. 第1章 对象入门——Thinking-in-Java
  9. BIOS 工作流程解析
  10. html.dropdownlist必填,html.dropdownlist传值