[Android病毒分析]木马病毒之DroidKongFu病毒

木马病毒之DroidKongFu病毒

一、 样本概况

1.1 样本信息

文件名称:Cut The Rope Unlock.apk
文件类型:application/jar
样本包名:com.tebs3.cuttherope
样本大小:88.1KB
MD5:45F86E5027495DC33D168F4F4704779C
SHA1:6564C212E42C61C7C0E622ABB96D1FD0F7980014
病毒行为:有广告、诱导用户下载恶意广告软件,释放病毒文件。
文件名称:evil.bin
文件类型:elf
样本大小:26.4KB
MD5:562F6B581DF7B8610251293CEE3C7F7B
SHA1: 45361BB3335D6C2AA23496799592C5AC392950EA
病毒行为:篡改系统文件、连接远程服务器。

1.2 测试环境及工具

测试环境:夜神模拟器 V_3.8.3.1
工具:Jeb、AndroidKiller、IDAPro

1.3 分析目标

1、病毒运行的具体方式
2、查杀病毒

二、具体行为分析

用AndroidKiller打开样本文件,有两个活动,一个广播,两个服务。有两个敏感的权限,第一个是读取手机状态和身份,第二个访问目前所在的地理位置。
在这里插入图片描述
打开Jeb进行反编译,分析MainActivity的OnCreate方法。首先定义了三个监听器。

第一个,首先检查手机有没有被root,如果已经root判断com.zeptolab.ctr这个进程有没有在运行。如果没有,执行su命令,切换成超级管理员权限,然后执行rechteBearbeitenUndUeberschreiben这个函数,跟进去发现是个文件拷贝函数,将Assets文件下的CtrApp.xml文件,读取到data/data/com.zeptolab.ctr/shared_prefs/CtrApp.xml。
在这里插入图片描述
第二个是打开一个活动,因为病毒文件捆绑在一款名为“Cut The Rope Unlock”的游戏解锁软件中,所以第二个是打开相应的功能。

第三个是访问一个指定的网页:http:\\www.facebook.com/otothel.apps。
在这里插入图片描述
接下来新建了一个NewAd类的对象,根据名称可猜测是与广告有关。然后调用startAd方法。跟进去看发现,startAd新建了一个g类的对象并调用了start方法。跟踪g类可以看到他继承了Thread类,可知这是一个线程,主要分析它的run函数。
在这里插入图片描述
1、 NewAd.a(this.a)该函数其实就是访问了NewAd类的a成员,该成员变量是一个boolean类型,为false。所以if里面的语句会执行。
2、 再分析b方法,实质上调用了NewAd的a方法,点进去发现是访问了一个网址http://dd.phonego8.com:7500/ad/nadp.php?v=1.5&id=all,然后调用相应的方法。最后返回结果true。

在这里插入图片描述
3、然后调用Sleep方法睡眠5秒。
回到MainActivity接着分析。新建了一个f类的对象。在初始化过程中调用了2个方法。
第一个方法:主要是互殴dId和userId两个键值,dId的值来源于AndroidManifest.xml中的元数据ad.imadpush.com,它的值固定是100001,userId的值是通过GetDeviceId获取到的,它们共同写入到jmuser.xml中。
在这里插入图片描述
在这里插入图片描述
第二个方法:主要是启动了一个全局定时器,对象是ReceiverAlarm,周期是360000毫秒。在ReceiverAlarm的OnReceive方法中只开启了一个名为AlarmService的服务。
在这里插入图片描述
分析AlarmService服务,在onStart方法中,先获取了两个键值,获取系统服务通知,最后调用AsyncTask的execute来向用户发送通知,诱骗用户安装广告软件。
在这里插入图片描述
再次回到MainActivity中进行分析。最后是开启了一个名为UpdateCheck服务,该服务加载了名为“vadgo”的动态链接库,然后在OnCreate方法中获取MYAD_PID、手机序列号、包名,最后开启一个线程,调用动态库中的DataInit函数。
在这里插入图片描述
到此,JAVA层部分的已经分析完毕,主要是接收广告、诱导用户安装广告软件、调用DataInit函数进入native层。接下来就开始分析Native层的代码。

在apk文件中找到libvadgo.so文件,用IDAPro打开该文件。找到DataInit函数进行分析。

在一开始通过调用GetStringUTFChars函数获取到设备ID字符串,程序包名字符串,Android_ID字符串。
在这里插入图片描述
然后判断设备ID是否为空,为空就退出程序。不为空,进行字符串解密操作。算法非常简单就是对字节按位取反。最终解密获得字符串:/system/bin/su、/system/xbin/su、/system/bin/setprop、r0.bot.idr0.bot.ch
在这里插入图片描述
接下来函数通过路径、包名、和随机数构造出了恶意文件的文件名:/data/data/com.tebs3.cuttherope/.e随机数d。然后用文件名创建文件。
在这里插入图片描述
接下来获取要写入文件的数据的首地址,利用write函数将数据写入文件,并修改可执行属性755。
在这里插入图片描述
通过access函数判断system/bin/su是否可以访问,如果可以访问那么创建管道运行system/bin/su命令。

接着依次执行了四条命令:system/bin/setprop r0.bot.id android_id、system/bin/setprop r0.bot.ch NCuttherope、恶意文件、exit。最后Sleep300毫秒,然后调用unlink函数删除恶意文件。
在这里插入图片描述
总结一下这个函数所做的事情:进行字符串解密操作,创建恶意文件,执行命令运行恶意文件,等待恶意文件运行结束,删除恶意文件。

接下来分析恶意文件做了哪些事情。因为恶意文件在运行结束的时候会被删除,所以,我们应该在向恶意文件写入数据的那一部分dump出恶意文件。用IDAPro打开,进行分析。

找到main函数,发现一开始就是和之前一样的解密函数,再往下是检查自身是不是以Root权限运行的。如果不是就退出程序。
在这里插入图片描述
Android系统的属性值是通过system/bin/getprop和system/bin/setprop命令读取和设置的,因此病毒文件,通过getpropertyvalue函数获取属性值,然后拿返回值和数字0进行比较,如果相等则说明还没有被感染,那么进行感染。然后检查是否等于字符‘0’,相等退出程序,不相等继续和字符‘1’进行相比,相等再判断是否需要重新进行感染,否则进行感染。
在这里插入图片描述
当病毒进行重新感染的时候,先获取上一次存储的时间,使用当前的时间值减去上一次的时间值求出时间差。判断时间差是否大于3600秒,如果大于那么重新进行感染,否则退出程序。
在这里插入图片描述
接下来通过setprop_s_s_s函数将r0.bot.run的值设置为字符串‘0’,然后通过setprop_r0.bot.val对r0.bot.val的值进行写入,写入的值是病毒此次感染成功的时间。然后在通过setprop_s_s_s函数将r0.bot.run的值设置为字符串‘1’。
在这里插入图片描述
着重对infectsysfiles函数进行分析。这个函数有着病毒感染系统文件的详细过程。

首先可以看到函数中有着多次对是否可以访问/system/lib/libd1.so文件的判断。根据每次判断结果的不同对不同文件进行感染。

首先分析对system/bin/svc文件的感染。新建/data/.bootemp文件,先将/system/bin/ifconfig写入到文件中,然后再将system/bin/svc文件写入到data/.bootemp中。
在这里插入图片描述
在这里插入图片描述
然后调用rewritefile函数。重新挂载系统分区为可读写,记录最后一次文件更改时间,去掉系统属性,删除源文件,将/data/.bootemp文件内容写入要感染的文件。修改属性644,加上系统属性,将刚刚记录的时间进行设置,重新挂载系统分区为只读。
在这里插入图片描述
最后在感染system/bin/svc函数中删除文件/data/.bootemp文件。这样就完成了对system/bin/svc文件的感染。

Infectsysfiles函数会将/system/bin/vold与/system/bin/debuggerd文件通过copy2frameworkdir函数备份到/system/frameword目录下。还会感染如下文件:
在这里插入图片描述
对这些文件的感染其实就是将里面的内容替换为恶意文件的内容。

感染完成之后,通过获取硬件信息,连接远程服务器。通过最初的解密操作可以知道有三个服务器地址:
在这里插入图片描述
以及如下字符串:
AM_START:/system/bin/am start -a android.intent.action.VIEW -d
START_APP:/system/bin/am start -n
PM_INSTALL:/system/bin/pm install -r
PM_UNINSTALL:/system/bin/pm uninstall

总结,这个恶意文件所做的事情:解密字符串、设置感染标志、感染文件、连接远程服务器、执行控制命令。

三、查杀方法以及解决方法。

1、提取病毒特征,利用杀毒软件进行查杀。

APK文件的MD5:45F86E5027495DC33D168F4F4704779C
恶意文件的MD5:562F6B581DF7B8610251293CEE3C7F7B
网址:http://ad.pandanew.com:8511/search
   http://ad.phonego8.com:8511/search
   http://ad.my968.com:8511/search

2、解决方法

编写修复文件,对文件进行修复。
思路:1、将系统属性值恢复回去。利用/system/bin/setprop命令,将系统属性值恢复为‘0’;
2、恢复system/bin/svc文件中的内容。将文件开始处的“/system/bin/ifconfig”字符串删除。
3、恢复备份文件。在刚才的分析中病毒会备份/system/bin/vold与/system/bin/debuggerd文件通过copy2frameworkdir函数备份到/system/frameword目录下。所以应该从/system/frameword目录下的两个文件恢复回去。
4、恢复文件。病毒除了感染上述文件外还会感染其他文件,如下图所示,应当用原来的文件将以下文件进行替换。
在这里插入图片描述

四、参考文献

[1] 丰生强. Android软件安全与逆向分析. 人民邮电出版社. 2013.