大家好,我是無用掛件。在又一次咕咕咕了不到三個月后,某爆發性傳播的app成功地引起了我們的興趣,因而寫篇水文,以緬懷那些因此社會性死亡的烈士(滑稽)。
9月26日,一個名為“送給最好的ta”、大小為724.3KB的Android Package文件開始通過以QQ群為代表的社交平臺傳播,當晚交大淪陷;次日,C9高校全面淪陷,各大學均有中招,其中不乏在課堂、重要會議或人員密集的公開場所上點開該app者,輕則社會性死亡、重則招致處分,史稱“927事件”。該app在點開后會以無法減小的最高音量播放一段不雅音頻,解決方式只有從后臺關閉或重啟手機并卸載。
這種簡單的整蠱app,Symbian時代早已有之,Windows上也有相應版本,只是當時的傳播手段過于單一,沒有今天這樣高度活躍的社交平臺,因而影響沒有這次這么大。但是在其擴散開之后,社交平臺上興起的“盜取個人信息”、“不格式化設備無法徹底刪除”等種種流言,還有各路所謂“大神”似是而非的誘導性分析,更是在如今互聯網時代更加值得我們注意的。拿到樣本之后飯鳥和我都做了一些簡單的逆向,放在這里和大家一起交流。
思路一:行為層面的分析(反編譯式)
該app申請了讀寫存儲空間和完全的網絡訪問權限,所以我們可以從這兩個角度入手去分析。
把App拖進Jadx,我們發現了這么一個玩意(見圖1),對,這就是網傳的“連續截圖”。可以看到,com.nirene.screencapture類控制了這一行為。很顯然,這部分代碼是試圖持續模擬Power+Volume-鍵,以阻止用戶減小音量或鎖屏。但經測試,該段代碼并不成功,用戶依舊可以鎖屏或者減小音量,所以作者又設置了一種定時調節音量為最大的實現,其中調用了AccessbilityService。該app要求的Storage權限也正是保證模擬截圖行為的正常進行。
??我們再在反編譯出的代碼中指定http和socket關鍵詞進行搜索,見P2、P3。可以看到,僅com.androlua.Http、com.androlua.LuaServer、com.baidu.mobstat有涉及。前兩者為作者使用的AndroLua(一種基于LuaJava的Android實現)自帶的方法,最后一項是BaiduStats(百度統計),可能是作者想看看有多少人中招(沒這么無聊吧…)。不過,我分別使用PacketCapture、HttpCanary、Fiddler等工具嘗試去抓包,都未得到任何結果(也就是該軟件并不會聯網?)
思路二:真正的逆向操作
??我們不難發現,上面一種方法審計量過大且過于瑣碎,效率很低。直接使用ApkTool解包,我們在assets目錄下抓到了關鍵。對,作者實際上就寫了init.lua和main.lua,外帶上一段奇奇怪怪的聲音(0.mp3),然后在AndroLua框架作了編譯。(所以說會有人推出所謂的變種和新玩法,看到了吧,只是解包替換了0.mp3,然后簽名打包二次傳播而已)
??顯然,作者不想讓你看到他的代碼邏輯(作了二次混淆),所以逆向main.lua便成為入手點。回頭看Resources\lib\armeabi-v7a\libluajava.so,IDA打開,分析之后可以找到解密函數luaL_loadbufferx,直接拿來用。Dump出來之后main.lua是字節碼,這時就可以順利地使用unluac反編譯了。最終得到*.lua的Source File,整個app的程序邏輯就很清晰了,看得出來,很無聊吧…
?Reverse很輕松地結束了,但值得我們去警醒的是謠言和其籠罩下的群眾性行為。互聯網時代,做個獨立而理智的人,能去清醒地自我思考,至關重要。
本文首發于淀粉月刊:https://dfkan.com
本文作者:無用掛件