今天早上刚到实验室,就被老板叫了过去,要让我实现一个获取主机tcp连接的小程序,程序输出的内容就是进程名称,开放端口信息,远程ip和端口,并要定期扫描,输出,程序要能够在xp、vista、win7上都能运行。老板说完,我甚是高兴,因为,在此之前,就打算写一个流量监控的小工具,一直没有动手,正好趁着这次机会,将流量监控的程序开发出来。
要实现主机的tcp连接信息,就要用到微软未公开的一个函数AllocateAndGetTcpExTableFromStack,这个函数实现在iphlpapi.dll,网上这方面的资料很多,这里不作详细介绍,看实现代码吧:
HMODULE hModule;
hModule = LoadLibrary(_T("iphlpapi.dll"));
if (hModule == NULL)
return;
// XP and later
lpfnAllocateAndGetTcpExTableFromStack = (PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)GetProcAddress(hModule,"AllocateAndGetTcpExTableFromStack");
if (lpfnAllocateAndGetTcpExTableFromStack != NULL)
{
dwLastError = lpfnAllocateAndGetTcpExTableFromStack(&lpBuffer,TRUE,GetProcessHeap(),0,2);
for (dwSize = 0; dwSize < lpBuffer->dwNumEntries; dwSize++)
{
..............
//这里对每一个tcp连接做相应处理
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,lpBuffer->table[dwSize].dwProcessId);
GetModuleBaseName(hProcess,NULL,proname,MAX_PATH);//根据pid获得进程名称
wcstombs( pname, proname, 50 );
..........
}
}
|
以上只是xp版本的,在vista和win7下,在获取AllocateAndGetTcpExTableFromStack时就会出错。这里要用到iphlpapi.dll中的另外一个函数:InternalGetTcpTable2。详细实现如下:
//for vista and win 7
{
PMIB_TCPEXTABLE_VISTA pTcpTable_Vista;
_InternalGetTcpTable2 pGetTcpTable = (_InternalGetTcpTable2)GetProcAddress(hModule,"InternalGetTcpTable2");
if (pGetTcpTable == NULL)
return;
if (pGetTcpTable(&pTcpTable_Vista,GetProcessHeap(),1))
return;
for (UINT i=0;i<pTcpTable_Vista->dwNumEntries;i++)
{
..............
//这里对每一个tcp连接做相应处理
//获取程序名称
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pTcpTable_Vista->table[i].dwProcessId);
GetModuleBaseName(hProcess,NULL,proname,MAX_PATH);
....................
}
|
我们可以将这两个版本合并到一个程序中去,这样编译出的程序就是windows平台无关了,下面是程序源代码,我只将核心的部分保留,其他的代码都删了。
|
文件:
|
tcp_monitor.rar
|
大小:
|
2KB
|
下载:
|
下载
|
|