标签:
近期AVL移动安全团队首次发现一款使用Mono for Android开发的恶意APP,该应用除了使用C#语言开发,还加入了Lua环境,可以执行恶意Lua脚本。
Mono for Android简介
Mono for Android由Novell推出,是业界首个使用Microsoft Visual Studio 为Android平台开发Microsoft.Net应用程序的解决方案,该程序利用C#语法能进行开发基于Android和iOS的应用。
Mono for Android由Mono内核运行时间、原始 Android应用程序接口绑定,用于开发Android应用程序的Visual Studio插件和一个包含有构建、调试和部署应用程序所需的各种工具的软件开发工具包组成。
Mono框架作为Visual Studio的一个插件,基于一种用来执行针对该框架所编写的软件的虚拟机。这种虚拟机环境称为CLR(Common Language Runtime,公共语言运行时),主要负责安全、内存管理、程序运行以及异常处理。
在.NET Framework中编写的应用程序的源代码(比如Visual Basic或者C#)最初被编译为一种名为MSIL的中间语言。该初始编译由特定于语言的命令行编译器(Visual Studio或者其他生成工具)来执行。而当执行应用程序时通常会执行二次编译。二次编译将会获取中间语言并将其编译为可在操作系统中运行的可执行代码。二次编译被称为JIT(just-in-time,即时)编译,在其发布的时候会包含一个mono runtime。
Mono for android是一个运行时和开发堆栈,使.net开发人员可以充分利用他们现有的Visual Studio和C#知识为基于Android的设备开发应用程序。
运行时:
Mono for Android运行时是一个在Android堆栈的Linux内核上运行的应用程序。它负责解释Mono字节代码,并与Dlavik 运行时进行通信,以便调用本机Android API。
开发堆栈:
Mono for Android也是一个开发堆栈,它提供了创建和打包Android设备应用程序所需的工具。
Lua on Android
在Android手机上编写并运行Lua脚本的前提条件:
1 加载Lua脚本解析引擎。
2 以Native API方式调用引擎接口。
直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目AndroLua、LuaJava对这些JNI接口进行了很好的封装。
AndroLua是一个包含了LuaJava的Android平台的Lua解析器,它提供一系列映射到Lua C实现函数的Java接口。详情可以参考:《执行Lua脚本的Android恶意程序》
Mono for Android恶意软件分析
一、恶意apk文件分析
主要程序结构如下图所示:
以上四个类所对应的核心代码主要函数在native方法中:
AM简介
该程序主要定义以下功能:短信接收、监听开机状态。声明读写短信、接收短信等。
Mono插件会将编写主要代码编译成dll文件并封装到so文件里,之后通过ida进行动态dump,除了程序封装前的五个文件,依次是” Xamarin_Mobile.dll “、”Z_VFS_Android.dll “、“KopiLua_Android.dll”、” NLua_Android.dll”、” z-core.dll “,前两个文件为Mono运行库而后两个为Lua脚本依赖库,其中” z-core “文件则是核心程序代码。下面将对z-core.dll文件进行详细分析。
二、Dll文件分析
z-core.dll文件结构树如下图所示:
详细分析:
类OnBootHandler->OnReceive
概述:联网下载恶意lua脚本文件,并执行lua脚本文件,期间会和服务器通讯上传用户手机号、IMEI等设备信息,根据服务器指令发送短信、拦截短信、上传银行短信的讯息,上传收件箱、用户位置信息。
该程序会执行以下行为:
1 在SD卡创建zcore.txt文件,并写入”Set start date time“和当前时间信息,同时也记录在sharedPreferences中的”me“文件中。
2 动态注册短信接收器SMSReciver。
3 注册ScriptLoader用来载入LuaScript脚本。
4 执行Register函数时AES加密上传手机IMEI、根据返回的数据写到bootScript.lua文件中。
5 和远程服务器通信进行下载/上传Lua文件数据操作。
通过以上网址与服务器通讯并向”bootScript.lua“文件写入数据:
类SMSReciever->-> OnReceiver
根据指令该恶意软件有拦截短信、发送短信、上传银行短信的行为。
以下为“sms.lua”脚本文件的onSMS函数,程序首先会通过NetClient.Run方法上传接收到的短信,并且还会将指定的号码内容做上传操作,其中包含”900″、”Alfa-Bank”、 “TCS Bank”、”MTS-Bank”、”7494″、”000100″,这里多为俄罗斯银行,可能会给用户造成一定的财产损失。
类MainActivity->OnCreate
启动RunService服务后,隐藏图标,隔1秒钟后退出程序。
三、lua脚本分析
该恶意软件在data/data对应目录下有生成一些lua脚本文件:
lua脚本在本恶意软件中是寄宿在c#代码中被调用的,这里程序提供了个KopiLua的虚拟机,而lua文件都是运行在此之上。bootScript.lua文件中引导信息如下:
以上函数就是通过lua引擎(LoadScript函数)载入相关的lua文件,这里会依次调用taskprocessor.lua、sms.lua、echo.lua、teleinfo.lua、geo.lua、contacts.lua、scripteval.lua中的函数。
下面对lua文件进行依次分析:
1、taskprocessor.lua
下图代码是做了一个网络操作,并将数据写入log日志文件中。
2、sms.lua
执行onTask方法时,程序通过读取数据进行回调c#中的SendSMS函数进行发送短信操作,然后通过网络把发短信的信号发送给服务器,并把指定的号码添加到BlockedList中。
3、echo.lua
此文件定义一个辱骂性的消息。
4、teleinfo.lua
获取手机的设备信息,其中包含android版本、IMEI、手机号、运营商、国家等等。
5、geo.lua
上传用户的位置信息。
6、contacts.lua
此文件的功能主要是获取用户联系人信息并上传。
调用GetContacts函数上传用户联系人信息。
7、scripteval.lua
上传用户的UUID信息。
实际上除了以上列出的lua的对象外,程序还会根据远程通信下达指令下载额外的一个lua对象文件” chunk.lua“,但目前该url已失活。
另外,程序还会获取用户收件箱信息。
安全分析总结
该程序运行后会隐藏图标,后台和指定服务器进行通讯,下载恶意lua脚本文件并使用C#进行回调操作,期间会执行如下恶意行为:上传用户手机号、IMEI等设备信息,根据服务器指令发送短信、拦截短信、上传银行短信的讯息,上传收件箱、用户位置信息,给用户造成较为严重的隐私泄露和财产损失。
根据网址、银行信息等推测该程序出自俄国黑客之手,而该程序由于并不是把敏感的行为直接写到C#代码中,而是把重要数据运用lua脚本进行函数回调操作,从而实现用户隐私上传,因此当不联网的时候该程序则不会存在威胁
标签:
原文地址:http://my.oschina.net/1590538xiaokai/blog/470068