获取系统当前打开的端口(tcp。udp)状态,以及连接方的ip。端口[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 newspoint 的 blog

简捷实用的防黑手段


康帕斯(中国)国际信息服务有限公司 马文骞
01-7-6 下午 02:00:55


当我们担心被黑客攻击或怀疑电脑被植入木马时,我们往往求助于防火墙。其实,避免用宰牛刀的手段有很多,本文即通过实时监控全部 tcp连接的方法来实现防黑。
一、监控 tcp连接
黑客程序或木马程序的本质是实现数据传输。tcp和udp(用户数据文报协议)是两个最常用的数据传输协议,它们都使用设置监听端口的方法来完成数据传输。
实时监控所有端口的连接情况、及时对异常连接发出警告并提示用户删除异常连接,就可以有效地达到防黑目的。
使用微软的ip助手库函数(iphlpapi.dll)是一个捷径。其中的 gettcptable函数能返回当前系统中全部有效的 tcp连接。其定义为:
dword gettcptable(
pmib_tcptable ptcptable, // buffer for the connection table
pdword pdwsize, // size of the buffer
bool border // sort the table?
);
其中参数一是 tcp连接表缓冲区的指针,参数二是缓冲区大小(当缓冲区不够大时,该参数返回实际需要的大小),参数三指示连接表是否需要按“local ip”、“localport”、“remote ip”、“remote port”依次进行排序。
对于监控 udp连接表,可使用 getudptable函数完成。由于在使用上完全类似,这里略去讨论(后面的实例程序中也相应地略去了对 udp的监控)。
二、异常警告及删除连接
通过定时比较前后两个 tcp连接表,我们可以立即发现异常并发出警告。后面的实例程序用声音和报警标志提醒用户注意可能的外界入侵。
收到警告信号后,我们应首先将可疑连接删除掉,然后再仔细查找系统中是否有安全漏洞或有可疑进程在工作。ip助手库函数中的 settcpentry函数可以帮助我们删除可疑连接。其定义为:
dword settcpentry(
pmib_tcprow ptcprow // pointer to struct. with new state info
);
在调用此函数之前,应将欲删连接的状态置为 mib_tcp_state_delete_tcb(删除)。mib_tcp_state_delete_tcb也是目前唯一可在运行时设置的状态。
三、实例程序及其运行情况
下面的三幅示意图分别展示了:(1) 系统被攻击前的状况,(2) 系统被目前流行的“冰河”远程攻击软件入侵后而发出警告的状况,以及(3) 用户正在清除可疑连接时的状况。
下面是实例程序的完整代码:
' 黑客入侵监控程序(vb6)
option explicit
private type mib_tcprow ' tcp连接表中一行的结构
dwstate as long ' 状态
dwlocaladdr as long ' local ip
dwlocalport as long ' local port
dwremoteaddr as long ' remote ip
dwremoteport as long ' remote port
end type
private type mib_tcptable
dwnum_of_entries as long ' 当前 tcp连接的总数
tcp_table(120) as mib_tcprow ' 预留了120行的缓冲区
end type
private declare function gettcptable lib "iphlpapi.dll" (byref ptcptable _
as mib_tcptable, byref pdwsize as long, byval border as long) as long
private declare sub copymemory lib "kernel32" alias "rtlmovememory" (byref _
pdest as any, byref psource as any, byval length as long)
private declare function sndplaysound lib "winmm.dll" alias "sndplaysounda" _
(byval lpszsoundname as string, byval uflags as long) as long
private declare function getwindowsdirectory lib "kernel32" alias _
"getwindowsdirectorya" (byval lpbuffer as string, byval nsize as long) as long
private declare function settcpentry lib "iphlpapi.dll" (byref ptcptable _
as mib_tcprow) as long
dim last_num_of_entries as long
dim tcp1 as mib_tcptable
private sub form_load()
timer1.interval = 10000 ' 定时监控
timer1_timer
end sub
private sub timer1_timer()
dim return1 as long, i as long, tmp1 as long, tmp2 as long
dim ip_buf(1 to 4) as byte
dim win_path as string, tmp3 as string
return1 = gettcptable(tcp1, len(tcp1), 1) ' 返回 tcp连接表
if last_num_of_entries <> 0 and _
last_num_of_entries <> tcp1.dwnum_of_entries then ' 有异常时发出警告
picture1.visible = true ' 设置警告标志
on error resume next
win_path = string(145, 0)
i = getwindowsdirectory(win_path, 145)
win_path = left(win_path, i)
i = sndplaysound(win_path + "\media\ding.wav", &h1) ' 发出报警声音
on error goto 0
else

本文关键:tcp udp 端口
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top