基于linux系统的扫描已经开通端口源代码
看看以下命定对您有没有什么帮助!
系统
# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
1,processor 会从0开始记数 继续下去多个cpu
2,flags 如果有 ht 说明支持超线程技术
3,判断物理CPU的个数可以查看physical id 的值,相同则为同一个物理 CPU。
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量
资源
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
ll -h /proc/kcore 查看内存的大小
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载
磁盘和分区
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况
ls -lR|grep "^-"|wc -l 查看目录下面文件个数
du --max-depth=1 -h 用du 命令查看个目录大小
网络
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息
进程
# ps -ef # 查看所有进程
# top # 实时显示进程状态
用户
# w # 查看活动用户
# id # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务
服务
# chkconfig --list # 列出所有系统服务
# chkconfig --list | grep on # 列出所有启动的系统服务
程序
# rpm -qa # 查看所有安装的软件包
求IP端口扫描器的VB源码
'4个TEXTBOX控件,2个COMMANDBUTTON控件,一个WINSOCK控件
Dim portnum As Long
Dim start As String
Sub scanningports()
Dim porttwo As Long
portnum = Text1.Text
porttwo = Text2.Text
Command2.Enabled = True
On Error GoTo viriio
Do
portnum = portnum + 1
DoEvents
If start = True Then
'关闭当前WINSOCK
Winsock1.Close
'防止系统冻结
DoEvents
Winsock1.LocalPort = portnum
DoEvents
Text3.Text = portnum
Winsock1.Listen
DoEvents
Else
portnum = 0
Command1.Enabled = True
Text1.Locked = False
Text2.Locked = False
Exit Sub
End If
Winsock1.Close
DoEvents
Loop Until portnum = porttwo
portnum = 0
Command1.Enabled = True
logport.Text = logport.Text vbCrLf "Scanning Ports Done!" vbCrLf
Text1.Locked = False
Text2.Locked = False
viriio:
If Err.Number = 10048 Then
logport.Text = logport.Text vbCrLf "端口" Winsock1.LocalPort " 开启中"
Resume Next
End If
End Sub
Private Sub Command1_Click()
Command2.Enabled = True
If Text1.Text = "" Then
MsgBox "你必须指定开始端口号!"
Exit Sub
End If
If Text2.Text = "" Then
MsgBox "你必须指定一个结束端口号"
Exit Sub
End If
Text1.Locked = True
Text2.Locked = True
Command1.Enabled = False
Winsock1.Close
start = True
Call scanningports
logport.Text = logport.Text vbCrLf "端口" Text1.Text "- " Text3.Text " 已经成功扫描!"
End Sub
Private Sub Command2_Click()
Command2.Enabled = False
start = False
End Sub
Asynchronous socket error 10061
服务器错误,
端口扫描的问题
在写端口扫描时 ,如果与某主机特定端口无法通信 ,
就此主机而言 ,我想应该有以下两种情况 :
1 。此地址上无任何主机存在
2 。有主机但被扫描的特定端口不存在 ( 也可能是被 firewall 过滤了 )
如何得知某端口一打开
给你来个简单的吧!
procedure TForm1.Timer1Timer(Sender: TObject);
var
I : integer;
begin
Memo1.Clear;
for I := 0 to 1000 do begin
ServerSocket1.Close;
ServerSocket1.Port := I;
try
ServerSocket1.Open;
except
Memo1.Lines.Add(IntToStr(I) + ' 端口被打开 !');
end;
end;
end;
对不起 ,我指的是别人机器上的 PORT
你是说 PORT 只能被一个程序打开么 ?
可是 ,我用 OICQ 时在打开 4000 没问题呀
我把上面的程序改了一下 ,也可以用的。你就去试图连接对方 ,如果通了 ,说明此端口被打
开。
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(' 端口 '+IntToStr(Socket.RemotePort)+' 被打开! ');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ClientSocket1.Close;
ClientSocket1.Port := PortID;
try
ClientSocket1.Open;
except
end;
Inc(PortID);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PortID := 1;
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
try
ClientSocket1.Close;
except
end;
Memo2.Lines.add(IntToStr(Socket.remotePort));
end;
吕雪松你的方法我试过了可是抱错 :asynchronous socket error 10061
--------------------------------------------------------------------------------
来自 :xueminliu 时间 :01-3-3 17:26:47 ID:464312
要区分 tcp 和 udp
oicq 用 udp 协议 ,connect 没有用 ,但是 tcp 可以这样
另外 ,如果你写扫描程序可千万不要这样 ,应该使用别的链接方法 ,否则你的踪迹会被别人
发现 .例如使用 sys 扫描或者 fin 扫描 :
我给你异步 socket 的 api 代码 :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,WInSock, ExtCtrls;
const WM_SOCKET=WM_USER+1; //socket 消息
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Panel1: TPanel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
Sockhd : integer; //socket 句柄
Serv_Addr : Tsockaddr;// 目标地址
procedure SockEvent(var msg: Tmessage);message WM_SOCKET; // 处理 cocket 消息
procedure DspMsg(msg : string); // 显示信息
{ Private declarations }
public
{ Public declarations }
end;
Form1: TForm1;
implementation
{$R *.DFM}
function lookup_hostname(const hostname:string):longint; // 把域名转化成 IP 地址
var
RemoteHost : PHostEnt; (* no, don't free it! *)
ip_address: longint;
begin
ip_address:=-1;
try
if hostname='' then
begin (* no host given! *)
lookup_hostname:=ip_address;
EXIT;
end
else
begin
ip_address:=Winsock.Inet_Addr(PChar(hostname)); (* try a xxx.xxx.xxx.xx first *)
if ip_address=SOCKET_ERROR then begin
RemoteHost:=Winsock.GetHostByName(PChar(hostname));
if (RemoteHost=NIL) or (RemoteHost^.h_length=0) then
begin
lookup_hostname:=ip_address;
EXIT; (* host not found *)
end
else
ip_address:=longint(pointer(RemoteHost^.h_addr_list^)^);
end;
end;
except
ip_address:=-1;
end;
lookup_hostname:=ip_address;
end;
procedure TFOrm1.DspMsg(msg: string);
begin
memo1.Lines.Add(msg+'...');
if Memo1.Lines.Count200 then Memo1.Lines.Delete(0);
end;
procedure TForm1.SockEvent(var msg : tmessage); // 处理 socket 消息
begin
case msg.LParam of
FD_READ: begin // 标识可以读数据 ,当然肯定已经链接上了
dspmsg(' 可以读取数据 ');
//do what you want do
end;
FD_WRITE: begin
dspmsg(' 可以发送数据 ');
//do what you want do
end;
FD_ERROR: begin
dspmsg(' 发生错误 ');
// 如果你是客户端 ,则应该是连接不上 ,即端口没有开
end;
FD_CLOSE: Begin
dspmsg(' 服务器断开连接 ');
// 对方关闭连接
end;
FD_CONNECT: begin
dspmsg(' 连结上服务器 ');
// 表示对方端口开放
end;
FD_ACCEPT: begin
dspmsg(' 接收一个请求 ');
// 这个消息只有服务端可能出现
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var wsaData:TwsaData;
begin // 启动 winsock 动态链接库
if WSAStartup (makeword(2,2), wsaData)0 then begin
messagebox(application.handle,' 无法启动 winsock 动态连接库 !',' 警告 ',MB_OK or MB_APPLMODAL or MB_ICONWARNING);
Application.Terminate;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin // 关闭 dll
WSACleanup;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Sockhd := socket(AF_INET,SOCK_STREAM,0); // 创建 socket 句柄
if Sockhd0 then begin
messagebox(application.handle,' 无法创建句柄 !',' 警告 ',MB_OK or MB_APPLMODAL or MB_ICONWARNING);
exit;
end;
Serv_addr.sin_addr.s_addr:= lookup_hostname(edit1.Text); // 主机名
Serv_addr.sin_family := PF_INET;
Serv_addr.sin_port := htons(23); //any port you want to connect
if WSAAsyncSelect(Sockhd,Form1.handle,WM_SOCKET,FD_ACCEPT or FD_CONNECT or FD_CLOSE or FD_READ or FD_WRITE)=SOCKET_ERROR
then begin
messagebox(application.handle,' 无法创建句柄 !',' 警告 ',MB_OK or MB_APPLMODAL or MB_ICONWARNING);
exit;
end; // 异步 socket
connect(sockhd,serv_addr,sizeof(serv_addr)); // 连接 ,结果会在前面的处理函数处理
end;
end.
相信应该可以满足你的要求
请问如何编程区分这两种情况
最好详细一点喔 ( 我很笨的 )
如果在此地址上无主机存在 ,则发出的数据包得不到回应 ,应用程序会等待超时才
认为连接失败 ( 被 firewall 过滤时情况一样 ),若有主机但被扫描的特定端口不存在时 ,
该主机会发出目的端口不存在的应答
至于如何编程实现 ,应该可以由错误码来判断 ,在 OnError 事情中判定 ErrorCode 是多
小 ,再分别处理 ,ErrorCode 的详情参见 Help
这么高深的问题才 50 分 ,少了
端口扫描不是这么简单 ,否则大家都做
首先你扫描人家的端口会留下自己的痕迹 ,系统有日志可以察看
因此我们做端口扫描的的时候绝对不会直接连接别人 ,而是通过地层的接口编程
例如在 TCP 三次握手的第三次放弃 ,对方就不会有日志 ,这称为 sys 扫描
给对方端口发断开连接的请求称为 fin 扫描 .
通过这两种扫描方式都可以得知对方的端口是否开 ,而且不会留下痕迹 .
总之端口扫描里面有很多学问 ,不是这里可以说清除的
怎么做呀 ,如你所说的话好象要直接调用 socket api?
我现在首先关心的是我提出的问题 ,如何编程区分这两种情况 :
1 。此地址上无任何主机存在
2 。有主机但被扫描的特定端口不存在 ( 也可能是被 firewall 过滤了 )
还有 ,为什么我把 clientsocket 的 onread 里的 errorcode 设为 0 了 ,
还是常常会出现 delphi 自己的错误消息提示 ,象 10061,10057 什么的 ,
这好象是另外一种 error code,如能把它屏蔽我想就不会出现提示了 .
是吗?如果是 ,该怎么做呢。
最后 : 如果能给我一个多线程的端口扫描源码 ,我再给 100 分 ( 真的很穷啊 )
我找到了 help 里的有关说明 ( 是在索引中 Error TCP Event 里找到的 )
WinSock Error Codes
The following error codes apply to the WinSock ActiveX Controls.
Error Code Error Message
10004 The operation is canceled.
10013 The requested address is a broadcast address, but flag is not set.
10014 Invalid argument.
10022 Socket not bound, invalid address or listen is not invoked prior to accept.
10024 No more file descriptors are available, accept queue is empty.
10035 Socket is non-blocking and the specified operation will block.
10036 A blocking Winsock operation is in progress.
10037 The operation is completed. No blocking operation is in progress.
10038 The descriptor is not a socket.
10039 Destination address is required.
10040 The datagram is too large to fit into the buffer and is truncated.
10041 The specified port is the wrong type for this socket.
10042 Option unknown, or unsupported.
10043 The specified port is not supported.
10044 Socket type not supported in this address family.
10045 Socket is not a type that supports connection oriented service.
10047 Address Family is not supported.
10048 Address in use.
10049 Address is not available from the local machine.
10050 Network subsystem failed.
10051 The network cannot be reached from this host at this time.
10052 Connection has timed out when SO_KEEPALIVE is set.
10053 Connection is aborted due to timeout or other failure.
10054 The connection is reset by remote side.
10055 No buffer space is available.
10056 Socket is already connected.
10057 Socket is not connected.
10058 Socket has been shut down.
10060 The attempt to connect timed out.
10061 Connection is forcefully rejected.
10201 Socket already created for this object.
10202 Socket has not been created for this object.
11001 Authoritative answer: Host not found.
11002 Non-Authoritative answer: Host not found.
11003 Non-recoverable errors.
11004 Valid name, no data record of requested type.
我想只要对它进行有关操作就能完全屏蔽 winsocket 错误消息 ( 至少
能屏蔽很多 onerror 里的 errorcode 参数无法屏蔽的消息 )
我终于找到原因所在了
在打开 Socket 时也要捕获异常
try
ClientSocket.Open;
except
MessageBox(MainForm.Handle,'Error connecting to this address','Connect',MB_ICONEXCLAMATION);
end;
在 OnError 中最后要将 ErrorCode 置为 0
if ErrorEvent=eeConnect then
begin
Socket.Close;
MessageBox(MainForm.Handle,'Error connecting to this address','Connect',MB_ICONEXCLAMATION);
end
else if ErrorEvent=eeSend then
Socket.Close;
ErrorCode:=0;
你可能无做第一步
而这样也可以区分你所说的两种情况
1 。第二步 OnError 就是此地址上无任何主机存在 ,到超时就触发 OnError 事件
2 。第一步捕捉到异常就是有主机但被扫描的特定端口不存在
那里有端口扫描器的源代码程序
#include string.h
#include winsock.h
#include windows.h
#include iostream.h
#pragma comment (lib,"ws2_32.lib")
int main (int argc, char *argv[])
{
int iportFrom,iportTo;
int testsocket;
int iopenedport = 0;
struct sockaddr_in target_addr;
WSADATA wsaData;
WORD wVersionRequested=MAKEWORD(1,1);
if (argc = 3)
{
cout "使用格式 : " argv[0] " 主机IP地址 开始端口号 结束端口号\n" endl;
exit(1);
}
if (atoi (argv[2]) atoi (argv[3]))
{
cout "错误!开始端口号必须小于结束端口号" endl;
exit(1);
}
else
{
if (WSAStartup (wVersionRequested , wsaData) )
{
cout "连接socket库失败,请检查版本号是否为1.1\n" endl;
exit(1);
}
iportFrom=atoi (argv[2]);
iportTo=atoi (argv[3]);
for (int i=iportFrom; i = iportTo; i++)
{
cout "正在建立socket................................" endl;
if ((testsocket=socket (AF_INET,SOCK_STREAM,0) ) == INVALID_SOCKET)
{
cout "Socket建立失败!" endl;
exit(0);
}
target_addr.sin_family = AF_INET;
target_addr.sin_port = htons(i);
target_addr.sin_addr.s_addr = inet_addr (argv[1]);
cout "正在扫描端口:" i endl;
if (connect (testsocket, (struct sockaddr *) target_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)
cout "端口" i "关闭!" endl;
else
{
iopenedport++;
cout "端口" i "开放\n" endl;
}
}
cout "目标主机" argv[1] "从" iportFrom "--" iportTo "共有" iopenedport "个端口开放" endl;
closesocket (testsocket);
WSACleanup();
}
return 0;
}
vc6.0 下 编译
设计一个判断端口是否开启的扫描器程序的源代码怎么写?
for(int i=0;i6;i++)
{
for(int j=0;j10;j++)
{
theport[j].rmt_host=rmt_host;
theport[j].p=port[i*10+j];
theport[j].n=j;
Thread[j]=AfxBeginThread(pScan,(LPVOID)theport[j]);
//启动端口扫描线程
hThread[j]=Thread[j]-m_hThread;
Sleep(1);
}
WaitForMultipleObjects(10,hThread,TRUE,120000);
}
//扫描模块代码
SOCKET sockfd;
SOCKADDR_IN addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd 0)
{
exit(0);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(rmt_host);
int r = connect(sockfd,(struct sockaddr *) addr, sizeof(addr));
//尝试连接端口进行检测
closesocket(sockfd);
//连接返回值处理
if (r!=-1)
{
::PostMessage(hWnd,WM_DISPLAY,port,0);
}
//显示端口扫描结果
LONG CScanDlg::OnDisplay(LONG lParam, UINT wParam)
{
LPSERVENT bar;
CString open;
int p=lParam;
bar = getservbyport(htons(p),"tcp");
open.Format("\t%d号端口(%s)开放!\r\n",p,(bar == NULL) ? "未知" :
bar-s_name);
m_HistoryEdit.AppendString (open);
return 0;
}
fscan:一键自动化、全方位漏洞扫描的开源工具
fscan 是一个内网综合扫描工具,方便一键自动化、全方位漏洞扫描。
它支持主机存活探测、端口扫描、常见服务的爆破、ms17010、redis批量写公钥、计划任务反弹shell、读取win网卡信息、web指纹识别、web漏洞扫描、netbios探测、域控识别等功能。
源码链接:
1.信息搜集:
2.爆破功能:
3.系统信息、漏洞扫描:
4.Web探测功能:
5.漏洞利用:
6.其他功能:
简单用法
其他用法
编译命令
完整参数
这个项目的开发者参考的开源项目有这些:
0条大神的评论