最近,很想在安卓手机上玩一下端口扫描器。再者,之前没有写过能运行于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("a",e.getMessage());
}
其中IP为要扫描的IP,PORT为要扫描的端口,timeout为等待建立连接的超时时间。这里用到了handler来实现不同线程之间的消息传递,这里传递的是端口信息。后文测试的端口扫描器就是用这种方法实现的。
安卓平台端口扫描器测试
为了方便测试,首先搭建了局域网的测试环境,让我的笔记本电脑和手机处在同一无线局域网内,然后查看笔记本的IP地址,如图1所示。
在得知笔记本IP地址(192.168.137,.21)后,就可以用端口扫描器来扫描这个IP地址进行测试了,但首先我们先看看本机开放了哪些端口,如图2所示。
我已经把端口扫描器安装在我的Android系统的手机上了,打开端口扫描器,如图3所示。
由图3可以看到,扫描器的界面中有IP地址输入框和扫描端口的范围输入框。输入IP地址为132.168.137.21。为了测试,端口范围可以填入100到150,点击扫描按钮即可,测试结果如图4所示。
www.weixianmanbu.com/article/163.html
由图我们可以看到,在端口100到150范围内,被测笔记本电脑中有135和139这两个端口开放,和图2信息正好匹配。通过测试,该端口扫描器可以实现对给定的IP地址、指定范围的端口进行扫描。