这是暑假时看到的一篇病毒分析文章,以为里面有不少东西值得学习,恰好这几天有空就将它翻译了出来。有不对的地方请你们指正!android
Virus Bulletin是一个关于流氓软件与垃圾邮件防御、侦测以及移除的杂志。它常常给出一些关于最新病毒威胁的分析,发表探索反病毒领域的最新进展,采访反病毒的专家,而且评估现存的反病毒产品。web
Android/FakeKaKao木马将本身假装成一个KaKaoTalk安全插件,以诱导用户安装。一旦用户安装了这个插件,它就会监视收发的短信,发送垃圾短信,收集敏感信息并提交到远程服务器。更加严重的是,它组合了反调试和反模拟器跟踪的功能,这样就使得一些安全软件失效。并不一样于其余恶意软件,此木马的dex文件主要做为一个加载器存在。在本文中,经过剖析此恶意软件的行为,咱们将会看到一些调试和分析的方法。算法
加载器注册了3个组件:MainActivity, ActionReceiver以及MoriService。MainActivity用于启动一个精心设计的用户接口来误导用户,如图1所示:数据库
ActionReceiver用于接收android.intent.action.USER_PRESENT广播,当设备被唤醒的时候,系统会发送此广播。为了确保尽量早地接收到此广播,该恶意软件将此Receiver的intent filter权限值设为0x7fffffff。当一个广播到达的时候,MoriService组件就会在后台启动,此服务的调用方法在本地库libEglsv1.so中。为了顺利地运行此恶意软件,它请求了以下权限:promise
• READ_SMS安全 • READ_CONTACTS服务器 • READ_PHONE_STATE网络 • SEND_SMS架构 • WRITE_EXTERNAL_STORAGE并发 • WRITE_SMS • INTERNET • RECEIVE_SMS
|
启动了的service首先加载libEglsv1.so到恶意软件的进程地址空间。当一个库被初始化的时候,它就会尝试检测它是否正在被调试或运行在模拟器中。若是发现了二者之一,就会设置一个反调试和模拟器的标记,用于事后的操做:
• strace • ltrace • android_server • gdbserver • gdb • tcpdump • ro.kernel.qemu • /system/bin/qemu-props • /system/bin/qemud |
完成初始化工做以后,它会经过RegisterNatives注册6个native方法。而后调用SetJNIEvn方法来初始化JNI环境变量,此变量用于调用其余的native方法。可是,若是反调试标记为真,那么剩下的native方法就什么也不作,以防止安全人员的分析。图2展现了native方法的注册过程:
恶意软件收集被感染设备的用户私密信息,而后使用AES-192算法加密这些信息。在将这些加密信息发送到远程服务器以前,它先从加密的config.js文件中提取远程服务器的列表,这个文件包含在APK文件中,也使用AES-192加密。更加巧妙的是,它不只仅加密了这个配置文件,还使用调用uncompress API解压远程服务器列表。图3展现了解密后的服务器列表:
在上图中,咱们能够看到两个服务器信息条目:第一个用于网络测试;另外一个才是真正的C&C服务器信息。
收集到的信息将会被分割为两部分,咱们将之称为ID部分和MD部分。ID部分包含以下信息:
• id IMEI • token product brand and model • target build version • rd flags existence of /system/bin/su or /system/xbin/su • fo compromised phone number |
MD部分包含以下信息:
• md same as id • fo compromised phone number • ds contact name and number list |
恶意软件首先向远程服务器发送ID部分,用以注册受感染的设备。若是服务器返回数据‘0’,那么它就会发送MD部分。若是返回为‘1’,就不会发送。图4展现了一个样例:
而后,它从远程服务器中请求过滤规则。这些规则用于过滤接收到的短信和SMS数据库。恶意软件使用下述的关键字来筛选信息:
• plist matches phone number of message • klist matches message content • blist matches nickname of message • allmsgs spam message content • snumber specific phone number by malware • smsg message which is sent to snumber • allmsg another spam message content • checked flag, sends spam message or not • unlock flag, stores the contact list or not |
图5a和5b展现了一个过滤规则的事例:
恶意软件会记录此service每次启动的时间,当service下一次启动的时候,它就会从新发送收集到的信息,而且若是交互时间间隔大于30分钟的话,还会请求新的过滤规则。
为了监视短信,软件会首先经过registerReceiver注册一个新的广播receiver。而后它将receiver的intent fileter的权限值设为0x7fffffff,以确保其拥有最高的接收优先级,进而在第一时间处理短信。不管短信何时达到,软件都会使用上面提到的规则进行过滤——好比,匹配电话号码,搜寻消息内容等。软件还将调用abortBroadcast方法来防止它感兴趣的消息被发送给其余低优先级的receiver。
为了监视SMS数据库的变化,软件经过registerContentObserver注册了一个内容观察者。不管数据库何时发生了变化,它都会采用相似于检测短信的方式检测每一条消息。
不管匹配的消息来自于receiver仍是observer,软件都会加密它们并发送至远程服务器。而且只要receiver或observer被触发,软件都会从新发送收集到的信息,并请求新的过滤规则。
是否发送垃圾短信是由过滤规则中的关键字"checked", "allmsgs", "allmsg"的值决定的。若是"checkes"值不为0,而且"allmsgs"或"allmsg"不为空,软件就会向联系人列表中的每一位联系人发送垃圾短信。发送垃圾短信的间隔时间是40秒。若是受感染的设备号码为空,它会就发送关键字"smsg"的内容到有关键字"snumber"指定的号码中。另外,它也会从本地数据库中删除本身的发送短信记录,以销毁证据。
在这一部分,软件尝试将FOTAKILL.apk安装到/system/app/folder目录下。FOTAKILL是一个第三方应用程序,用来阻止FOTA(Firmwate Over-The-Air 更新服务)。其实FOTA的初衷是用来防止更新固件后清除用户已经得到的特权,如root权限。为了安装这个APK,软件经过getuid来检测用户的UID。若是UID是root,它就会读取/data/system/packeges.list文件,这个文件记录了设备上全部已经安装了的APK信息。若是此列表包含任意下述安全相关的字符串,它就会经过"pm disable"命令来关闭这些软件:
• com.avira.android • com.antivirus • com.kms • com.wsandroid.suite • com.qihoo360.mobilesafe • com.ijinshan.duba • com.tencent.qqpimsecure • com.anguanjia.safe • com.lbe.security • com.netqin.mobileguard • com.avast.android.mobilesecurity • com.estsoft.alyac • com.lookout • com.zoner.android.antivirus • com.symantec.mobilesecurity • com.drweb.pro • com.drweb • com.drweb.pro.market • com.symantec.mobilesecurity • com.symantec.monitor
|
众所周知,在Android平台使用native编码的一个坏处就是它会增长应用程序的复杂度。此软件就是使用了这个特性经过增长逆向分析的难度,从而达到保护本身的目的。调试native库的一个通用方法就是attach调试器到目标进程。可是,在这个案列中,咱们可能没法attach到进程,由于此应用程序已经运行过了咱们想要下断点的地址。因此,咱们须要知道如何在咱们想要调试地址下第一个断点。最简单有效的方式就是使用一条单指令进入无限循环状态。在咱们想下断点的地址处,可使用一个无条件跳转指令代替咱们原来的指令。鉴于native库是基于ARM架构的,因此更改后的指令格式以下:
Set |
Formate |
Byte code |
THUMB |
1110 0XXX XXXX XXXX |
FE E7 |
ARM |
1110 1010 XXXX....XXXX |
FE FF FF EA |
译者注:将本身想要下断点地方的指令换成上面的 byte code便可完成 {B 本身}指令,这就实现无条件无限跳转了。 |
不用重打包修改后的 APK,咱们只须要使用adb替换掉当前库便可。下面分析人员就能够逐步分析病毒了。