pPerfInst->NameOffset);
if(!stricmp((LPCTSTR)bstrProcessName,(LPCTSTR)bstrInput)) {
//获得所有计数器
for(j=0;j
if(pCurCntr->CounterNameTitleIndex==PROC_ID_COUNTER) {
PtrToCntr=CounterBlock(pPerfInst);
DWORD*pdwValue=(DWORD*)((LPBYTE)PtrToCntr+ pCurCntr->CounterOffset);
SetOfPID.push_back(*pdwValue); break; }
//获得下一个计数器
pCurCntr=NextCounter(pCurCntr); } }
//得到下一个实例
pPerfInst=NextInstance(pPerfInst); } }
free(pPerfData);
RegCloseKey(HKEY_PERFORMANCE_DATA); }
intmain(intargc,char*argv[]) {
std::vector
GetProcessID(\
if(SetOfPID.empty())//Processisnotrunning {
MessageBox(NULL,\MB_OK); }
else//Processisrunning {
for(inti=0;i charszText[256]; sprintf(szText,\MessageBox(NULL,szText,\ HANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,SetOfPID[i]); //somecode... KillProcess(hProcess); CloseHandle(hProcess); } } return0; } boolKillProcess(INconstHANDLEhProcess) { DWORDdwId; EnumWindows((WNDENUMPROC)TerminateAppEnum,(LPARAM)dwId); if(WaitForSingleObject(hProcess,5000)!=WAIT_OBJECT_0) bResult=TerminateProcess(hProcess,0); else bResult=TRUE; CloseHandle(hProcess); returnbResult==TRUE; } //窗口枚举函数,通过调用GetWindowThreadProcessId得到与该窗口句柄相关的进程标 识,将这个标识和要处理的进程一致,就向该窗口发送WM_CLOSE消息,关闭窗口。直至关 闭所有与该进程相关的窗口,然后调用TerminateProcess该进程。 staticBOOLCALLBACKTerminateAppEnum(HWNDhwnd, LPARAMlParam) { DWORDdwID; GetWindowThreadProcessId(hwnd,&dwID); if(dwID==(DWORD)lParam) { PostMessage(hwnd,WM_CLOSE,0,0); } returnTRUE; } 3.6进程与端口 木马程序进入系统后,它往往会创建一个进程,这个进程会使用一个TCP端口或 者UDP端口进行侦听,接受外来客户端连接。主动外连木马程序则会主动去连接外面 主机的侦听端口。木马的危害是显而易见的,它允许远程机器以系统管理员身份接管 本机系统,会给用户系统数据带来致命威胁。 木马入侵系统后会自动采用TCP协议或者UDP协议打开一个端口进行侦听。这 一特征可以作为判断系统是否感染木马的一种重要标志。为了获得系统的端口状态信 息,人们习惯会使用netstat命令,使用an参数,查看本机网络状态信息。如图3-4 所示。 使用netstat命令可以查看TCP和UDP侦听的端口,已经建立连接的TCP端口等 信息。然而这个命令无法识别这个端口是哪个进程打开的。另外还有一个免费的共享软 件fport,这个软件能够在WindowsNT以上的操作系统上显示进程关联的端口状态信息。 C:\\>fport FPortv2.0-TCP/IPProcesstoPortMapper Copyright2000byFoundstone,Inc. http://www.foundstone.com PidProcessPortProtoPath 496svchost->135TCPC:\\WINNT\\system32\\svchost.exe 8System->445TCP 596msdtc->1025TCPC:\\WINNT\\system32\\msdtc.exe 712DSRSvc->1027TCPC:\\Program Files\\Compuware\\DriverStudio\\Com mon\\Bin\\DSRSvc.exe 8System->1029TCP 596msdtc->3372TCPC:\\WINNT\\system32\\msdtc.exe 496svchost->135UDPC:\\WINNT\\system32\\svchost.exe 8System->445UDP 712DSRSvc->1026UDPC:\\Program Files\\Compuware\\DriverStudio\\Com mon\\Bin\\DSRSvc.exe 712DSRSvc->1028UDPC:\\Program Files\\Compuware\\DriverStudio\\Com mon\\Bin\\DSRSvc.exe 712DSRSvc->1048UDPC:\\Program Files\\Compuware\\DriverStudio\\Com mon\\Bin\\DSRSvc.exe 712DSRSvc->9108UDPC:\\Program Files\\Compuware\\DriverStudio\\Com mon\\Bin\\DSRSvc.exe 712DSRSvc->9110UDPC:\\Program Files\\Compuware\\DriverStudio\\Com mon\\Bin\\DSRSvc.exe 712DSRSvc->17491UDPC:\\Program Files\\Compuware\\DriverStudio\\Com mon\\Bin\\DSRSvc.exe 在WindowsXP以上的操作系统,包括Windows2003上获得上述信息是比较容易 的,所有基于NT的系统都提供了一个名称为iphlpapi.dll的动态链接库。在XP以上版 本,这个库比较特殊,它输出了一对API函数,AllocateAndGetTcpExTableFromStack 和AllocateAndGetUdpExTableFromStack函数。相对于AllocateAndGetTcpTableFromStack 和AllocateAndGetUdpTableFromStack函数,这两个函数输出更加详尽的信息。这些信 息除了端口、地址信息、状态之外,还包含了用户最关心的关联进程标识。通过这个 标识,可以借助于前面几节的内容得到进程名称及完整路径。由于这两个函数在静态 库文件中没有包含,所以用户必须采用动态加载的方法。 例3-7进程和端口的映射信息获得(对于WindowsXP以下系统无法获得进程信息)。 #include #pragmacomment(lib,\#defineHOSTNAMELEN256 #definePORTNAMELEN256 程序书第3章进程员库#defineADDRESSLENHOSTNAMELEN+PORTNAMELEN //结构定义 typedefstructtagMIB_TCPEXROW{ DWORDdwState;//TCP连接状态 DWORDdwLocalAddr;//本地IP地址 DWORDdwLocalPort;//打开的本地端口 DWORDdwRemoteAddr;//远程IP地址 DWORDdwRemotePort;//远程端口号 DWORDdwProcessId;//进程标识 }MIB_TCPEXROW,*PMIB_TCPEXROW; typedefstructtagMIB_TCPEXTABLE{ DWORDdwNumEntries; MIB_TCPEXROWtable[ANY_SIZE]; }MIB_TCPEXTABLE,*PMIB_TCPEXTABLE; typedefstructtagMIB_UDPEXROW{ DWORDdwLocalAddr;//本地IP地址 DWORDdwLocalPort;//打开的本地端口 DWORDdwProcessId;//进程标识 }MIB_UDPEXROW,*PMIB_UDPEXROW; typedefstructtagMIB_UDPEXTABLE{ DWORDdwNumEntries;

