安卓 sharedpreferences可以被其它activity读取_【安卓逆向】“一份礼物”之我要o泡逆向分析...
最近安卓手機(jī)有個(gè)惡搞程序“一份禮物”登上熱搜.
該app的效果是打開之后手機(jī)便會(huì)以最大音量循環(huán)播放“我要o泡”音樂,并且無法調(diào)小音量,無法退出程序,甚至無法關(guān)機(jī),讓中招者瞬間“社會(huì)性死亡”。
解決方法其實(shí)很簡(jiǎn)單,就是打開任務(wù)管理清掉該app后臺(tái),或者卸載該app。
某乎上也對(duì)這個(gè)app進(jìn)行了激烈的討論,我看到一些人有對(duì)這個(gè)app做了逆向,但都很片面,甚至有些不懂裝懂的光看權(quán)限和一些包名就斷定這個(gè)app做了什么什么壞事,下面還有很多不明真相的群眾跟風(fēng)對(duì)這個(gè)app進(jìn)行詆毀。我們就來詳細(xì)地對(duì)這個(gè)app進(jìn)行逆向分析。
我拿到的樣本應(yīng)該是最近流傳最廣的一個(gè)"我要o泡"版本。
首先我們把a(bǔ)pk扔到哈勃分析:
分析是失敗的,原因是這個(gè)apk的tagetSdk版本較高,哈勃內(nèi)置的安卓虛擬機(jī)版本只有4.0,我們反編譯改下tagetSdkversion重打包就可以了:
行為分析:
分析結(jié)果表明這個(gè)app是沒有風(fēng)險(xiǎn)的,也沒有任何越權(quán)的行為。
接下來我們進(jìn)行人工逆向分析:
載入jadx看下AndroidManifest.xml:
得知該樣本包名是com.lc.nb,版本名是“涼城fork by Keven"
這里可以看出該APP應(yīng)該是androlua編寫的,androlua我在很久之前有研究過,主要代碼都為lua語(yǔ)言,這里先不管,我們從程序入口點(diǎn)開始分析程序啟動(dòng)后都做了些什么。
啟動(dòng)Activity是com.androlua.Welcome
跟進(jìn)去看onCreate方法
這里代碼意思就是更改了界面的背景圖片,大概就是實(shí)現(xiàn)程序啟動(dòng)圖的效果,然后啟動(dòng)了Main.class這個(gè)Activity。
繼續(xù)跟進(jìn)Main.class:
這里啟動(dòng)了一個(gè)StatService,我看了下這個(gè)Service是百度統(tǒng)計(jì)的Service,大概是androlua開發(fā)者用來統(tǒng)計(jì)用戶的,由于這個(gè)app沒有申請(qǐng)聯(lián)網(wǎng)權(quán)限,所以沒什么作用了。
其他代碼都沒有什么實(shí)質(zhì)性的作用。
我們?cè)賮砜纯碼pp的Application類都做了些什么。Application類也是安卓APP運(yùn)行時(shí)實(shí)例化的主要類。
這個(gè)app的類Application是com.androlua.LuaApplication
我們首先看com.androlua.LuaApplication的onCreate方法:
這里jadx中反編譯失敗了,我們可以看smali分析,這段代碼主要作用就是在SD卡創(chuàng)建AndroLua目錄,也沒有其他作用。
我們?cè)僬艺移涞胤?#xff0c;這里可以看到Main繼承的LuaActivity類,所以LuaActivity類中初始化方法也會(huì)被執(zhí)行,我們跟進(jìn)去看看。
同樣定位到onCreate:
這里里執(zhí)行了很多文件載入和函數(shù)調(diào)用操作,
其中主要方法有LloadFile和runFunc,都是native里的方法:
他載入的init.lua和main.lua都是asstes里面的文件,我們打開看看:
全是亂碼,沒有文件頭,明顯是被加密了。
所以native方法里L(fēng)loadFile之后肯定有解密。我們用ida載入他的libluajava.so:
一直跟進(jìn)去:
到這里luaL_loadbufferx:
這里很明顯是個(gè)解密方法了,我們可以參考這一代碼,使用C語(yǔ)言編寫一個(gè)簡(jiǎn)單的解密工具:
#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文件夾下,執(zhí)行以下命令來解密init.lua和main.lua
decrypt init.lua
decrypt main.lua
解密后的文件為init.luac與main.luac,發(fā)現(xiàn)其仍然不是Lua代碼,而是編譯后的luac文件。
我們還需要對(duì)其進(jìn)行反編譯。
使用unluac可以對(duì)luac文件進(jìn)行反編譯,執(zhí)行以下指令
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,代碼的用途是聲明應(yīng)用基本信息
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執(zhí)行具體功能的代碼位于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具體的操作有以下內(nèi)容:
循環(huán)播放音頻文件mc.mp3
將系統(tǒng)音量調(diào)至最大
隱藏系統(tǒng)導(dǎo)航欄,并進(jìn)入沉浸模式(全屏)
每10tick,重復(fù)以上步驟使得無法主動(dòng)調(diào)低音量
劫持返回鍵
最后我們可以得出結(jié)論這個(gè)App純屬惡搞,并不會(huì)對(duì)我們的手機(jī)造成什么損害。
但這個(gè)App的流傳方式是社交網(wǎng)絡(luò),我也見過很多個(gè)版本,不排除有被植入惡意代碼的可能。
所以大家最好不要隨便安裝和運(yùn)行來歷不明的App,如果需要可以先用哈勃分析(habo.qq.com),然后在虛擬機(jī)(VMOS或者光速虛擬機(jī))中測(cè)試安全后再在自己手機(jī)中運(yùn)行。
總結(jié)
以上是生活随笔為你收集整理的安卓 sharedpreferences可以被其它activity读取_【安卓逆向】“一份礼物”之我要o泡逆向分析...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python信号处理教程_python
- 下一篇: python电影推荐算法_电影推荐系统p