获取系统当前打开的端口(tcp。udp)状态,以及连接方的ip。端口[1]
[入库:2005年8月18日] [更新:2007年3月24日]
简捷实用的防黑手段 康帕斯(中国)国际信息服务有限公司 马文骞 |
01-7-6 下午 02:00:55
|
| 当我们担心被黑客攻击或怀疑电脑被植入木马时,我们往往求助于防火墙。其实,避免用宰牛刀的手段有很多,本文即通过实时监控全部 tcp连接的方法来实现防黑。 |
| 黑客程序或木马程序的本质是实现数据传输。tcp和udp(用户数据文报协议)是两个最常用的数据传输协议,它们都使用设置监听端口的方法来完成数据传输。 |
| 实时监控所有端口的连接情况、及时对异常连接发出警告并提示用户删除异常连接,就可以有效地达到防黑目的。 |
| 使用微软的ip助手库函数(iphlpapi.dll)是一个捷径。其中的 gettcptable函数能返回当前系统中全部有效的 tcp连接。其定义为: |
| 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函数可以帮助我们删除可疑连接。其定义为: |
| pmib_tcprow ptcprow // pointer to struct. with new state info |
| 在调用此函数之前,应将欲删连接的状态置为 mib_tcp_state_delete_tcb(删除)。mib_tcp_state_delete_tcb也是目前唯一可在运行时设置的状态。 |
| 下面的三幅示意图分别展示了:(1) 系统被攻击前的状况,(2) 系统被目前流行的“冰河”远程攻击软件入侵后而发出警告的状况,以及(3) 用户正在清除可疑连接时的状况。 |
| private type mib_tcprow ' tcp连接表中一行的结构 |
| dwlocaladdr as long ' local ip |
| dwlocalport as long ' local port |
| dwremoteaddr as long ' remote ip |
| dwremoteport as long ' remote port |
| private type mib_tcptable |
| dwnum_of_entries as long ' 当前 tcp连接的总数 |
| tcp_table(120) as mib_tcprow ' 预留了120行的缓冲区 |
| 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 _ |
| dim last_num_of_entries as long |
| timer1.interval = 10000 ' 定时监控 |
| 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 ' 设置警告标志 |
| win_path = string(145, 0) |
| i = getwindowsdirectory(win_path, 145) |
| win_path = left(win_path, i) |
| i = sndplaysound(win_path + "\media\ding.wav", &h1) ' 发出报警声音 |
本文关键:tcp udp 端口
本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)