反编译简单分析metasploit生成的安卓木马

5 分钟

前言

最近微信看到了篇apk反编译的文章,于是就想着反编译下安卓木马看看能不能分析下meterpreter的原理。

一、APK反编译流程

1、工具

APK反编译需要三个工具,apktool用于资源文件获取,dex2jar用于源码获取,jd-gui用于查看源码,下载链接如下:

  1. apktool:APKtool下载
  2. dex2jar:dex2jar下载
  3. jd-gui下载:jd-gui下载

    2、使用

  4. 在有java环境的前提下,建apktool.bat文件,文件内的代码如下:
@echo off setlocal set BASENAME=apktool_ chcp 65001 2>nul >nul set java_exe=java.exe if defined JAVA_HOME ( set java_exe="%JAVA_HOME%\bin\java.exe" ) rem Find the highest version .jar available in the same directory as the script setlocal EnableDelayedExpansion pushd "%~dp0" if exist apktool.jar ( set BASENAME=apktool goto skipversioned ) set max=0 for /f "tokens=1 delims=-_.0" %%A in ('dir /b /a-d %BASENAME%.jar') do if %%~B gtr !max! set max=%%~nB :skipversioned popd setlocal DisableDelayedExpansion rem Find out if the commandline is a parameterless .jar or directory, for fast unpack/repack if "%~1"=="" goto load if not "%~2"=="" goto load set ATTR=%~a1 if "%ATTR:~0,1%"=="d" ( rem Directory, rebuild set fastCommand=b ) if "%ATTR:~0,1%"=="-" if "%~x1"==".apk" ( rem APK file, unpack set fastCommand=d ) :load %java_exe% -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0%BASENAME%%max%.jar" %fastCommand% %* rem Pause when ran non interactively for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" pause
  1. 用cmd执行命令apktool.bar d -f test.apk test,将test.apk改成test.zip,解压
    在这里插入图片描述
  2. 进入dex-tools的目录内,将classes.dex拖入,然后执行代码d2j-dex2jar.bat classes.dex,获取jar包
    在这里插入图片描述
  3. 使用jd-gui打开反编译的jar文件即可
    在这里插入图片描述

    二、简单分析

  4. 从MainActivity为入口,进入MainService的 startService方法。
    在这里插入图片描述
  5. MainActivity的startService方法中使用Intent()跳转到MainService启动MainService方法。
    在这里插入图片描述
  6. 通过MainService的onStartCommand正式进入payload。
    在这里插入图片描述
  7. payload的start方法首先调用了自身的startInPath方法,传入了当前文件目录的路径。
    在这里插入图片描述
  8. startInpath方法中写了I,J,S,B的解密静态方法,重点是新创建了一个e类,启用了e类的多线程run方法。
    在这里插入图片描述
  9. e类中的run方法调用了payload中的主方法main()
    在这里插入图片描述
  10. main方法似乎比较复杂,自己不是很看得懂,不过从a类不难看出,a类应该是ip和端口,利用URLConnection连接,往header头添加User-Agent等属性,以换行符和:分割等,并且不能为空。
    在这里插入图片描述
  11. 然后main()方法中应该是对a存储的ip:port进行解密还原赋值给str,然后判断str的协议类型进而执行不同的过程,分为tcp和https。
    在这里插入图片描述
    在这里插入图片描述
  12. 一般会使用reverse_tcp的反向shell,执行tcp的过程,而https显然需要SSL证书,这里与f类密切相关,f类指定协议类型是SSL,并设置了是否验证https证书。设置了SHA-1加密算法对数据进行加密,判断证书是否生效等。
    在这里插入图片描述
    在这里插入图片描述
  13. 无论是tcp还是https,最后都通过socket实例化了Input和Output流传入了h,并调用了payload中的a方法。
    在这里插入图片描述
  14. a方法首先定义了几个Object类,O1赋值为数组第一个值,O2使用随机数的方式拼接到O1后面,O3是O2拼接上.jar后缀,str1是O2拼接.dex后缀,str2经过a方法后返回paramDataInputStream的数据流并变为String,然后创建了新文件O3,而jar文件应该存储的是前面分析的当前私有目录。
    在这里插入图片描述
  15. 随后创建了Ouput流,并将paramDataInputStream的数据写入到.jar后缀的文件中,然后实例化了一个DexClassLoader赋值给localObject1并加载.jar后缀文件,最后启动localObject1中的start方法。
    在这里插入图片描述
  16. 也就是说整体流程就是

    1. 经过一堆参数后进入payload的main方法
    2. main方法对ip:port进行解密,然后判断https和tcp,最后都通过socket套接字连接控制
    3. 将套接字的Input和Output数据流传入a方法
    4. a方法在软件当前目录,将数据存储接收写入为jar文件
    5. 最后通过start方法调用jar文件

总结

也就是说,meterpreter的安卓木马是通过IO流来对jar文件进行执行,通过动态执行jar中的代码对靶机进行控制。java基础比较差,分析的不是很到位。

~  ~  The   End  ~  ~


 赏 
承蒙厚爱,倍感珍贵,我会继续努力哒!
logo图像
tips
(*) 7 + 6 =
快来做第一个评论的人吧~