“O泡果奶”,“羞羞语音”?别慌,带你深入分析一波!!#转载# |
|
Vic丶自由羽
L6
• 2020-10-15 • 回复 6 • 只看楼主
• 举报
|
无数手机为何被老师没收,数百教室为何哄堂大笑。“O泡果奶”响彻校园的背后又隐藏着什么?今天就带你一起解密震惊各大高校的“O泡“事件。
那是一节昏昏欲睡的高数课,和平常一样,不愿听课的你拿起了手机,突然发现一位好基友分享了一款神秘软件,你顿时精神抖擞,心想:难道是那种“学习“软件。
于是你临危不乱,果断手机调成最小音量,安装,打开。正当你幻想着”苍老师“向你缓缓走来的时候。。突然,“O泡果奶”的魔性音乐从你的手机以最大音量播出,不论你点击返回,调节音量全都无用!
随后这款恶搞软件(一份礼物)迅速在网络蔓延,甚至上了各大网站排行热榜,网友们也戏称这次事件为1013事件。
这样的软件是怎么实现的,为什么会这么反常规,还有它究竟是不是病毒呢?今天就手把手的带大家详细的分析下这款软件,也希望能给大家带来一点帮助。
俗话说,工欲善其事,必先利其器。这里通过MT管理器进行反编译及分析。
首先反编译可以看到总体的文件结构,首先我们反编译查看AndroidManifest.xml文件,也就是配置文件。
可以看到软件申请了网络访问权限和存储权限,其中网络访问确实有点可疑,软件入口为 com.androlua.LuaApplication,基本可以确定为软件是通过andlua开发的。
然后我们进入它的Welcome类,就是简单的检查版本,然后进入MAIN,没有什么异常,转为java代码如下所示:
import android.app.Activity;import android.app.Application;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.graphics.drawable.Drawable;import android.os.AsyncTask;import android.os.Bundle;import android.view.Window;import com.androlua.LuaApplication;import com.androlua.LuaBitmap;import com.androlua.Main;import com.androlua.NineBitmapDrawable;import com.androlua.Welcome;import java.io.IOException;public class Welcomeextends Activity { private boolean a; private LuaApplication b; private String c; private String d; private long e; private long f; private boolean g; private String h; private String i; public boolean checkInfo() { //省略了 } public void onCreate(Bundle bundle) { super.onCreate(bundle); this.b = (LuaApplication)this.getApplication(); this.c = this.b.d; this.d = this.b.a; try { Window window =
接着我们再去它的main 类看下,发现加载了main.lua,主要的逻辑代码都被写在了lua文件中,而且还导入com.baidu.mobstat.StatService,百度查了下是百度统计,也没有异常。
import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import com.androlua.LuaActivity;import com.baidu.mobstat.StatService;public class Mainextends LuaActivity { private void a(String string, String string2) { this.runFunc("onVersionChanged", new Object[]{string, string2}); } public String getLuaDir() { return this.getLocalDir(); } public String getLuaPath() { this.initMain(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(this.getLocalDir()); stringBuilder.append("/main.lua"); return stringBuilder.toString(); } public void onCreate(Bundle bundle) { super.onCreate(bundle); if (bundle == null && this.getIntent().getData() != null) { this.runFunc("onNewIntent", new Object[]{this.getIntent()}); } if (this.getIntent().getBooleanExtra("isVersionChanged", false) && bundle == null) { this.a(this.getIntent().getStringExtra("newVersionName"), this.getIntent().getStringExtra("oldVersionName")); } StatService.s
接着就是找到main.lua文件进行分析,在assets资源目录下可以找到,除此之外我们也可以发现一个mp3文件,没错就是那个魔性声音的文件。
但是打开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_0, A1_1) if string.find(tostring(A1_1), "KEYCODE_BACK")
首先会实例化一个MediaPlayer,然后加载播放上图中的assets资源目录下的那个MP3文件。
然后下面才是最恶心的,在播放音乐后,软件又实例化一个Ticker,也就是定时器,设置时间为10,(应该是10微秒)。
每次循环10微秒后,软件就会把你的音量提高15,(音量静音为0,最大为100),然后再把你的状态栏和虚拟导航栏进行隐藏。所以无论你怎么调小音量也是无济于事,当然如果你的手速可以快过10微妙或许可以有点效果。
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)
接下来就是最后一步了,拦截你的返回键,也就是最下面的几行代码,软件通过“KEYCODE_BACK”判断是否按下返回键,当按下返回键后,操作会被软件劫持,再次让你的音量调高15,所以此时返回键就相当于音量调高键了,这操作。
暂时分析到这,没有发现有类似病毒等的异常行为,只是单纯的一套强制循环播放程序,而申请了网络权限估计应该是为了百度统计。
当然也不是专业的解析,所以也可能有的可疑行为没有发现,所以大家还是尽量注意下这类软件,也不要安装一些陌生软件。
来源:梦宇网络
作者:宇哥
声明:本文系转载文章,仅供学习交流使用,侵权请联系删除