探索黑客技术攻防,实战研究与安全创新

导航菜单

Android系统端口扫描器编写初探

最近,很想在安卓手机上玩一下端口扫描器。再者,之前没有写过能运行于Android系统的端口扫描器,于是想写一个出来。

扫描器原理及安卓平台上实现方式简析我们知道端口有两种,UDP和TCP。入侵者如果想要探测目标机开放了哪些端口、提供了哪些服务,就需要先与目标端口建立连接。如果目标主机端口有回复,则说明该端口开放,即为活动端口,所以如果我们想实现能运行于安卓系统的端口扫描器,可以从以下两个思路入手。

1)基于UDP扫描实现

UDP扫描可通过发送没有携带任何数据的UDP数据包到目标主机,如果某服务响应一个UDP报文,则表明该端口是开放的。我们可以利用这个类:DatagramPacket实现,这个类代表通过DatagramSocket发送或接收的数据报包。它包含很多信息,比如源主机和目标主机的信息等。用法如下:

DatagramPacket(byte[]data,intoffset,intlength,InetAddresshost,intaPort)。

构造一个新的DatagramPacket对象,将数据发送到参数host指定主机上的aPort端口。然后再构造DatagramChannel对象,DatagramChannel是一个能收发UDP包的通道,因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。有了这个通道就可以发送和接收数据了。核心代码如下:


DatagramChannelchannel=DatagramChannel.open();
连接的套接字通道到远程地址:
localDatagramChannel.connect(newInetSocketAddress(ip,port));
localDatagramChannel.configureBlocking(true);
设置超时时间,通过这个通道发送一个数据:
localDatagramSocket.setSoTimeout(5000);
localDatagramSocket.send();
DatagramPacket
l=
new
DatagramPacket(arrayOfByte,
arrayOfByte.length);
localDatagramSocket.receive(l);
……


2)基于TCP扫描的实现

操作系统提供的connect()系统调用,可用来与每一个目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有开放。

核心代码如下:


try{
Socketsocket=newSocket();
SocketAddresssocketAddress=newInetSocketAddress(IP,PORT);
socket.connect(socketAddress,timeout);
handler.sendEmptyMessage(i);
socket.close();
}catch(Exceptione){
Log.e(,e.getMessage());
}


其中IP为要扫描的IP,PORT为要扫描的端口,timeout为等待建立连接的超时时间。这里用到了handler来实现不同线程之间的消息传递,这里传递的是端口信息。后文测试的端口扫描器就是用这种方法实现的。

安卓平台端口扫描器测试

为了方便测试,首先搭建了局域网的测试环境,让我的笔记本电脑和手机处在同一无线局域网内,然后查看笔记本的IP地址,如图1所示。

D4.png

在得知笔记本IP地址(192.168.137,.21)后,就可以用端口扫描器来扫描这个IP地址进行测试了,但首先我们先看看本机开放了哪些端口,如图2所示。

D5.png

我已经把端口扫描器安装在我的Android系统的手机上了,打开端口扫描器,如图3所示。

D6.png

由图3可以看到,扫描器的界面中有IP地址输入框和扫描端口的范围输入框。输入IP地址为132.168.137.21。为了测试,端口范围可以填入100到150,点击扫描按钮即可,测试结果如图4所示。

D7.png

由图我们可以看到,在端口100到150范围内,被测笔记本电脑中有135和139这两个端口开放,和图2信息正好匹配。通过测试,该端口扫描器可以实现对给定的IP地址、指定范围的端口进行扫描。

(完)

本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。