Flappy Bird 恶意程序详细分析

author:爱小狐狸的小螃蟹

0x00 背景

Flappy Bird是在年初的时候非常火爆的一个小游戏,但是后来作者在2014年2月10日将其在Apple与Google商店下架,因为这游戏太容易让人上瘾了。

这时候就有很多恶意的Flappy Bird软件在商店上冒出来。

捕获到一个恶意版本的Flappy Bird可以在用户没有察觉的情况下发送短信。

App MD5:6c357ac34d061c97e6237ce9bd1fe003

所使用的工具:

DroidBox 一个动态分析工具,他为我们展示了一个程序运行时具体在做什么 Android Emulator 包含在Android SDK - 用来模拟运行APK文件
dex2jar - 反编译可执行文件 (.dex/.odex) 输出 .jar 文件
JD-GUI 显示 jar 文件java源代码的GUI工具

本次分析分为两个部分:

动态分析 静态分析

在动态分析截断,我们会让app在模拟环境中运行,看看他访问哪些文件和网站,这个是我们在静态分析中寻找相关代码的关键。

在静态分析截断,我们会逆向APK文件出源代码,这让我们能从源代码中找出恶意行为发生的原因。

0x01 动态分析

使用的最主要的工具就是DroidBox。

我在Linux Ubuntu上装了测试,没有发现什么问题。

安装DroidBox之前你需要安装Python包括pylab跟matplotlib库。

Python安装之后需要在http://developer.android.com/sdk/index.html下载安装Android SDK

在终端下输入下面两条命令来导入SDK的路径,这样我们在任何目录可以直接使用SDK相关命令。

下载最新的DroidBox:

解压缩进入目录:

现在我们可以建立一个Android虚拟主机创建一个Android Nexus4的设备运行Android 4.2.1版本。

进入DroidBox目录,运行Android模拟器

等待启动完之后,安装运行Flappy Bird:

你将在终端看到:

在虚拟窗口,你应该能看到Flappy Bird的运行,DroidBox也在记录了Flappy Bird的日志,按 Ctrl-C停止DroidBox然后查看日志。

DroidBox输出的日志是JSOn格式的,下面是一个其中一些日志:

隐藏了部分敏感信息,日志其中最明显的是发送了两条短信。

 把BMK BOKMA 2 12d2a43f2c03bbfbaa3a12cc65078143 3934发送到号码7740那里。

 根据下面的日志可以得出:

该app访问了210...195这个ip,发送了如下数据:

474554202f626f6f6b6d61726b2f67657453657276696365436f64653f70726963653d313530303020485454502f312e310d0a557365722d4167656e743a2044616c76696b2f312e362e3020284c696e75783b20553b20416e64726f696420342e312e31

数据是16进制编码的,转为ASCII:

所以这个app访问URL http://210...195/bookmark/getServiceCode?price=15000,那么返回值是什么呢?返回值为7740,也就是发送短信过去的号码。

尝试了一下修改不容的price的值,返回的结果不同:

根据波兰网站http://www.ilekosztujesms.pl/07540/显示,往该号码发送短信将花费5波兰罗提(差不多相当于10人民币)。

还有个奇怪的东西:

解码出来之后看到数据包为:

 这个我们稍后在静待分析阶段分析。

总结:我们现在知道了Flappy Bird连接到哪些网站,给付费号码发送短信,并且可以根据接口返回不同发向不同的付费号码。因此可以推测,这个恶意app通过此来赚钱。

但是210.*..196这个IP是做什么的呢?

 解码后显示访问地址为

上面数据表明,改程序正在下载另一个APK:flappy.apk。

或许我们的Flappy Bird只是一个下载者。

这样我们就知道app做了什么了:

  1. 发送短信扣费。
  2. 下载其他的Flappy Bird。

根据这些信息,我们来静态分析定位其中相关的源代码。

0x02 静态分析

静态分析需要两个工具,dex2jarJD-GUI

第一步就是把APK文件反编译为Java代码。

开始之前我们来看一下APK文件的解构:

META-INF: 文件夹 lib: 编译后的代码目录 res: APK所需要的资源文件夹 assets: 应用程序资源目录 AndroidManifest.xml: 一个传统的Android清单文件,用于描述该应用程序的名字、版本号、所需权限、注册的服务、链接的其他应用程序。 classes.dex: classes文件通过DEX编译后的文件格式,用于在Dalvik虚拟机上运行的主要代码部分。 resources.arsc: 预编译文件

所以我们最感兴趣的文件为classes.dex,我们希望把classes.dex文件转为jar文件,这可以通过dex2jar来完成:

先从http://code.google.com/p/dex2jar/downloads/list下载解压dex2jar。

一旦解压之后,就可以使用反编译APK文件了:

将会生成一个可以使用JD-GUI打开的jar文件。

从http://jd.benow.ca/#jd-gui-downloadenter link description here下载并解压JD-GUI。

运行打开JD-GUI载入Flappy Bird的jar文件,看到内容如下:

寻找左边的类文件列表,其中有一个在utilities包下的SendSMS类,看起来很像是一个发送短信的类。

SendSMS.class

下面这段代码负责发送短信:

这两段代码是隐藏短信发送与到达通知:

sendTextMessage方法是Android其中一个API(参阅android.telephony.gsm.SmsManager )。

根据这个,我们可以明确的知道程序发送短信以及隐藏相关操作的代码。

下一个问题就是,这个短信是什么时候发送的呢,是由用户触发的还是其他的呢?

来看一下MainActivity.class文件:

MainActivity.class: Global Variables Snippet

这两个字符串都为越南文,根据google翻译:

pop_up1:“通过安装和使用游戏,软件,你将被视为已接受了我们的使用下面的条款: 不要删除或禁用任何防护措施,或在游戏中所有权或著作权,软件。 不要创建重复或模仿界面功能,游戏数据,此软件。 不要使用游戏,软件作为一种工具来造成危害其他用户。 我们的产品是免费的,你需要付费才能继续试用期后使用。 收费使用的产品从15,000越盾30,000越盾。“ pop_up2:“你想要激活吗”

这些看起来像标准条款和条件,只是Flappy Bird是一个免费的应用程序,所以不应该花费。有趣的是在15000的花费与上面访问的URL应该是一样的:http://210...195/bookmark/getServiceCode?price=15000)。

后来在MainActivity.class文件的initListView中找到产生这些对话伴并随着一些发送短信动作代码。下面是从类文件中的代码摘录:

MainActivity.class: Code Extract

看起来一旦用户点击了“确定”,就将会发送短信,代码中一共包含两个

但是第二个是在return的后面,也就意味着不会执行,但是为什么动态分析当中看到了两次发送短信呢?

上面代码中的第三行调用了openPop_up方法,来看看其中的代码:

MainMethod.class: method openPop_up

因此,在创建弹出对话时,该方法触发了发送短信,这可以解释为什么我们的动态分析时,发出了两个短信。

现在还有个问题就是没有看到短信从哪里发送的,没有看到短信的号码,短信内容,以及访问的URL是在哪里定义的。

在app的源代码中找到了一些线索,如何解码一个配置文件内容,特别是一个叫getInfoFromFile方法。

MainActivity.class: getInfoFromFile()

可以看到其功能为读取文件base64解码处理。

仔细查看APK文件,在res目录下有一个drawable-hdpi的目录,在这个目录下有一个config文件,为base64编码的。

解码config文件:

到此基本都了解到了,进一步看了flappy.apk文件看看具体是做什么的,好像也只是个发送短信扣费的应用。

0x03 总结

事实证明,这个Flappy Bird是一个恶意应用,发送付费短信,并会下载其他恶意的应用。

此次检测用到的工具都是免费的工具可以下载到。

from:enter link description here

评论

HackBraid2015-01-26 20:31:54

学习了

friv agua y fuego2014-09-24 07:17:44

friv agua y fuego...

Pg 12014-09-23 18:40:29

Pg 1...

aO2014-09-10 21:07:27

赞楼主!
另外有个问题想请教下,我使用droidbox分析一个apk,crtl+c后看到的日志内容都没有换行。。就是所有数据都挤在一起,阅读难度极大。。
我并没有修改过droidbox的相关源码,是我的系统对json的支持问题吗?

求知者2014-07-29 16:12:45

LZ,同问android sdk版本和ubuntu系统版本
在ubuntu13.04 32位,android sdk API 19上
用./startemu.sh
启动模拟器显示一直处于启动中,无法显示功能界面

核攻击2014-04-05 10:35:51

Good Good Study, Day Day Up~

colbert2014-03-30 01:27:57

LZ,问下你的android sdk是什么版本?

雪岢奇2014-03-29 10:50:22

不错!分析很到位。

p0di2014-03-28 09:01:39

牛B

lxj6162014-03-26 10:52:43

nice

我是壮丁2014-03-25 20:42:16

虽然看不懂,但是感觉很厉害的样子

winsyk2014-03-25 18:22:42

赞!