最近安卓手机有个恶搞程序“一份礼物”登上热搜.

该app的效果是打开之后手机便会以最大音量循环播放“我要o泡”音乐,并且无法调小音量,无法退出程序,甚至无法关机,让中招者瞬间“社会性死亡”。

解决方法其实很简单,就是打开任务管理清掉该app后台,或者卸载该app。

某乎上也对这个app进行了激烈的讨论,我看到一些人有对这个app做了逆向,但都很片面,甚至有些不懂装懂的光看权限和一些包名就断定这个app做了什么什么坏事,下面还有很多不明真相的群众跟风对这个app进行诋毁。我们就来详细地对这个app进行逆向分析。

我拿到的样本应该是最近流传最广的一个"我要o泡"版本。

首先我们把apk扔到哈勃分析:

分析是失败的,原因是这个apk的tagetSdk版本较高,哈勃内置的安卓虚拟机版本只有4.0,我们反编译改下tagetSdkversion重打包就可以了:

行为分析:

分析结果表明这个app是没有风险的,也没有任何越权的行为。

接下来我们进行人工逆向分析:

载入jadx看下AndroidManifest.xml:

得知该样本包名是com.lc.nb,版本名是“凉城fork by Keven"

这里可以看出该APP应该是androlua编写的,androlua我在很久之前有研究过,主要代码都为lua语言,这里先不管,我们从程序入口点开始分析程序启动后都做了些什么。

启动Activity是com.androlua.Welcome

跟进去看onCreate方法

这里代码意思就是更改了界面的背景图片,大概就是实现程序启动图的效果,然后启动了Main.class这个Activity。

继续跟进Main.class:

这里启动了一个StatService,我看了下这个Service是百度统计的Service,大概是androlua开发者用来统计用户的,由于这个app没有申请联网权限,所以没什么作用了。

其他代码都没有什么实质性的作用。

我们再来看看app的Application类都做了些什么。Application类也是安卓APP运行时实例化的主要类。

这个app的类Application是com.androlua.LuaApplication

我们首先看com.androlua.LuaApplication的onCreate方法:

这里jadx中反编译失败了,我们可以看smali分析,这段代码主要作用就是在SD卡创建AndroLua目录,也没有其他作用。

我们再找找其地方,这里可以看到Main继承的LuaActivity类,所以LuaActivity类中初始化方法也会被执行,我们跟进去看看。

同样定位到onCreate:

这里里执行了很多文件载入和函数调用操作,

其中主要方法有LloadFile和runFunc,都是native里的方法:

他载入的init.lua和main.lua都是asstes里面的文件,我们打开看看:

全是乱码,没有文件头,明显是被加密了。

所以native方法里LloadFile之后肯定有解密。我们用ida载入他的libluajava.so:

一直跟进去:

到这里luaL_loadbufferx:

这里很明显是个解密方法了,我们可以参考这一代码,使用C语言编写一个简单的解密工具:

#include #include #include unsigned char *decrypt(const unsigned char *buff, size_t size) {    unsigned char *buff1 = (unsigned char *) malloc(size);    buff1[0] = 27;    int t = 0;    for (int i = 1; i < size; i++) {        t += size;        buff1[i] = buff[i] ^ (t                              + ((unsigned int) (((unsigned long) (-2139062143LL * t) >> 32) + t) >> 7)                              + ((signed int) (((unsigned long) (-2139062143LL * t) >> 32) + t) < 0));    }    return buff1;}unsigned char buff[20480];int main(int argc, char *argv[]) {    char filename[20] = "main.lua";    if (argc == 2)        strcpy(filename,argv[1]);    printf("File name: %s \n", filename);    FILE *fp = fopen(filename, "rb");    size_t size = 0;    size = fread(buff, sizeof(unsigned char), 20480, fp);    printf("File size: %ld \n", size);    unsigned char *res = decrypt(buff, size);    strcat(filename, "c");    FILE *fp1 = fopen(filename, "wb");    fwrite(res, sizeof(unsigned char), size, fp1);    printf("Output: %s", filename);    return 0;}

编译这一代码为decrypt.exe,并拷贝到assets文件夹下,执行以下命令来解密init.lua和main.lua

decrypt init.lua

decrypt main.lua

解密后的文件为init.luac与main.luac,发现其仍然不是Lua代码,而是编译后的luac文件。

我们还需要对其进行反编译。

使用unluac可以对luac文件进行反编译,执行以下指令

java -jar unluac.jar init.luac > init-decomp.lua

java -jar unluac.jar main.luac > main-decomp.lua

通过反编译,我们可以得到真正的Lua代码文件init-decomp.lua和main-decomp.lua。

查看init-decomp.lua,代码的用途是声明应用基本信息

local L0_0appname = "一份礼物"appver = "凉城fork by Keven"appcode = "10"appsdk = "15"packagename = "com.lc.nb"debugmode = trueL0_0 = {  "",  "WRITE_EXTERNAL_STORAGE"}user_permission = L0_0

执行具体功能的代码位于main-decomp.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() .. "/mc.mp3")m.prepare()m.start()m.setLooping(true)ti = Ticker()ti.Period = 10function 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)endti.start()function onKeyDown(A0_2, A1_3)if string.find(tostring(A1_3), "KEYCODE_BACK") ~= nil thenactivity.getSystemService(Context.AUDIO_SERVICE).setStreamVolume(AudioManager.STREAM_MUSIC, 15, AudioManager.FLAG_SHOW_UI)endreturn trueend

具体的操作有以下内容:

  • 循环播放音频文件mc.mp3

  • 将系统音量调至最大

  • 隐藏系统导航栏,并进入沉浸模式(全屏)

  • 每10tick,重复以上步骤使得无法主动调低音量

  • 劫持返回键

最后我们可以得出结论这个App纯属恶搞,并不会对我们的手机造成什么损害。

但这个App的流传方式是社交网络,我也见过很多个版本,不排除有被植入恶意代码的可能。

所以大家最好不要随便安装和运行来历不明的App,如果需要可以先用哈勃分析(habo.qq.com),然后在虚拟机(VMOS或者光速虚拟机)中测试安全后再在自己手机中运行。

安卓 sharedpreferences可以被其它activity读取_【安卓逆向】“一份礼物”之我要o泡逆向分析...相关推荐

  1. 安卓 sharedpreferences可以被其它activity读取_Google|再见 SharedPreferences 拥抱 Jetpack DataStore...

    Google 新增加了一个新 Jetpack 的成员 DataStore,主要用来替换 SharedPreferences, DataStore 应该是开发者期待已久的库,DataStore 是基于 ...

  2. 安卓机更新系统会卡吗_安卓机可以用AirPods Pro吗?告诉你真实体验

       [PConline评测]安卓系统可以使用AirPods Pro吗?从AirPods Pro发布起,这问题一直备受关注,毕竟苹果官方宣称AirPods Pro兼容多种苹果设备,可没说兼容安卓机.我 ...

  3. 安卓开发弹窗activity风格_安卓两种底部弹出窗dialog实现方式

    [实例简介]安卓两种底部弹出窗dialog实现方式,一种是列表弹窗实现,2是灵活底部弹窗,传入布局以及控件id [实例截图] [核心代码] package com.kx.kxbottomdialog; ...

  4. 安卓系统刷机怎么刷机_安卓手机刷机教程

    当你觉得手机没有刚买来时那么好用了,当你觉得自带的应用太多了而觉得无用,当你想换个其他的系统来试试,就必须刷机!那么安卓手机刷机教程到底是怎样的呢?下面就给大家介绍一下刷机步骤吧. 安卓手机刷机教程 ...

  5. 安卓数据转移到iphone老是中断_安卓换iPhone数据怎么转移?这款神器一键搞定

    每天12:18准时给大家惊喜! 大家好!我是好奇仔,热衷于搜罗和分享各种好用.实用的软件神器和资源,有手机软件.办公软件.APP,还有网站资源-- 来自:PConline, 作者:我爱我家 换新手机了 ...

  6. 安卓的短信记录导入苹果_安卓换苹果手机后怎么转移便签数据?

    现如今,更换手机已经成为社会中的常态,不管是安卓手机用户新换了苹果手机,还是苹果手机用户改用了安卓手机,是每天都在上演的事情.不过更换过手机之后,我们还面临着一些难题需要解决,比如说安卓手机换苹果手机 ...

  7. 安卓点击图片跳转界面_安卓手机APP控制无线开关的电路方案设计(原理图+源码)...

    (局域网)一定注意是局域网控制,设置好以后硬件挂在路由器下,手机连着路由器即可控制,且对手机在路由器WIFI下上网什么的完全没影响. 物联网家居设计全套资料,工程源文件,可直接设计制作,也可自行修改, ...

  8. 安卓的短信记录导入苹果_安卓换苹果手机如何进行便签数据转移?

    现如今,智能手机的市场竞争激烈,所以手机更新换代的速度越来越快,这也使得用户更换手机的频率也在逐渐加快.不过虽然如此,国内的智能手机市场依然是被安卓和苹果占据着大半的份额,所以用户在更换手机时,通常还 ...

  9. iphone 传android,安卓和苹果手机怎么互传文件_安卓与苹果手机之间互传文件的方法教程_3DM手游...

    一直以来,很多的app都是分为安卓和IOS两个版本,在使用上,两个平台之间很多功能都不能跨平台使用.比如大家在玩游戏时充值的东西,在苹果充值之后,同一个账号转到安卓手机上玩,那些东西都是不能迁移进来的 ...

最新文章

  1. Swift 5 发布,ABI 终于稳定了
  2. C#操作符??和?:
  3. 关于mysql优化_MYSQL---关于MYSQL优化
  4. excel图片地址直接显示图_图片转表格基于百度AI
  5. html获取data-*值,html5 获取和设置data-*属性值的四种方法讲解
  6. 搭建小程序表情包教程
  7. 【点阵液晶编程连载五】液晶驱动代码的移植
  8. 排列组合在计算机科学的应用,数学在计算机科学的应用.doc
  9. python 决策树回归参数_python决策树之CART分类回归树详解
  10. 设计模式之观察者模式PHP实现
  11. Mysql修改字段名、修改字段类型
  12. 5G专网大上行带宽技术设计与实现
  13. Autosar诊断——故障诊断方案设计
  14. Win10 Edge浏览器假死解决方案
  15. EXCEL中怎样提取部分特定的文本?
  16. 第九章总结 java常用类
  17. 解决:L2TP服务器没有响应。请尝试重新连接。如果仍然有问题,请验证您的设置并与管理员联系。
  18. html5+css3响应式布局应该考虑到的屏幕的尺寸
  19. ODN 2006丨艾美捷CpG ODN系列说明书
  20. CSS设置字体为楷体

热门文章

  1. 今天才知道什么是柏拉图式的爱情
  2. 旅游O2O“三国杀”竞技:携程系「守」、飞猪「望」、美团「攻」
  3. mysql安装尝试创建新用户失败_Linux MySQL yum安装 创建新用户
  4. excel如何匹配同名数据_Excel如何查找名字重复的数据
  5. redmine备份_Redmine 数据迁移记录
  6. java serializable用法_JAVA序列化Serializable及Externalizable区别详解
  7. 卡巴斯基文件服务器,卡巴斯基更新服务器的解决方案
  8. BUUCTF(pwn)not_the_same_3dsctf_2016
  9. ctf(pwn) canary保护机制讲解 与 解密方法介绍
  10. Python技巧:不要在for与while循环后写else块