日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓 sharedpreferences可以被其它activity读取_【安卓逆向】“一份礼物”之我要o泡逆向分析... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近安卓手機(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。