反编译简单分析metasploit生成的安卓木马
5 分钟
前言
最近微信看到了篇apk反编译的文章,于是就想着反编译下安卓木马看看能不能分析下meterpreter的原理。
一、APK反编译流程
1、工具
APK反编译需要三个工具,apktool用于资源文件获取,dex2jar用于源码获取,jd-gui用于查看源码,下载链接如下:
@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
- 用cmd执行命令apktool.bar d -f test.apk test,将test.apk改成test.zip,解压
- 进入dex-tools的目录内,将classes.dex拖入,然后执行代码d2j-dex2jar.bat classes.dex,获取jar包
使用jd-gui打开反编译的jar文件即可
二、简单分析
- 从MainActivity为入口,进入MainService的 startService方法。
- MainActivity的startService方法中使用Intent()跳转到MainService启动MainService方法。
- 通过MainService的onStartCommand正式进入payload。
- payload的start方法首先调用了自身的startInPath方法,传入了当前文件目录的路径。
- startInpath方法中写了I,J,S,B的解密静态方法,重点是新创建了一个e类,启用了e类的多线程run方法。
- e类中的run方法调用了payload中的主方法main()
- main方法似乎比较复杂,自己不是很看得懂,不过从a类不难看出,a类应该是ip和端口,利用URLConnection连接,往header头添加User-Agent等属性,以换行符和:分割等,并且不能为空。
- 然后main()方法中应该是对a存储的ip:port进行解密还原赋值给str,然后判断str的协议类型进而执行不同的过程,分为tcp和https。
- 一般会使用reverse_tcp的反向shell,执行tcp的过程,而https显然需要SSL证书,这里与f类密切相关,f类指定协议类型是SSL,并设置了是否验证https证书。设置了SHA-1加密算法对数据进行加密,判断证书是否生效等。
- 无论是tcp还是https,最后都通过socket实例化了Input和Output流传入了h,并调用了payload中的a方法。
- a方法首先定义了几个Object类,O1赋值为数组第一个值,O2使用随机数的方式拼接到O1后面,O3是O2拼接上.jar后缀,str1是O2拼接.dex后缀,str2经过a方法后返回paramDataInputStream的数据流并变为String,然后创建了新文件O3,而jar文件应该存储的是前面分析的当前私有目录。
- 随后创建了Ouput流,并将paramDataInputStream的数据写入到.jar后缀的文件中,然后实例化了一个DexClassLoader赋值给localObject1并加载.jar后缀文件,最后启动localObject1中的start方法。
也就是说整体流程就是
- 经过一堆参数后进入payload的main方法
- main方法对ip:port进行解密,然后判断https和tcp,最后都通过socket套接字连接控制
- 将套接字的Input和Output数据流传入a方法
- a方法在软件当前目录,将数据存储接收写入为jar文件
- 最后通过start方法调用jar文件
总结
也就是说,meterpreter的安卓木马是通过IO流来对jar文件进行执行,通过动态执行jar中的代码对靶机进行控制。java基础比较差,分析的不是很到位。
~ ~ The End ~ ~
分类标签:Web安全,Web安全
文章标题:反编译简单分析metasploit生成的安卓木马
文章链接:https://aiwin.fun/index.php/archives/2908/
最后编辑:2024 年 1 月 4 日 16:54 By Aiwin
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
文章标题:反编译简单分析metasploit生成的安卓木马
文章链接:https://aiwin.fun/index.php/archives/2908/
最后编辑:2024 年 1 月 4 日 16:54 By Aiwin
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)